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