// @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[0]> = {}, ) { const onOpenSettings = vi.fn(); const onRequestGamePublish = vi.fn(); render( , ); 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(); }); });