/** @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, getStableErrorReportSubmissionId: vi.fn(), readApplicationDiagnosticLogs: mockState.readLogs, submitErrorReportBatch: vi.fn(), })); vi.mock('../src/components/modal/ThemedModal', () => ({ ThemedModal: ({ open, children }: { open: boolean; children: ReactNode }) => open ?
{children}
: 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(); expect(mockState.getPending).not.toHaveBeenCalled(); view.rerender(); expect(await screen.findByText(event.message)).toBeTruthy(); expect(mockState.getPending).toHaveBeenCalledTimes(1); }); it('读取错误事件失败时显示不可用状态而不是空列表', async () => { mockState.getPending.mockRejectedValue(new Error('读取失败')); mockState.readLogs.mockResolvedValue([]); render(); expect( await screen.findByText('错误事件暂不可用,请关闭后重试。'), ).toBeTruthy(); expect(screen.queryByText('当前没有待报告的错误。')).toBeNull(); }); it('最新快照读取失败时使用打开通知时的事件快照', async () => { mockState.getPending.mockRejectedValue(new Error('瞬时读取失败')); mockState.readLogs.mockResolvedValue([]); render( , ); expect(await screen.findByText(event.message)).toBeTruthy(); expect( screen.getByText('最新错误读取失败,已使用打开通知时的快照'), ).toBeTruthy(); }); });