utils.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * Test utilities and wrapper components.
  3. */
  4. import React from 'react';
  5. import { render } from '@testing-library/react';
  6. import type { RenderOptions } from '@testing-library/react';
  7. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  8. import { BrowserRouter } from 'react-router-dom';
  9. import { ThemeProvider } from '../contexts/ThemeContext';
  10. import { ToastProvider } from '../contexts/ToastContext';
  11. import { AuthProvider } from '../contexts/AuthContext';
  12. // Create a new QueryClient for each test
  13. function createTestQueryClient() {
  14. return new QueryClient({
  15. defaultOptions: {
  16. queries: {
  17. retry: false,
  18. gcTime: 0,
  19. },
  20. mutations: {
  21. retry: false,
  22. },
  23. },
  24. });
  25. }
  26. interface AllProvidersProps {
  27. children: React.ReactNode;
  28. }
  29. function AllProviders({ children }: AllProvidersProps) {
  30. const queryClient = createTestQueryClient();
  31. return (
  32. <QueryClientProvider client={queryClient}>
  33. <BrowserRouter>
  34. {/* ThemeProvider is now mounted inside AuthProvider in App.tsx so
  35. its initial ``api.getSettings()`` sync can gate on auth state.
  36. Tests follow the same nesting; otherwise ThemeProvider's
  37. ``useAuth()`` throws "AuthContext must be used inside
  38. AuthProvider". */}
  39. <AuthProvider>
  40. <ThemeProvider>
  41. <ToastProvider>{children}</ToastProvider>
  42. </ThemeProvider>
  43. </AuthProvider>
  44. </BrowserRouter>
  45. </QueryClientProvider>
  46. );
  47. }
  48. /**
  49. * Custom render function that wraps components with all providers.
  50. */
  51. function customRender(
  52. ui: React.ReactElement,
  53. options?: Omit<RenderOptions, 'wrapper'>
  54. ) {
  55. return render(ui, { wrapper: AllProviders, ...options });
  56. }
  57. // Re-export everything from testing-library
  58. export * from '@testing-library/react';
  59. // Override render with our custom render
  60. export { customRender as render };
  61. /**
  62. * Create a test QueryClient with custom configuration.
  63. */
  64. export { createTestQueryClient };
  65. /**
  66. * Helper to wait for async operations.
  67. */
  68. export const waitForAsync = () => new Promise((resolve) => setTimeout(resolve, 0));