utils.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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>
  35. <AuthProvider>
  36. <ToastProvider>{children}</ToastProvider>
  37. </AuthProvider>
  38. </ThemeProvider>
  39. </BrowserRouter>
  40. </QueryClientProvider>
  41. );
  42. }
  43. /**
  44. * Custom render function that wraps components with all providers.
  45. */
  46. function customRender(
  47. ui: React.ReactElement,
  48. options?: Omit<RenderOptions, 'wrapper'>
  49. ) {
  50. return render(ui, { wrapper: AllProviders, ...options });
  51. }
  52. // Re-export everything from testing-library
  53. export * from '@testing-library/react';
  54. // Override render with our custom render
  55. export { customRender as render };
  56. /**
  57. * Create a test QueryClient with custom configuration.
  58. */
  59. export { createTestQueryClient };
  60. /**
  61. * Helper to wait for async operations.
  62. */
  63. export const waitForAsync = () => new Promise((resolve) => setTimeout(resolve, 0));