import { screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { MemoryRouter } from "react-router-dom";
import { vi } from "vitest";
import { renderWithProviders } from "../test/renderWithProviders";
import { MaterialsPage } from "./MaterialsPage";

vi.mock("../shared/api/endpoints", () => ({
  contentApi: {
    list: vi.fn(async ({ q } = {}) => {
      const items = [
        {
          id: "robot",
          slug: "robot",
          title: "Команда молодых инженеров представила робота-помощника",
          excerpt: "Проект студентов ДГТУ",
          tags: ["робот", "инженеры"],
          type: "article",
          category: "Наука",
        },
        {
          id: "data-school",
          slug: "data-school",
          title: "Открыт набор в летнюю школу анализа данных",
          excerpt: "Образовательная программа",
          tags: ["данные"],
          type: "announcement",
          category: "Образование",
        },
      ];

      return q ? items.filter((item) => `${item.title} ${item.excerpt}`.toLowerCase().includes(q.toLowerCase())) : items;
    }),
  },
  directoriesApi: {
    categories: vi.fn(async () => [{ id: "science", name: "Наука" }]),
  },
}));

describe("MaterialsPage", () => {
  it("фильтрует материалы по поисковому запросу", async () => {
    const user = userEvent.setup();
    renderWithProviders(
      <MemoryRouter>
        <MaterialsPage />
      </MemoryRouter>,
    );

    expect(await screen.findByText("Команда молодых инженеров представила робота-помощника")).toBeInTheDocument();

    const search = screen.getByPlaceholderText("Название, автор, тема или тег");
    await user.type(search, "робота-помощника");
    await user.click(screen.getByRole("button", { name: "Найти" }));

    await waitFor(() => {
      expect(screen.getByText("Команда молодых инженеров представила робота-помощника")).toBeInTheDocument();
    });
    expect(screen.queryByText("Открыт набор в летнюю школу анализа данных")).not.toBeInTheDocument();
  });
});
