import XCTest import AVFoundation @testable import MixBoard /// End-to-end integration tests exercising full workflows. final class E2EWorkflowTests: XCTestCase { private var outputDir: URL! override func setUp() { super.setUp() outputDir = FileManager.default.temporaryDirectory .appendingPathComponent("MixBoardE2E", isDirectory: true) try? FileManager.default.createDirectory(at: outputDir, withIntermediateDirectories: true) } override func tearDown() { super.tearDown() try? FileManager.default.removeItem(at: outputDir) TestHelpers.cleanupTestFiles() } // MARK: - Full Import → Playlist → Export Workflow func testImportAndBuildPlaylistWorkflow() async throws { // 1. Create test audio files let urls = try TestHelpers.createTestAudioFiles(count: 3, duration: 2.0) XCTAssertEqual(urls.count, 3) // 2. Read metadata for each var tracks: [Track] = [] for url in urls { let metadata = try await MetadataService.readMetadata(from: url) let track = Track( title: metadata.title, artist: "Test Artist", filePath: url.path, duration: metadata.duration, sampleRate: metadata.sampleRate, bitDepth: metadata.bitDepth, channels: metadata.channels, fileFormat: metadata.fileFormat, fileSizeBytes: metadata.fileSizeBytes ) tracks.append(track) } XCTAssertEqual(tracks.count, 3) // 3. Build a playlist let playlist = Playlist(name: "E2E Test Mix") for track in tracks { playlist.addTrack(track, crossfadeDuration: 0.5) } XCTAssertEqual(playlist.trackCount, 3) XCTAssertGreaterThan(playlist.totalDuration, 5.0) // 4. Export as CUE sheet let cueURL = outputDir.appendingPathComponent("e2e_test.cue") var options = ExportOptions.default options.copyAudioFiles = false try CueSheetExporter.export(playlist: playlist, to: cueURL, options: options) let cueContent = try String(contentsOf: cueURL, encoding: .utf8) XCTAssertTrue(cueContent.contains("TITLE \"E2E Test Mix\"")) XCTAssertTrue(cueContent.contains("TRACK 01")) XCTAssertTrue(cueContent.contains("TRACK 02")) XCTAssertTrue(cueContent.contains("TRACK 03")) // 5. Export as Audition session let sesxURL = outputDir.appendingPathComponent("e2e_test.sesx") try AuditionExporter.export(playlist: playlist, to: sesxURL, options: options) let sesxContent = try String(contentsOf: sesxURL, encoding: .utf8) XCTAssertTrue(sesxContent.contains("")) XCTAssertTrue(sesxContent.contains("