50 lines
2.6 KiB
TypeScript
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);
|
|
});
|
|
});
|