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)
})
})
})