import { beforeEach, describe, expect, it, vi } from "vitest" import { useFavorites } from "@/features/app-state" import { fireEvent, renderWithProviders, screen } from "@/test/test-utils" import { MediaItem } from "../../components/media-item" // Импортируем для мокирования // Мокаем MediaPreview vi.mock("@/features/browser", () => ({ MediaPreview: ({ file, onAddMedia, isAdded, size, showFileName, ignoreRatio }: any) => (
onAddMedia?.(file)} > Media Preview
), })) // Мокаем FileMetadata vi.mock("../../components/file-metadata", () => ({ FileMetadata: ({ file, size }: { file: any; size: number }) => (
File Metadata
), })) // Мокаем useFavorites vi.mock("@/features/app-state", async (importOriginal) => { const actual = await importOriginal() return { ...actual, useFavorites: vi.fn(() => ({ favorites: { media: [], audio: [], transition: [], effect: [], template: [], filter: [], }, })), } }) // Мокаем useProjectSettings vi.mock("@/features/project-settings/hooks/use-project-settings", () => ({ useProjectSettings: () => ({ settings: { aspectRatio: { value: { width: 16, height: 9, }, }, }, }), })) describe("MediaItem", () => { const mockFile = { id: "test-file", name: "test-file.mp4", path: "/path/to/test-file.mp4", isVideo: true, size: 1000, creationTime: "2023-01-01T00:00:00.000Z", } const mockAddedFile = { id: "added-file", name: "added-file.mp4", path: "/path/to/added-file.mp4", isVideo: true, size: 1000, creationTime: "2023-01-01T00:00:00.000Z", } beforeEach(() => { vi.clearAllMocks() }) it("should render in list mode", () => { renderWithProviders() // Проверяем, что компоненты отрендерились expect(screen.getByTestId("media-preview")).toBeInTheDocument() expect(screen.getByTestId("file-metadata")).toBeInTheDocument() // Проверяем, что переданы правильные пропсы expect(screen.getByTestId("media-preview").dataset.fileId).toBe("test-file") expect(screen.getByTestId("media-preview").dataset.size).toBe("100") expect(screen.getByTestId("media-preview").dataset.ignoreRatio).toBe("false") expect(screen.getByTestId("file-metadata").dataset.fileId).toBe("test-file") expect(screen.getByTestId("file-metadata").dataset.size).toBe("100") }) it("should render in grid mode", () => { renderWithProviders() // Проверяем, что компонент превью отрендерился expect(screen.getByTestId("media-preview")).toBeInTheDocument() // Проверяем, что имя файла отображается expect(screen.getByText("test-file.mp4")).toBeInTheDocument() // Проверяем, что переданы правильные пропсы expect(screen.getByTestId("media-preview").dataset.fileId).toBe("test-file") expect(screen.getByTestId("media-preview").dataset.size).toBe("100") expect(screen.getByTestId("media-preview").dataset.ignoreRatio).toBeFalsy() }) it("should render in thumbnails mode", () => { renderWithProviders() // Проверяем, что компонент превью отрендерился expect(screen.getByTestId("media-preview")).toBeInTheDocument() // Проверяем, что переданы правильные пропсы expect(screen.getByTestId("media-preview").dataset.fileId).toBe("test-file") expect(screen.getByTestId("media-preview").dataset.size).toBe("100") expect(screen.getByTestId("media-preview").dataset.showFilename).toBe("true") expect(screen.getByTestId("media-preview").dataset.ignoreRatio).toBe("true") }) it("should handle click events on preview component", () => { renderWithProviders() // Кликаем на превью - компонент должен корректно обрабатывать клики expect(() => { fireEvent.click(screen.getByTestId("media-preview")) }).not.toThrow() // Проверяем, что компонент остается отрендеренным после клика expect(screen.getByTestId("media-preview")).toBeInTheDocument() }) it("should apply 'pointer-events-none' class for added files", () => { // Настраиваем мок так, чтобы файл был в избранном vi.mocked(useFavorites).mockReturnValue({ favorites: { media: [{ id: "added-file" }], // Добавляем файл в избранное audio: [], transition: [], effect: [], template: [], filter: [], }, }) renderWithProviders() // Проверяем, что компонент имеет класс pointer-events-none const container = screen.getByTestId("media-preview").parentElement?.parentElement expect(container).toHaveClass("pointer-events-none") }) })