恢复平台个人页并阻断旧业务回流
恢复创作、项目、我的平台侧栏与现役搜索 恢复全宽个人页及资料编辑、充值兑换、社区反馈和 API Key 入口 迁移平台资料、钱包和设置客户端并移除旧创作依赖 新增 Vite 与 ESLint 退役模块门禁并补齐界面和搜索测试 同步旧创作退役方案、平台入口决策与踩坑记录
This commit is contained in:
@@ -20,13 +20,53 @@ vi.mock('../auth/AuthUiContext', () => ({
|
||||
}));
|
||||
|
||||
vi.mock('../creation-home/CreationLandingView', () => ({
|
||||
CreationLandingView: () => (
|
||||
<main aria-label="陶泥儿创作主页">创作主页</main>
|
||||
CreationLandingView: ({
|
||||
onOpenProject,
|
||||
onOpenProjects,
|
||||
searchKeyword,
|
||||
}: {
|
||||
onOpenProject: (
|
||||
projectId: string,
|
||||
options?: { guide?: boolean; tool?: string },
|
||||
) => void;
|
||||
onOpenProjects: () => void;
|
||||
searchKeyword?: string;
|
||||
}) => (
|
||||
<main aria-label="陶泥儿创作主页" data-search={searchKeyword}>
|
||||
创作主页
|
||||
<button type="button" onClick={onOpenProjects}>
|
||||
查看项目
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() =>
|
||||
onOpenProject('tool-project', { tool: 'background-music' })
|
||||
}
|
||||
>
|
||||
打开音乐工具
|
||||
</button>
|
||||
</main>
|
||||
),
|
||||
}));
|
||||
|
||||
vi.mock('../project/ProjectGalleryView', () => ({
|
||||
ProjectGalleryView: () => <main aria-label="项目">项目</main>,
|
||||
ProjectGalleryView: ({
|
||||
onOpenProject,
|
||||
searchKeyword,
|
||||
}: {
|
||||
onOpenProject: (projectId: string, options?: { guide?: boolean }) => void;
|
||||
searchKeyword?: string;
|
||||
}) => (
|
||||
<main aria-label="项目" data-search={searchKeyword}>
|
||||
项目
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => onOpenProject('guide-project', { guide: true })}
|
||||
>
|
||||
打开引导项目
|
||||
</button>
|
||||
</main>
|
||||
),
|
||||
}));
|
||||
|
||||
vi.mock('../image-editor/ImageCanvasEditorView', () => ({
|
||||
@@ -101,6 +141,17 @@ describe('PlatformEntryActiveFlowShell', () => {
|
||||
within(topbar as HTMLElement).queryByRole('button', { name: '设置' }),
|
||||
).toBeNull();
|
||||
|
||||
fireEvent.change(
|
||||
screen.getByRole('searchbox', { name: '搜索项目和素材' }),
|
||||
{ target: { value: '角色' } },
|
||||
);
|
||||
fireEvent.click(screen.getByRole('button', { name: '搜索' }));
|
||||
expect(
|
||||
screen
|
||||
.getByRole('main', { name: '陶泥儿创作主页' })
|
||||
.getAttribute('data-search'),
|
||||
).toBe('角色');
|
||||
|
||||
fireEvent.click(within(navigation).getByRole('button', { name: '我的' }));
|
||||
|
||||
expect(await screen.findByRole('main', { name: '我的' })).toBeTruthy();
|
||||
@@ -112,4 +163,94 @@ describe('PlatformEntryActiveFlowShell', () => {
|
||||
.getAttribute('aria-current'),
|
||||
).toBe('page');
|
||||
});
|
||||
|
||||
it('switches between creation and projects and passes search to the active page', async () => {
|
||||
const setSelectionStage = vi.fn();
|
||||
const { rerender } = render(
|
||||
<PlatformEntryFlowShellImpl
|
||||
selectionStage="creation-home"
|
||||
setSelectionStage={setSelectionStage}
|
||||
/>,
|
||||
);
|
||||
|
||||
const navigation = await screen.findByRole('navigation', {
|
||||
name: '平台导航',
|
||||
});
|
||||
fireEvent.click(within(navigation).getByRole('button', { name: '项目' }));
|
||||
|
||||
expect(window.location.pathname).toBe('/project');
|
||||
expect(setSelectionStage).toHaveBeenCalledWith('project', {
|
||||
path: '/project',
|
||||
});
|
||||
|
||||
rerender(
|
||||
<PlatformEntryFlowShellImpl
|
||||
selectionStage="project"
|
||||
setSelectionStage={setSelectionStage}
|
||||
/>,
|
||||
);
|
||||
|
||||
const projectPage = await screen.findByRole('main', { name: '项目' });
|
||||
expect(
|
||||
within(navigation)
|
||||
.getByRole('button', { name: '项目' })
|
||||
.getAttribute('aria-current'),
|
||||
).toBe('page');
|
||||
expect(
|
||||
within(navigation)
|
||||
.getByRole('button', { name: '创作' })
|
||||
.getAttribute('aria-current'),
|
||||
).toBeNull();
|
||||
|
||||
fireEvent.change(
|
||||
screen.getByRole('searchbox', { name: '搜索项目和素材' }),
|
||||
{ target: { value: '场景' } },
|
||||
);
|
||||
fireEvent.click(screen.getByRole('button', { name: '搜索' }));
|
||||
expect(projectPage.getAttribute('data-search')).toBe('场景');
|
||||
|
||||
fireEvent.click(within(navigation).getByRole('button', { name: '创作' }));
|
||||
expect(window.location.pathname).toBe('/creation');
|
||||
expect(setSelectionStage).toHaveBeenCalledWith('creation-home', {
|
||||
path: '/creation',
|
||||
});
|
||||
});
|
||||
|
||||
it('keeps guide and tool intent in editor navigation URLs', async () => {
|
||||
const setSelectionStage = vi.fn();
|
||||
const { rerender } = render(
|
||||
<PlatformEntryFlowShellImpl
|
||||
selectionStage="project"
|
||||
setSelectionStage={setSelectionStage}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(
|
||||
await screen.findByRole('button', { name: '打开引导项目' }),
|
||||
);
|
||||
expect(`${window.location.pathname}${window.location.search}`).toBe(
|
||||
'/editor/canvas?projectid=guide-project&guide=toolbar',
|
||||
);
|
||||
expect(setSelectionStage).toHaveBeenCalledWith('image-editor', {
|
||||
path: '/editor/canvas?projectid=guide-project&guide=toolbar',
|
||||
});
|
||||
|
||||
window.history.replaceState(null, '', '/creation');
|
||||
setSelectionStage.mockClear();
|
||||
rerender(
|
||||
<PlatformEntryFlowShellImpl
|
||||
selectionStage="creation-home"
|
||||
setSelectionStage={setSelectionStage}
|
||||
/>,
|
||||
);
|
||||
fireEvent.click(
|
||||
await screen.findByRole('button', { name: '打开音乐工具' }),
|
||||
);
|
||||
expect(`${window.location.pathname}${window.location.search}`).toBe(
|
||||
'/editor/canvas?projectid=tool-project&tool=background-music',
|
||||
);
|
||||
expect(setSelectionStage).toHaveBeenCalledWith('image-editor', {
|
||||
path: '/editor/canvas?projectid=tool-project&tool=background-music',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user