fix(monitor): harden mobile entry dialog
This commit is contained in:
@@ -22,6 +22,7 @@ const vehicleCardArgsSpy = vi.hoisted(() => vi.fn());
|
||||
const monitorDataArgsSpy = vi.hoisted(() => vi.fn());
|
||||
const qrToDataURLSpy = vi.hoisted(() => vi.fn());
|
||||
const monitorQueryFlags = vi.hoisted(() => ({ isLoading: false, isFetching: false, isPlaceholderData: false }));
|
||||
const originalClipboard = Object.getOwnPropertyDescriptor(navigator, 'clipboard');
|
||||
|
||||
vi.mock('../map/FleetMap', () => ({
|
||||
FleetMap: ({ selectedVin, onSelectVin }: { selectedVin?: string; onSelectVin?: (vin: string) => void }) => {
|
||||
@@ -77,6 +78,8 @@ afterEach(() => {
|
||||
vehicleCardArgsSpy.mockClear();
|
||||
monitorDataArgsSpy.mockClear();
|
||||
qrToDataURLSpy.mockReset();
|
||||
if (originalClipboard) Object.defineProperty(navigator, 'clipboard', originalClipboard);
|
||||
else Reflect.deleteProperty(navigator, 'clipboard');
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
|
||||
@@ -186,6 +189,23 @@ test('loads the QR generator only after opening the mobile entry', async () => {
|
||||
expect(qrToDataURLSpy.mock.calls[0][0]).not.toContain('token');
|
||||
});
|
||||
|
||||
test('closes the mobile entry with Escape and reports clipboard success', async () => {
|
||||
qrToDataURLSpy.mockResolvedValue('data:image/png;base64,vehicle-monitor');
|
||||
const writeText = vi.fn().mockResolvedValue(undefined);
|
||||
Object.defineProperty(navigator, 'clipboard', { configurable: true, value: { writeText } });
|
||||
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } });
|
||||
render(<QueryClientProvider client={queryClient}><MemoryRouter future={ROUTER_FUTURE}><MonitorPage /></MemoryRouter></QueryClientProvider>);
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /手机端/ }));
|
||||
expect(await screen.findByRole('img', { name: '全局监控手机端二维码' })).toBeInTheDocument();
|
||||
fireEvent.click(screen.getByRole('button', { name: '复制访问地址' }));
|
||||
expect(await screen.findByRole('button', { name: '已复制访问地址' })).toBeInTheDocument();
|
||||
expect(writeText).toHaveBeenCalledWith(expect.stringMatching(/\/monitor$/));
|
||||
|
||||
fireEvent.keyDown(window, { key: 'Escape' });
|
||||
expect(screen.queryByRole('dialog', { name: '手机端入口' })).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
test('shows a retry action when on-demand QR generation fails', async () => {
|
||||
qrToDataURLSpy.mockRejectedValueOnce(new Error('canvas unavailable')).mockResolvedValue('data:image/png;base64,recovered');
|
||||
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } });
|
||||
|
||||
Reference in New Issue
Block a user