df4ef37a1c
新增 project-development/export 全屏导出面板:目标大卡、等宽下划线 tab、小红书工作台分栏与第二 subscriber 会话。 面板状态提升到 usePanel 根,tab 页可卸载;输入草稿提升到面板层,切 tab 不丢字。 抽出 DirectProjectChatBox,主聊天与导出会话复用同一套对话盒,不再另写版式。 DirectProjectChatHeader 增加「导出」入口,App.tsx 条件挂载全屏面板。 DirectProjectComposer 增加 referencesEnabled 与 draft/onDraftChange,导出输入区关闭素材引用。 新增 tests/artifactsPanel.test.tsx 覆盖卡片、tab、关闭与对话盒复用。
72 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|