79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
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(
|
|
<QueryClientProvider client={createTestQueryClient()}>
|
|
<MantineProvider>
|
|
<MemoryRouter>
|
|
<StocksPage />
|
|
</MemoryRouter>
|
|
</MantineProvider>
|
|
</QueryClientProvider>,
|
|
);
|
|
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"));
|
|
});
|
|
});
|