import { describe, expect, it } from "vitest" import { AAFImporter } from "../../../services/import-export/importers/aaf-importer" import { ImportOptions } from "../../../services/import-export/types" describe("AAFImporter", () => { const importer = new AAFImporter() const defaultOptions: ImportOptions = { format: "aaf", frameRate: 30, } describe("validateContent", () => { it("должен валидировать корректный AAF XML контент", () => { const content = ` urn:smpte:umid:060a2b34.01010101.01010f00.13000000.1234567890ab0000 Test Composition ` expect(importer.validateContent(content)).toBe(true) }) it("должен отклонять некорректный XML", () => { const content = "This is not XML" expect(importer.validateContent(content)).toBe(false) }) it("должен отклонять XML без AAF элементов", () => { const content = ` ` expect(importer.validateContent(content)).toBe(false) }) }) describe("import", () => { it("должен импортировать простой AAF проект", async () => { const content = ` comp-001 Test AAF Project 1 Video Track 1 1 Test Clip Picture 300 source-001 1 0 source-001 test_video.mxf FileDescriptor /path/to/test_video.mxf 1920 1080 ` 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 AAF Project") expect(project.fps).toBe(30) expect(project.globalTracks).toHaveLength(1) const track = project.globalTracks[0] expect(track.name).toBe("Video Track 1") expect(track.type).toBe("video") 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 frames / 30 fps = 10s }) it("должен импортировать медиафайлы из SourceMob", async () => { const content = ` comp-001 Media Test 1 V1 Picture 600 video-001 2 A1 Sound 600 audio-001 video-001 video_file.mxf FileDescriptor /media/video_file.mxf 1920 1080 16:9 audio-001 audio_file.wav WaveAudioDescriptor /media/audio_file.wav 48000/1 ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) expect(result.mediaFiles).toHaveLength(2) const videoFile = result.mediaFiles.find((f) => f.name === "video_file.mxf") const audioFile = result.mediaFiles.find((f) => f.name === "audio_file.wav") expect(videoFile).toBeDefined() expect(videoFile?.isVideo).toBe(true) expect(videoFile?.isAudio).toBe(false) expect(videoFile?.name).toBe("video_file.mxf") expect(videoFile?.path).toBe("/media/video_file.mxf") expect(audioFile).toBeDefined() expect(audioFile?.isVideo).toBe(false) expect(audioFile?.isAudio).toBe(true) expect(audioFile?.name).toBe("audio_file.wav") }) it("должен обрабатывать Filler (пробелы между клипами)", async () => { const content = ` comp-001 Filler Test 1 V1 Picture 150 source-001 Unknown 60 Picture 150 source-002 ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) const project = result.project! const track = project.globalTracks[0] expect(track.clips).toHaveLength(2) const clip1 = track.clips[0] const clip2 = track.clips[1] expect(clip1.startTime).toBe(0) expect(clip1.duration).toBe(5) // 150 frames / 30 fps expect(clip2.startTime).toBe(7) // 5s clip + 2s filler (60/30) expect(clip2.duration).toBe(5) }) it("должен определять тип трека по DataDefinition", async () => { const content = ` comp-001 Track Type Test 1 Video Track Picture 300 vid-001 2 Audio Track Sound 300 aud-001 ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) const project = result.project! expect(project.globalTracks).toHaveLength(2) const videoTrack = project.globalTracks[0] const audioTrack = project.globalTracks[1] expect(videoTrack.type).toBe("video") expect(audioTrack.type).toBe("audio") }) }) describe("обработка ошибок", () => { it("должен обрабатывать отсутствие композиции", async () => { const content = ` source-001 Only Source ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(false) expect(result.errors).toHaveLength(1) expect(result.errors[0].message).toContain("No composition found") }) it("должен добавлять предупреждения для отсутствующих медиафайлов", async () => { const content = ` comp-001 Missing Media Test 1 V1 Picture 300 missing-source ` const result = await importer.import(content, defaultOptions) expect(result.success).toBe(true) expect(result.warnings).toHaveLength(1) expect(result.warnings[0].code).toBe("MISSING_MEDIA") }) }) })