sdlc-hub/web/src/api/queries.test.ts

50 lines
2.6 KiB
TypeScript

import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { renderHook, waitFor } from "@testing-library/react";
import { createElement, type ReactNode } from "react";
import { beforeEach, describe, expect, it } from "vitest";
import { setToken } from "../auth/token.ts";
import { json, mockFetch } from "../test/fetchMock.ts";
import { qk, useBoard, useIssues, useSaveNote } from "./queries.ts";
import type { IssueDetail } from "./types.ts";
const wrap = (client: QueryClient) => ({ children }: { children: ReactNode }) =>
createElement(QueryClientProvider, { client }, children);
const rows = (n: number) => Array.from({ length: n }, (_, i) => ({ key: `A-${i}` }));
describe("запросы", () => {
beforeEach(() => setToken("tok"));
it("getNextPageParam: 50 → offset 50, 17 → undefined", async () => {
const seen: (string | null)[] = [];
mockFetch((_m, url) => { seen.push(url.searchParams.get("offset")); return json(200, { issues: rows(seen.length === 1 ? 50 : 17) }); });
const client = new QueryClient();
const { result } = renderHook(() => useIssues({}), { wrapper: wrap(client) });
await waitFor(() => expect(result.current.hasNextPage).toBe(true));
await result.current.fetchNextPage();
await waitFor(() => expect(result.current.hasNextPage).toBe(false));
expect(seen).toEqual(["0", "50"]);
});
it("useSaveNote(A-1): ответ пишется в карточку A-1", async () => {
const note = { issue_key: "A-1", comment: "x", updated_by: "web" };
mockFetch(() => json(200, note));
const client = new QueryClient();
client.setQueryData(qk.issue("A-1"), { key: "A-1", note: null } as unknown as IssueDetail);
const { result } = renderHook(() => useSaveNote("A-1"), { wrapper: wrap(client) });
await result.current.mutateAsync({} as never);
expect(client.getQueryData<IssueDetail>(qk.issue("A-1"))?.note).toEqual(note);
});
it("useBoard(project): GET /board?project=; ключ снимка — по проекту, qk.boardAll — общий префикс", async () => {
const seen: (string | null)[] = [];
mockFetch((_m, url) => { seen.push(url.searchParams.get("project")); return json(200, { issues: [], links: [] }); });
const client = new QueryClient();
const { result } = renderHook(() => useBoard("AWPCA"), { wrapper: wrap(client) });
await waitFor(() => expect(result.current.isSuccess).toBe(true));
expect(seen).toEqual(["AWPCA"]);
expect(qk.board("AWPCA")).toEqual(["board", "AWPCA"]);
expect(client.getQueryState(qk.board("AWPCA"))).toBeDefined();
expect(client.getQueryCache().findAll({ queryKey: qk.boardAll })).toHaveLength(1);
});
});