10bb7013e6
Return control after copying the original asset, then run image optimization and thumbnail generation in the background with IPC progress updates. Block duplicate preview uploads and scene creation while requests are in flight. Co-authored-by: Cursor <cursoragent@cursor.com>
29 lines
1.3 KiB
TypeScript
29 lines
1.3 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
void test('projectState: list/get after delete invalidates in-flight initial load (epoch guard)', () => {
|
|
const src = fs.readFileSync(path.join(here, 'projectState.ts'), 'utf8');
|
|
assert.match(src, /projectDataEpochRef/);
|
|
assert.match(src, /const epoch = \+\+projectDataEpochRef\.current/);
|
|
assert.match(src, /if \(projectDataEpochRef\.current !== epoch\) return/);
|
|
assert.match(
|
|
src,
|
|
/const deleteProject = async[\s\S]+?projectDataEpochRef\.current \+= 1[\s\S]+?await api\.invoke/,
|
|
);
|
|
assert.match(
|
|
src,
|
|
/const openProject = async[\s\S]+?openInFlightRef\.current[\s\S]+?projectDataEpochRef\.current \+= 1[\s\S]+?await api\.invoke/,
|
|
);
|
|
assert.match(src, /const refreshProjects = async \(\) => \{[\s\S]+?projectDataEpochRef\.current \+= 1/);
|
|
});
|
|
|
|
void test('ipc router: project.list does not require license', () => {
|
|
const routerSrc = fs.readFileSync(path.join(here, '..', '..', '..', 'main', 'ipc', 'router.ts'), 'utf8');
|
|
assert.match(routerSrc, /if \(channel === ipcChannels\.project\.list\) return false/);
|
|
});
|