/**
* Test Utilities
* Custom render with all required providers for testing React components
*/
/* eslint-disable react-refresh/only-export-components */
import { render, type RenderOptions, type RenderResult } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { BrowserRouter } from 'react-router-dom';
import type { ReactElement, ReactNode } from 'react';
import { PrivacyProvider } from '../../src/contexts/privacy-context';
import { SettingsProvider } from '../../src/pages/settings/context';
/**
* Create a fresh QueryClient for each test to avoid shared state
*/
export function createTestQueryClient(): QueryClient {
return new QueryClient({
defaultOptions: {
queries: {
retry: false,
gcTime: 0,
staleTime: 0,
},
mutations: {
retry: false,
},
},
});
}
interface AllProvidersProps {
children: ReactNode;
queryClient?: QueryClient;
}
/**
* AllProviders wraps all required context providers for testing
*/
export function AllProviders({ children, queryClient }: AllProvidersProps) {
const client = queryClient ?? createTestQueryClient();
return (
{children}
);
}
/**
* AllProviders with SettingsContext for settings page tests
*/
export function SettingsTestProviders({ children, queryClient }: AllProvidersProps) {
const client = queryClient ?? createTestQueryClient();
return (
{children}
);
}
interface CustomRenderOptions extends Omit {
queryClient?: QueryClient;
withSettingsProvider?: boolean;
}
/**
* Custom render function that wraps components with all necessary providers
*/
function customRender(
ui: ReactElement,
options: CustomRenderOptions = {}
): RenderResult & { queryClient: QueryClient } {
const {
queryClient = createTestQueryClient(),
withSettingsProvider = false,
...renderOptions
} = options;
const Wrapper = withSettingsProvider ? SettingsTestProviders : AllProviders;
const result = render(ui, {
wrapper: ({ children }) => {children},
...renderOptions,
});
return {
...result,
queryClient,
};
}
// Re-export everything from testing-library
export * from '@testing-library/react';
export { userEvent } from '@testing-library/user-event';
// Override render with our custom version
export { customRender as render };