Files
Genarrative/apps/ai-game-creator-shell/tests/artifactsPanel.test.tsx
T
k88936 df4ef37a1c 新增「导出到」全屏面板并复用 DirectProject 对话盒
新增 project-development/export 全屏导出面板:目标大卡、等宽下划线 tab、小红书工作台分栏与第二 subscriber 会话。

面板状态提升到 usePanel 根,tab 页可卸载;输入草稿提升到面板层,切 tab 不丢字。

抽出 DirectProjectChatBox,主聊天与导出会话复用同一套对话盒,不再另写版式。

DirectProjectChatHeader 增加「导出」入口,App.tsx 条件挂载全屏面板。

DirectProjectComposer 增加 referencesEnabled 与 draft/onDraftChange,导出输入区关闭素材引用。

新增 tests/artifactsPanel.test.tsx 覆盖卡片、tab、关闭与对话盒复用。
2026-10-05 11:49:32 +08:00

72 lines
2.5 KiB
TypeScript

// @vitest-environment jsdom
/**
* 导出产物面板:卡片 → tab 的入口形态与关闭出口。
*
* 面板状态(阶段 / 当前 tab)在面板根上,本用例只钉住「大卡进入 → 卡片收成 tab → 空 tab 页」
* 这条可见链路,不覆盖右侧 chatbox 的订阅行为。
*/
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import ArtifactsPanel from '../src/view/project-development/export';
afterEach(() => {
cleanup();
});
function renderPanel() {
const onClose = vi.fn();
render(
<ArtifactsPanel
projectPath={null}
ensureConversationReadAllowed={async () => true}
ensureConversationWriteAllowed={async () => true}
onClose={onClose}
/>,
);
return { onClose };
}
describe('导出产物面板', () => {
it('首屏用大卡片展示三个导出目标', () => {
renderPanel();
expect(screen.getByText('陶泥儿')).not.toBeNull();
expect(screen.getByText('小红书小工具')).not.toBeNull();
expect(screen.getByText('TapTap H5 小游戏')).not.toBeNull();
});
it('点进目标后卡片收成顶部 tab,切到空目标只换 tab 页', () => {
renderPanel();
fireEvent.click(screen.getByRole('button', { name: /陶泥儿/u }));
expect(screen.getByRole('tablist', { name: '导出目标' })).not.toBeNull();
expect(screen.getByText('陶泥儿导出页尚未接入')).not.toBeNull();
fireEvent.click(screen.getByRole('tab', { name: /TapTap H5 小游戏/u }));
expect(screen.getByText('TapTap H5 小游戏导出页尚未接入')).not.toBeNull();
});
it('小红书 tab 挂载的是主聊天同一个对话盒', () => {
renderPanel();
fireEvent.click(screen.getByRole('button', { name: /小红书小工具/u }));
const surface = document.querySelector(
'.game-workbench-chat .project-chat-surface.is-direct-codex',
);
expect(surface).not.toBeNull();
expect(surface?.getAttribute('aria-label')).toBe('小红书小工具导出对话');
// 对话盒里就是主聊天那套「顶栏 / 消息流 / 输入区」,不是另一份自造版式。
expect(surface?.querySelector('.project-chat-conversation')).not.toBeNull();
expect(surface?.querySelector('.project-chat-composer')).not.toBeNull();
});
it('关闭按钮把销毁交给壳层', () => {
const { onClose } = renderPanel();
fireEvent.click(screen.getByRole('button', { name: '关闭导出面板' }));
expect(onClose).toHaveBeenCalledTimes(1);
});
});