test(frontend): MSW server + renderWithProviders harness
This commit is contained in:
@@ -1 +1,7 @@
|
||||
import "@testing-library/jest-dom/vitest";
|
||||
import { afterAll, afterEach, beforeAll } from "vitest";
|
||||
import { mswServer } from "./testing/msw";
|
||||
|
||||
beforeAll(() => mswServer.listen({ onUnhandledRequest: "error" }));
|
||||
afterEach(() => mswServer.resetHandlers());
|
||||
afterAll(() => mswServer.close());
|
||||
|
||||
12
frontend/src/testing/msw.ts
Normal file
12
frontend/src/testing/msw.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { setupServer } from "msw/node";
|
||||
import { http, HttpResponse } from "msw";
|
||||
|
||||
// Component tests override these per case with `server.use(...)`.
|
||||
// Defaults simulate "logged out" so any suite that forgets to override gets a
|
||||
// clear signal instead of silent 200s.
|
||||
const defaultHandlers = [
|
||||
http.get("/api/session/me", () => new HttpResponse(null, { status: 401 })),
|
||||
];
|
||||
|
||||
export const mswServer = setupServer(...defaultHandlers);
|
||||
export { http, HttpResponse };
|
||||
26
frontend/src/testing/renderWithProviders.tsx
Normal file
26
frontend/src/testing/renderWithProviders.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
import { render, type RenderOptions, type RenderResult } from "@testing-library/react";
|
||||
import { MemoryRouter, type MemoryRouterProps } from "react-router-dom";
|
||||
import type { PropsWithChildren, ReactElement } from "react";
|
||||
|
||||
interface Options extends Omit<RenderOptions, "wrapper"> {
|
||||
route?: string;
|
||||
routerProps?: MemoryRouterProps;
|
||||
}
|
||||
|
||||
export function renderWithProviders(ui: ReactElement, opts: Options = {}): RenderResult & { queryClient: QueryClient } {
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: { retry: false, gcTime: 0, staleTime: 0 },
|
||||
mutations: { retry: false },
|
||||
},
|
||||
});
|
||||
const Wrapper = ({ children }: PropsWithChildren) => (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<MemoryRouter initialEntries={[opts.route ?? "/"]} {...opts.routerProps}>
|
||||
{children}
|
||||
</MemoryRouter>
|
||||
</QueryClientProvider>
|
||||
);
|
||||
return { ...render(ui, { ...opts, wrapper: Wrapper }), queryClient };
|
||||
}
|
||||
Reference in New Issue
Block a user