Files
Genarrative/apps/ai-game-creator-shell/tests/directProjectChatHeader.test.tsx
T
kdletters f1b282f3cd 合并 master 并接入 DirectProject 新聊天架构
- 合并 origin/master(304 个提交:DirectProject 聊天容器重构、Project Supervisor 退役、策划附件导入、CI 隔离编译缓存等)。
- 接受 master 对 ProjectSupervisorView / SupervisorChatOnlyView 的退役与预览快捷测试收敛;发布入口改由 DirectProject 聊天头承载。
- DirectProjectChatHeader 新增「发布到游戏广场」入口(无回调不渲染、回合忙态禁用),DirectProjectChatView 透传 onRequestGamePublish。
- App.tsx 继续由工作台壳持有试玩包导出与 GameDistributionPublishPanel,沿用 project.export_package 权限确认队列;check-config 把该命令从 native-only 清单移回 App invoke。
- 后台游戏审核 API / 类型 / 路由测试与 master 新增的 AGC 模板管理按双方保留合并,并修掉拼接造成的接口与用例闭合缺陷。
- 修正 master 自带的 viteProxyConfig 断言:/api/creation-entry 属退役路由,测试改为断言不进入代理。
- 记录合并踩坑:语法结构内部的冲突不能简单按「双方保留」拼接,必须按某一侧骨架重建并跑 tsc 与单文件测试。
- 验证:全量 vitest 393 文件 / 4374 用例通过,root / AGC / admin-web 三端 typecheck,cargo check 与游戏分发 Rust 测试,encoding、doc-index、rustfmt、SpacetimeDB schema guard。
2026-09-22 16:45:29 +08:00

60 lines
2.0 KiB
TypeScript

// @vitest-environment jsdom
/**
* DirectProject 聊天头的发布入口。
*
* 发布面板与试玩包导出由工作台壳持有,聊天头只负责在壳传入回调时渲染入口;
* 没有回调(例如策划聊天面)时不能出现点不动的按钮。
*/
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { DirectProjectChatHeader } from '../src/view/project-development/chat/components/DirectProjectChatHeader/DirectProjectChatHeader';
afterEach(() => {
cleanup();
});
function renderHeader(
overrides: Partial<Parameters<typeof DirectProjectChatHeader>[0]> = {},
) {
const onOpenSettings = vi.fn();
const onRequestGamePublish = vi.fn();
render(
<DirectProjectChatHeader
busy={false}
statusText="就绪"
onOpenSettings={onOpenSettings}
onRequestGamePublish={onRequestGamePublish}
{...overrides}
/>,
);
return { onOpenSettings, onRequestGamePublish };
}
describe('DirectProjectChatHeader', () => {
it('传入发布回调时渲染发布入口并可触发', () => {
const { onRequestGamePublish } = renderHeader();
const publish = screen.getByRole('button', { name: '发布到游戏广场' });
expect(publish).toHaveProperty('disabled', false);
fireEvent.click(publish);
expect(onRequestGamePublish).toHaveBeenCalledTimes(1);
});
it('没有发布回调时不渲染发布入口', () => {
renderHeader({ onRequestGamePublish: undefined });
expect(screen.queryByRole('button', { name: '发布到游戏广场' })).toBeNull();
expect(screen.getByRole('button', { name: '设置' })).not.toBeNull();
});
it('回合进行中禁用发布入口,避免与运行时抢占', () => {
const { onRequestGamePublish } = renderHeader({ busy: true });
const publish = screen.getByRole('button', { name: '发布到游戏广场' });
expect(publish).toHaveProperty('disabled', true);
fireEvent.click(publish);
expect(onRequestGamePublish).not.toHaveBeenCalled();
});
});