- Add aria-hidden="true" to all decorative inline SVGs (bookmark, view-mode, funnel, checkmark) - Convert save-search popover to proper dialog: role="dialog", aria-modal, focus trap, Escape key, focus return to trigger - Add aria-pressed on list/map/split view-mode toggle buttons - Add aria-expanded + aria-controls on mobile filter toggle button - Add role="status" + aria-label="Đang tải..." on Suspense fallback Co-Authored-By: Paperclip <noreply@paperclip.ing>
58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { QueryProvider } from '../query-provider';
|
|
|
|
vi.mock('next-intl', () => ({
|
|
useTranslations: () => (key: string) => key,
|
|
}));
|
|
|
|
vi.mock('@/lib/query-client', () => {
|
|
const { QueryClient } = require('@tanstack/react-query');
|
|
return { getQueryClient: () => new QueryClient() };
|
|
});
|
|
|
|
function Boom() {
|
|
throw new Error('query-fail');
|
|
}
|
|
|
|
describe('QueryProvider', () => {
|
|
let spy: ReturnType<typeof vi.spyOn>;
|
|
|
|
beforeEach(() => {
|
|
spy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
});
|
|
|
|
afterEach(() => {
|
|
spy.mockRestore();
|
|
});
|
|
|
|
it('renders children under provider', () => {
|
|
render(
|
|
<QueryProvider>
|
|
<div>ok</div>
|
|
</QueryProvider>,
|
|
);
|
|
expect(screen.getByText('ok')).toBeInTheDocument();
|
|
});
|
|
|
|
it('catches thrown errors and renders fallback with retry button', () => {
|
|
render(
|
|
<QueryProvider>
|
|
<Boom />
|
|
</QueryProvider>,
|
|
);
|
|
// error.description & common.retry keys surface via mocked translator
|
|
expect(screen.getByRole('alert')).toBeInTheDocument();
|
|
expect(screen.getByRole('button', { name: 'common.retry' })).toBeInTheDocument();
|
|
});
|
|
|
|
it('surfaces the underlying error message in fallback', () => {
|
|
render(
|
|
<QueryProvider>
|
|
<Boom />
|
|
</QueryProvider>,
|
|
);
|
|
expect(screen.getByText('query-fail')).toBeInTheDocument();
|
|
});
|
|
});
|