import { MantineProvider } from "@mantine/core"; import { QueryClientProvider } from "@tanstack/react-query"; import { act, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { MemoryRouter } from "react-router"; import { afterEach, describe, expect, it, vi } from "vitest"; import { configureAuthClient } from "@/shared/api"; import { createTestQueryClient } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; import { StocksPage } from "./StocksPage"; afterEach(() => vi.useRealTimers()); describe("stock search", () => { it("waits for a meaningful query and uses the server-verified ticker link", async () => { const query = vi.fn(); server.use( http.get("*/api/v1/stocks", ({ request }) => { query(new URL(request.url).searchParams.get("query")); return HttpResponse.json( resource([ { apiTradeAvailable: true, classCode: "TQBR", instrumentUid: "unique-stock", isin: "RU0009029540", logoName: "sber.png", name: "Сбербанк", price: { currency: "RUB", value: "306.12" }, priceAt: "2026-09-10T10:00:00Z", realExchange: "REAL_EXCHANGE_MOEX", shareType: "SHARE_TYPE_COMMON", slug: "SBER", ticker: "SBER", }, ]), ); }), ); configureAuthClient({ accessToken: () => "synthetic", clear: vi.fn(), refresh: () => Promise.resolve(false), }); vi.useFakeTimers(); render( , ); const input = screen.getByLabelText("Поиск акций"); fireEvent.change(input, { target: { value: "S" } }); await act(() => vi.advanceTimersByTimeAsync(300)); expect(query).not.toHaveBeenCalled(); fireEvent.change(input, { target: { value: "SB" } }); await act(() => vi.advanceTimersByTimeAsync(299)); expect(query).not.toHaveBeenCalled(); // The final input uses real timers for network and query notifications. vi.useRealTimers(); fireEvent.change(input, { target: { value: "SBER" } }); expect( await screen.findByRole("link", { name: /Сбербанк/ }), ).toHaveAttribute("href", "/stocks/SBER"); expect(screen.getByText("306,12 ₽")).toBeVisible(); expect(screen.getByText("Режим: TQBR")).toBeVisible(); expect(screen.getByText("ISIN: RU0009029540")).toBeVisible(); expect(screen.getByText("Мосбиржа")).toBeVisible(); await waitFor(() => expect(query).toHaveBeenCalledExactlyOnceWith("SBER")); }); });