import { describe, expect, it } from "vitest" import { FCPXMLImporter } from "../../../services/import-export/importers/fcpxml-importer" import { ImportOptions } from "../../../services/import-export/types" describe("FCPXMLImporter", () => { const importer = new FCPXMLImporter() const defaultOptions: ImportOptions = { format: "fcpxml", frameRate: 30, } describe("validateContent", () => { it("должен валидировать корректный FCPXML контент", () => { const content = ` ` expect(importer.validateContent(content)).toBe(true) }) it("должен отклонять некорректный XML", () => { const content = "This is not XML" expect(importer.validateContent(content)).toBe(false) }) it("должен отклонять XML без fcpxml элемента", () => { const content = ` ` expect(importer.validateContent(content)).toBe(false) }) }) describe("import", () => { it("должен импортировать простой FCPXML проект", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) expect(result.project).toBeDefined() expect(result.errors).toHaveLength(0) const project = result.project! expect(project.name).toBe("Test FCPXML Project") expect(project.fps).toBe(30) expect(project.settings.resolution.width).toBe(1920) expect(project.settings.resolution.height).toBe(1080) expect(project.globalTracks).toHaveLength(1) const track = project.globalTracks[0] expect(track.clips).toHaveLength(1) const clip = track.clips[0] expect(clip.name).toBe("Test Clip") expect(clip.startTime).toBe(0) expect(clip.duration).toBe(10) // 300/30s = 10s }) it("должен импортировать медиафайлы", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) expect(result.mediaFiles).toHaveLength(4) const firstFile = result.mediaFiles[0] expect(firstFile).toBeDefined() expect(firstFile?.name).toBeDefined() expect(firstFile?.path).toBeDefined() }) it("должен обрабатывать различные frame rates", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) const project = result.project! // frameDuration "1001/30000s" означает 29.97 fps expect(project.fps).toBeCloseTo(29.97, 2) }) it("должен обрабатывать множественные треки", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) const project = result.project! expect(project.globalTracks).toHaveLength(2) const mainTrack = project.globalTracks.find((t) => t.order === 0) const overlayTrack = project.globalTracks.find((t) => t.order === 1) expect(mainTrack?.clips).toHaveLength(1) expect(overlayTrack?.clips).toHaveLength(1) expect(mainTrack?.clips[0].name).toBe("Main Video") expect(overlayTrack?.clips[0].name).toBe("Overlay Video") }) it("должен обрабатывать отключенные клипы", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) const project = result.project! const clip = project.globalTracks[0].clips[0] expect(clip.name).toBe("Disabled Clip") expect(clip.opacity).toBe(0.0) // Отключенный клип имеет opacity = 0 }) }) describe("обработка ошибок", () => { it("должен обрабатывать некорректный XML", async () => { const content = "This is not valid XML" const result = await importer.import(content, defaultOptions) expect(result.success).toBe(false) expect(result.errors).toHaveLength(1) expect(result.errors[0].code).toBe("INVALID_XML") }) it("должен обрабатывать пустой FCPXML", async () => { const content = ` ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) expect(result.project).toBeDefined() expect(result.project!.globalTracks).toHaveLength(0) }) }) })