8701f43f75
- 删除渲染层传输层: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 中无调用方的残留。
81 lines
2.6 KiB
TypeScript
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();
|
|
});
|
|
});
|