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