import { renderHook, waitFor } from "@testing-library/react"; import { HttpResponse, http } from "msw"; import { describe, expect, it, vi } from "vitest"; import { configureAuthClient } from "@/shared/api"; import { createQueryWrapper } from "@/test/query"; import { server } from "@/test/server"; import { useBrokerageAccounts } from "./useBrokerageAccounts"; describe("useBrokerageAccounts", () => { it("loads accounts through the authenticated query seam", async () => { configureAuthClient({ accessToken: () => "token", refresh: async () => true, clear: vi.fn(), }); server.use( http.get("*/api/v1/brokerage-accounts", () => HttpResponse.json([ { id: "account-1", name: "Основной", type: "BROKERAGE", openedOn: "2024-08-13", }, ]), ), ); const { result } = renderHook(() => useBrokerageAccounts(), { wrapper: createQueryWrapper().wrapper, }); await waitFor(() => expect(result.current.isSuccess).toBe(true)); expect(result.current.data).toEqual([ { id: "account-1", name: "Основной", type: "BROKERAGE", openedOn: "2024-08-13", }, ]); }); it("keeps the current connection snapshot after a background refetch error", async () => { configureAuthClient({ accessToken: () => "token", refresh: async () => true, clear: vi.fn(), }); let calls = 0; server.use( http.get("*/api/v1/brokerage-accounts", () => { calls += 1; return calls === 1 ? HttpResponse.json([ { id: "account-1", name: "Основной", type: "BROKERAGE", openedOn: "2024-08-13", }, ]) : HttpResponse.json({ code: "TBANK_UNAVAILABLE" }, { status: 503 }); }), ); const { result } = renderHook(() => useBrokerageAccounts(), { wrapper: createQueryWrapper().wrapper, }); await waitFor(() => expect(result.current.isSuccess).toBe(true)); void result.current.refetch(); await waitFor(() => expect(result.current.isError).toBe(true)); expect(result.current.data?.[0].id).toBe("account-1"); }); });