test-render.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { ReactNode } from 'react';
  2. import { BrowserRouter } from 'react-router-dom';
  3. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  4. import { ThemeProvider } from 'next-themes';
  5. import { AuthProvider } from '../../../src/client/admin/hooks/AuthProvider';
  6. import { vi } from 'vitest';
  7. /**
  8. * 创建测试用的QueryClient
  9. */
  10. export function createTestQueryClient() {
  11. return new QueryClient({
  12. defaultOptions: {
  13. queries: {
  14. retry: false,
  15. gcTime: 0,
  16. },
  17. mutations: {
  18. retry: false,
  19. },
  20. }
  21. });
  22. }
  23. /**
  24. * 测试渲染器的包装组件
  25. */
  26. export function TestWrapper({ children }: { children: ReactNode }) {
  27. const queryClient = createTestQueryClient();
  28. return (
  29. <QueryClientProvider client={queryClient}>
  30. <ThemeProvider attribute="class" defaultTheme="light">
  31. <BrowserRouter>
  32. {children}
  33. </BrowserRouter>
  34. </ThemeProvider>
  35. </QueryClientProvider>
  36. );
  37. }
  38. /**
  39. * 专门用于admin页面的测试包装器,包含AuthProvider
  40. */
  41. export function AdminTestWrapper({ children }: { children: ReactNode }) {
  42. const queryClient = createTestQueryClient();
  43. // Mock localStorage for tests
  44. const localStorageMock = {
  45. getItem: vi.fn(() => null),
  46. setItem: vi.fn(),
  47. removeItem: vi.fn(),
  48. clear: vi.fn(),
  49. };
  50. // Set up localStorage mock
  51. Object.defineProperty(window, 'localStorage', {
  52. value: localStorageMock,
  53. writable: true,
  54. });
  55. return (
  56. <QueryClientProvider client={queryClient}>
  57. <ThemeProvider attribute="class" defaultTheme="light">
  58. <BrowserRouter>
  59. <AuthProvider>
  60. {children}
  61. </AuthProvider>
  62. </BrowserRouter>
  63. </ThemeProvider>
  64. </QueryClientProvider>
  65. );
  66. }
  67. /**
  68. * 等待组件更新完成
  69. */
  70. export async function waitForUpdate(delay = 0) {
  71. await new Promise(resolve => setTimeout(resolve, delay));
  72. }