Files
Genarrative/apps/ai-game-creator-shell/tests/ErrorReportDialog.test.tsx
T
kdletters 8701f43f75 AGC 渲染层网络与状态下沉 Rust,并修复画布交互与失败文案
- 删除渲染层传输层:services/clientApi.ts、clientHttp 的 fetchClientHttp 与超时封装整体退场,账户、认证、素材直传、错误上报与游戏分发发布改走 Rust typed command。
- 新增宿主封装:accountHost、editorAssetHost、platformSessionRetry、agentRuntimeErrorDetail 与 features/app-shell/workspacePreferences;渲染层不再读写 access token / refresh cookie,localStorage 只剩测试态旧键迁移 shim。
- 修复 DirectProject 失败文案 v2 映射与「查看详情」按需读取,画布标签面板高度夹紧、框选每帧重算、文档预览入口与场景标题栏 key、资源筛选面板样式。
- 补齐与调整回归:accountHost、agentRuntimeErrorDetail、clientAuthHost、clientHttp、platformSession、platformSessionRetry、resourceFilterPanelStyle、directThreadChatSubscription 等定向用例,并清理测试 harness 中无调用方的残留。
2026-09-28 14:15:02 +08:00

81 lines
2.6 KiB
TypeScript

/** @vitest-environment jsdom */
import { cleanup, render, screen } from '@testing-library/react';
import type { ReactNode } from 'react';
import { afterEach, describe, expect, it, vi } from 'vitest';
const mockState = vi.hoisted(() => ({
getPending: vi.fn(),
readLogs: vi.fn(),
}));
vi.mock('../src/services/errorReporting', () => ({
ackClientErrorEventsWithRetry: vi.fn(),
getPendingClientErrorEvents: mockState.getPending,
readApplicationDiagnosticLogs: mockState.readLogs,
submitErrorReportBatch: vi.fn(),
}));
vi.mock('../src/components/modal/ThemedModal', () => ({
ThemedModal: ({ open, children }: { open: boolean; children: ReactNode }) =>
open ? <div role="dialog">{children}</div> : null,
}));
import { ErrorReportDialog } from '../src/components/error-report/ErrorReportDialog';
const event = {
eventId: 'rust-error-1',
fingerprint: 'fingerprint-1',
source: 'test',
message: '打开面板时读取的错误',
occurredAt: '1',
count: 1,
};
describe('ErrorReportDialog', () => {
afterEach(() => {
cleanup();
mockState.getPending.mockReset();
mockState.readLogs.mockReset();
});
it('只在面板打开时读取最新错误快照', async () => {
mockState.getPending.mockResolvedValue([event]);
mockState.readLogs.mockResolvedValue([]);
const view = render(<ErrorReportDialog open={false} onClose={vi.fn()} />);
expect(mockState.getPending).not.toHaveBeenCalled();
view.rerender(<ErrorReportDialog open onClose={vi.fn()} />);
expect(await screen.findByText(event.message)).toBeTruthy();
expect(mockState.getPending).toHaveBeenCalledTimes(1);
});
it('读取错误事件失败时显示不可用状态而不是空列表', async () => {
mockState.getPending.mockRejectedValue(new Error('读取失败'));
mockState.readLogs.mockResolvedValue([]);
render(<ErrorReportDialog open onClose={vi.fn()} />);
expect(
await screen.findByText('错误事件暂不可用,请关闭后重试。'),
).toBeTruthy();
expect(screen.queryByText('当前没有待报告的错误。')).toBeNull();
});
it('最新快照读取失败时使用打开通知时的事件快照', async () => {
mockState.getPending.mockRejectedValue(new Error('瞬时读取失败'));
mockState.readLogs.mockResolvedValue([]);
render(
<ErrorReportDialog open fallbackEvents={[event]} onClose={vi.fn()} />,
);
expect(await screen.findByText(event.message)).toBeTruthy();
expect(
screen.getByText('最新错误读取失败,已使用打开通知时的快照'),
).toBeTruthy();
});
});