Gitea Actions Runner Test / test-job (push) Successful in 2s
CI / check (push) Failing after 21s
CI / tests-unit (push) Skipped
CI / tests-integration (push) Skipped
CI / tests-ui (push) Skipped
CI / preflight (push) Skipped
CI / deploy (push) Skipped
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
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<void>((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]);
|
|
});
|
|
});
|