diff --git a/frontend/src/test/utils.tsx b/frontend/src/test/utils.tsx
new file mode 100644
index 0000000..327e8c5
--- /dev/null
+++ b/frontend/src/test/utils.tsx
@@ -0,0 +1,66 @@
+import { render, type RenderOptions } from '@testing-library/react'
+import { renderHook } from '@testing-library/react'
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { MemoryRouter } from 'react-router-dom'
+import { AuthProvider } from '@/context/AuthContext'
+import type { ReactElement, ReactNode } from 'react'
+
+export function createTestQueryClient() {
+ return new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: false,
+ gcTime: 0,
+ },
+ mutations: {
+ retry: false,
+ },
+ },
+ })
+}
+
+interface ProvidersProps {
+ children: ReactNode
+ initialRoute?: string
+}
+
+function Providers({ children, initialRoute = '/' }: ProvidersProps) {
+ const queryClient = createTestQueryClient()
+ return (
+
+
+
+ {children}
+
+
+
+ )
+}
+
+export function renderWithProviders(
+ ui: ReactElement,
+ options?: Omit & { initialRoute?: string },
+) {
+ const { initialRoute, ...renderOptions } = options ?? {}
+ return render(ui, {
+ wrapper: ({ children }) => (
+ {children}
+ ),
+ ...renderOptions,
+ })
+}
+
+export function renderHookWithProviders(
+ hook: () => TResult,
+ options?: { initialRoute?: string },
+) {
+ const queryClient = createTestQueryClient()
+ const wrapper = ({ children }: { children: ReactNode }) => (
+
+
+ {children}
+
+
+ )
+ return { ...renderHook(hook, { wrapper }), queryClient }
+}