914791d63c
保留已确认项目的独立状态 隔离项目检查代次和迟到结果 增加坏项目刷新回归测试并同步项目文档
94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
|
import { afterEach, expect, test, vi } from 'vitest';
|
|
|
|
import { useRecentProjects } from '../src/features/app-shell/useRecentProjects';
|
|
|
|
const READY_PROJECT = {
|
|
projectPath: '/tmp/ready-project',
|
|
exists: true,
|
|
isDirectory: true,
|
|
isGameCreatorProject: true,
|
|
isGodotProject: false,
|
|
godotProjectRoot: null,
|
|
isCocosProject: false,
|
|
cocosProjectRoot: null,
|
|
isUnityProject: false,
|
|
unityProjectRoot: null,
|
|
projectName: '正常项目',
|
|
recentRunStatus: null,
|
|
recentRunStopReason: null,
|
|
};
|
|
|
|
afterEach(() => {
|
|
delete window.__TAURI__;
|
|
window.localStorage.clear();
|
|
});
|
|
|
|
test('刷新坏项目时保留其它项目已确认的正常状态', async () => {
|
|
let finishPendingInspection: (() => void) | null = null;
|
|
const pendingInspection = new Promise<typeof READY_PROJECT>((resolve) => {
|
|
finishPendingInspection = () =>
|
|
resolve({
|
|
...READY_PROJECT,
|
|
projectPath: '/tmp/slow-broken-project',
|
|
projectName: '慢速坏项目',
|
|
});
|
|
});
|
|
const invoke = vi.fn(
|
|
async (command: string, args?: Record<string, unknown>) => {
|
|
if (command !== 'inspect_local_project_directory') {
|
|
throw new Error(`unexpected invoke ${command}`);
|
|
}
|
|
const projectPath = String(args?.projectPath ?? '');
|
|
if (projectPath === '/tmp/slow-broken-project') {
|
|
return pendingInspection;
|
|
}
|
|
return READY_PROJECT;
|
|
},
|
|
);
|
|
window.__TAURI__ = { core: { invoke } };
|
|
window.localStorage.setItem(
|
|
'genarrative-ai-game-creator.recent-workspaces.v1',
|
|
JSON.stringify(['/tmp/ready-project']),
|
|
);
|
|
|
|
const { result } = renderHook(() => useRecentProjects(vi.fn()));
|
|
await waitFor(() => {
|
|
expect(result.current.projectRows[0]).toMatchObject({
|
|
name: '正常项目',
|
|
status: '本地项目',
|
|
canOpen: true,
|
|
});
|
|
});
|
|
|
|
act(() => {
|
|
result.current.rememberRecentWorkspace('/tmp/slow-broken-project');
|
|
});
|
|
|
|
await waitFor(() => {
|
|
expect(result.current.projectRows).toHaveLength(2);
|
|
const readyRow = result.current.projectRows.find(
|
|
(row) => row.path === '/tmp/ready-project',
|
|
);
|
|
const slowRow = result.current.projectRows.find(
|
|
(row) => row.path === '/tmp/slow-broken-project',
|
|
);
|
|
expect(readyRow).toMatchObject({
|
|
name: '正常项目',
|
|
status: '本地项目',
|
|
canOpen: true,
|
|
});
|
|
expect(slowRow).toMatchObject({
|
|
name: 'slow-broken-project',
|
|
status: '检查中',
|
|
canOpen: false,
|
|
});
|
|
});
|
|
|
|
await act(async () => {
|
|
finishPendingInspection?.();
|
|
await pendingInspection;
|
|
});
|
|
});
|