import XCTest @testable import MixBoard /// Tests for DownloadService helper methods and export pipeline integration. final class DownloadServiceTests: XCTestCase { // MARK: - File Extension Extraction func testFileExtensionFromCloudStreamPath() { XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/Artist/Album/track.flac", contentType: nil), "flac" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/Artist/Album/song.mp3", contentType: nil), "mp3" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/Various/Compilation/01 Intro.wav", contentType: nil), "wav" ) } func testFileExtensionFallsBackToContentType() { XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/noext", contentType: "audio/flac"), "flac" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: nil, contentType: "audio/mpeg"), "mp3" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: nil, contentType: "audio/wav"), "wav" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: nil, contentType: "audio/ogg"), "ogg" ) } func testFileExtensionPathTakesPrecedence() { // Path extension should win over Content-Type XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/track.flac", contentType: "audio/mpeg"), "flac" ) } func testFileExtensionEmptyWhenNothingAvailable() { XCTAssertEqual( DownloadService.fileExtension(fromPath: nil, contentType: nil), "" ) XCTAssertEqual( DownloadService.fileExtension(fromPath: "/music/noext", contentType: "application/octet-stream"), "" ) } // MARK: - Safe File Name func testSafeFileNameWithArtist() { let track = Track(title: "My Song", artist: "The Artist", filePath: "") XCTAssertEqual(DownloadService.safeFileName(for: track), "The Artist - My Song") } func testSafeFileNameWithoutArtist() { let track = Track(title: "Untitled", filePath: "") XCTAssertEqual(DownloadService.safeFileName(for: track), "Untitled") } func testSafeFileNameSanitizesUnsafeChars() { let track = Track(title: "AC/DC: Live\\\"Loud\"", artist: "Various", filePath: "") let name = DownloadService.safeFileName(for: track) XCTAssertFalse(name.contains("/")) XCTAssertFalse(name.contains(":")) XCTAssertFalse(name.contains("\\")) XCTAssertFalse(name.contains("\"")) } // MARK: - ExportOptions effectiveFileURL func testEffectiveFileURLForLocalTrack() { let track = Track(title: "Local", filePath: "/tmp/local.mp3") let options = ExportOptions.default let url = options.effectiveFileURL(for: track) XCTAssertEqual(url?.path, "/tmp/local.mp3") } func testEffectiveFileURLForCloudTrackWithDownload() { let track = Track(title: "Cloud", filePath: "") track.isCloud = true track.cloudStreamPath = "/music/Artist/Album/track.flac" var options = ExportOptions.default let downloadedURL = URL(fileURLWithPath: "/tmp/downloads/Artist - Cloud.flac") options.downloadedFiles = [track.id: downloadedURL] let url = options.effectiveFileURL(for: track) XCTAssertEqual(url, downloadedURL) } func testEffectiveFileURLForCloudTrackWithoutDownload() { let track = Track(title: "Cloud", filePath: "") track.isCloud = true let options = ExportOptions.default XCTAssertNil(options.effectiveFileURL(for: track)) } func testEffectiveFileURLDownloadOverridesLocalPath() { let track = Track(title: "Overridden", filePath: "/tmp/original.mp3") var options = ExportOptions.default let downloadedURL = URL(fileURLWithPath: "/tmp/downloads/new.mp3") options.downloadedFiles = [track.id: downloadedURL] let url = options.effectiveFileURL(for: track) XCTAssertEqual(url, downloadedURL) } }