import { describe, expect, it, vi } from "vitest" import { fireEvent, renderWithMedia as render, screen } from "@/test/test-utils" import { SubtitleGroup } from "../../components/subtitle-group" // Мокаем useResources vi.mock("@/features/resources", () => ({ useResources: () => ({ addSubtitle: vi.fn(), isSubtitleAdded: vi.fn(() => false), removeResource: vi.fn(), subtitleResources: [], addResource: vi.fn(), isAdded: vi.fn(() => false), }), ResourcesProvider: ({ children }: { children: React.ReactNode }) => children, })) // Мокаем AddMediaButton vi.mock("@/features/browser/components/layout/add-media-button", () => ({ AddMediaButton: () => , })) // Мокаем FavoriteButton vi.mock("@/features/browser/components/layout/favorite-button", () => ({ FavoriteButton: () => , })) const mockSubtitles = [ { id: "basic-white", name: "Basic White", category: "basic", complexity: "basic", tags: ["simple", "clean"], description: { en: "Simple white subtitles", ru: "Простые белые субтитры" }, labels: { en: "Basic White", ru: "Базовый белый" }, style: { color: "#FFFFFF", fontSize: 24, fontFamily: "Arial", }, }, { id: "basic-yellow", name: "Basic Yellow", category: "basic", complexity: "basic", tags: ["simple", "bright"], description: { en: "Simple yellow subtitles", ru: "Простые желтые субтитры" }, labels: { en: "Basic Yellow", ru: "Базовый желтый" }, style: { color: "#FFFF00", fontSize: 24, fontFamily: "Arial", }, }, ] describe("SubtitleGroup", () => { const defaultProps = { title: "Basic Subtitles", subtitles: mockSubtitles, previewSize: 100, previewWidth: 150, previewHeight: 80, onSubtitleClick: vi.fn(), } it("должен рендериться без ошибок", () => { render() expect(screen.getByText("Basic Subtitles")).toBeInTheDocument() }) it("должен отображать все субтитры", () => { render() // Проверяем, что рендерятся все названия субтитров expect(screen.getByText("Базовый белый")).toBeInTheDocument() expect(screen.getByText("Базовый желтый")).toBeInTheDocument() }) it("должен вызывать onSubtitleClick при клике на субтитр", () => { const onSubtitleClick = vi.fn() render() // Кликаем на первый превью по тексту Timeline Studio const firstPreview = screen.getAllByText("Timeline Studio")[0] const container = firstPreview.closest(".cursor-pointer") if (container) { fireEvent.click(container) expect(onSubtitleClick).toHaveBeenCalledWith(mockSubtitles[0]) } }) it("не должен отображаться если нет субтитров", () => { render() expect(screen.queryByText("Basic Subtitles")).not.toBeInTheDocument() }) it("не должен отображать заголовок если title пустой", () => { render() expect(screen.queryByRole("heading")).not.toBeInTheDocument() }) it("должен применять правильные CSS переменные для размеров", () => { render() const grid = screen.getByText("Basic Subtitles").nextElementSibling expect(grid).toHaveStyle({ "--preview-size": "150px" }) }) it("должен передавать правильные размеры в SubtitlePreview", () => { render() // Проверяем, что компоненты рендерятся expect(screen.getByText("Базовый белый")).toBeInTheDocument() expect(screen.getByText("Базовый желтый")).toBeInTheDocument() }) it("должен обрабатывать большое количество субтитров", () => { const manySubtitles = Array.from({ length: 20 }, (_, i) => ({ ...mockSubtitles[0], id: `subtitle-${i}`, name: `Subtitle ${i}`, labels: { en: `Subtitle ${i}`, ru: `Субтитр ${i}` }, })) render() // Проверяем что рендерятся все 20 субтитров const previewElements = screen.getAllByText("Timeline Studio") expect(previewElements).toHaveLength(20) }) it("должен сохранять порядок субтитров", () => { const orderedSubtitles = [ { ...mockSubtitles[0], id: "first", labels: { ru: "Первый" } }, { ...mockSubtitles[1], id: "second", labels: { ru: "Второй" } }, { ...mockSubtitles[0], id: "third", labels: { ru: "Третий" } }, ] const onSubtitleClick = vi.fn() render() // Кликаем по каждому превью через Timeline Studio const previewElements = screen.getAllByText("Timeline Studio") const container1 = previewElements[0].closest(".cursor-pointer") if (container1) { fireEvent.click(container1) expect(onSubtitleClick).toHaveBeenCalledWith(orderedSubtitles[0]) } const container2 = previewElements[1].closest(".cursor-pointer") if (container2) { fireEvent.click(container2) expect(onSubtitleClick).toHaveBeenCalledWith(orderedSubtitles[1]) } const container3 = previewElements[2].closest(".cursor-pointer") if (container3) { fireEvent.click(container3) expect(onSubtitleClick).toHaveBeenCalledWith(orderedSubtitles[2]) } }) })