964290c641
样式 before:   after:   逻辑: 每次打开报告modal会再次查询队列中的错误 <video src="attachments/6d9d9bd7-5b7b-4a05-a7c3-ca64b6fb77f3" title="2026-09-05 19-46-02.mp4" controls></video> --------- Co-authored-by: 段舒康 <kdletters@qq.com> Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/286 Reviewed-by: 段舒康 <kdletters@qq.com> Co-authored-by: 王德宇 <kvtodev@outlook.com> Co-committed-by: 王德宇 <kvtodev@outlook.com>
82 lines
2.6 KiB
TypeScript
82 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,
|
|
getStableErrorReportSubmissionId: vi.fn(),
|
|
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();
|
|
});
|
|
});
|