75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
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",
|
|
},
|
|
]);
|
|
},
|
|
);
|
|
});
|