import { renderHook, waitFor } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { describe, expect, it, vi } from "vitest"; import { createQueryWrapper } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; import { useAuthenticatedQueries, useAuthenticatedQuery, } from "./authenticated-query"; import { apiQueryClient, configureAuthClient } from "./client"; const useSingleQuery = () => useAuthenticatedQuery( apiQueryClient.queryOptions("get", "/api/v1/brokerage-accounts"), ); const useMultipleQueries = () => useAuthenticatedQueries([ apiQueryClient.queryOptions("get", "/api/v1/brokerage-accounts"), ])[0]; describe("useAuthenticatedQuery", () => { it.each(["single", "multiple"])( "keeps %s protected queries idle without a session and loads after session configuration", async (mode) => { const requests = vi.fn(); server.use( http.get("*/api/v1/brokerage-accounts", () => { requests(); return HttpResponse.json( resource([ { id: "account-1", name: "Основной", openedOn: "2024-08-13", type: "BROKERAGE", }, ]), ); }), ); const { result } = renderHook( mode === "single" ? useSingleQuery : useMultipleQueries, { wrapper: createQueryWrapper().wrapper }, ); await new Promise(resolve => setTimeout(resolve, 0)); expect(requests).not.toHaveBeenCalled(); expect(result.current?.fetchStatus).toBe("idle"); configureAuthClient({ accessToken: () => "token", clear: vi.fn(), refresh: () => Promise.resolve(true), }); await waitFor(() => expect(result.current?.isSuccess).toBe(true)); expect(requests).toHaveBeenCalledOnce(); expect(result.current?.data?.data).toEqual([ { id: "account-1", name: "Основной", openedOn: "2024-08-13", type: "BROKERAGE", }, ]); }, ); });