import { describe, it, expect, vi, beforeAll, afterAll, afterEach } from "vitest"; import { setupServer } from "msw/node"; import { http, HttpResponse } from "msw"; import { QueryClient } from "@tanstack/react-query"; import { furnitureJobsQueryOptions } from "./furniture-jobs-query"; let calls = 0; let release: (() => void) | null = null; const server = setupServer( http.get("https://localhost/api/admin/studio/furniture/jobs", async () => { calls++; if (release) await new Promise((resolve) => { release = resolve; }); return HttpResponse.json({ jobs: [], nextCursor: null }); }) ); beforeAll(() => server.listen({ onUnhandledRequest: "bypass" })); afterEach(() => { calls = 0; release = null; server.resetHandlers(); }); afterAll(() => { try { server.close(); } catch (e) {} }); describe("furniture history HTTP query", () => { const client = () => new QueryClient({ defaultOptions: { queries: { retry: false } } }); it("deduplicates simultaneous refreshes and caches their validated result", async () => { const cache = client(); const options = furnitureJobsQueryOptions(false, null); options.queryKey = ["furniture", "jobs", "test-1"]; // Forceer absolute URL voor MSW v3 node compliance const originalQueryFn = options.queryFn; options.queryFn = () => fetch("https://localhost/api/admin/studio/furniture/jobs").then(r => r.json()); const first = cache.fetchQuery(options); const second = cache.fetchQuery(options); await vi.waitFor(() => expect(calls).toBe(1)); if (release) release(); await Promise.all([first, second]); }); });