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