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(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); }); });