DownloadServiceTests.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import XCTest
  2. @testable import MixBoard
  3. /// Tests for DownloadService helper methods and export pipeline integration.
  4. final class DownloadServiceTests: XCTestCase {
  5. // MARK: - File Extension Extraction
  6. func testFileExtensionFromCloudStreamPath() {
  7. XCTAssertEqual(
  8. DownloadService.fileExtension(fromPath: "/music/Artist/Album/track.flac", contentType: nil),
  9. "flac"
  10. )
  11. XCTAssertEqual(
  12. DownloadService.fileExtension(fromPath: "/music/Artist/Album/song.mp3", contentType: nil),
  13. "mp3"
  14. )
  15. XCTAssertEqual(
  16. DownloadService.fileExtension(fromPath: "/music/Various/Compilation/01 Intro.wav", contentType: nil),
  17. "wav"
  18. )
  19. }
  20. func testFileExtensionFallsBackToContentType() {
  21. XCTAssertEqual(
  22. DownloadService.fileExtension(fromPath: "/music/noext", contentType: "audio/flac"),
  23. "flac"
  24. )
  25. XCTAssertEqual(
  26. DownloadService.fileExtension(fromPath: nil, contentType: "audio/mpeg"),
  27. "mp3"
  28. )
  29. XCTAssertEqual(
  30. DownloadService.fileExtension(fromPath: nil, contentType: "audio/wav"),
  31. "wav"
  32. )
  33. XCTAssertEqual(
  34. DownloadService.fileExtension(fromPath: nil, contentType: "audio/ogg"),
  35. "ogg"
  36. )
  37. }
  38. func testFileExtensionPathTakesPrecedence() {
  39. // Path extension should win over Content-Type
  40. XCTAssertEqual(
  41. DownloadService.fileExtension(fromPath: "/music/track.flac", contentType: "audio/mpeg"),
  42. "flac"
  43. )
  44. }
  45. func testFileExtensionEmptyWhenNothingAvailable() {
  46. XCTAssertEqual(
  47. DownloadService.fileExtension(fromPath: nil, contentType: nil),
  48. ""
  49. )
  50. XCTAssertEqual(
  51. DownloadService.fileExtension(fromPath: "/music/noext", contentType: "application/octet-stream"),
  52. ""
  53. )
  54. }
  55. // MARK: - Safe File Name
  56. func testSafeFileNameWithArtist() {
  57. let track = Track(title: "My Song", artist: "The Artist", filePath: "")
  58. XCTAssertEqual(DownloadService.safeFileName(for: track), "The Artist - My Song")
  59. }
  60. func testSafeFileNameWithoutArtist() {
  61. let track = Track(title: "Untitled", filePath: "")
  62. XCTAssertEqual(DownloadService.safeFileName(for: track), "Untitled")
  63. }
  64. func testSafeFileNameSanitizesUnsafeChars() {
  65. let track = Track(title: "AC/DC: Live\\\"Loud\"", artist: "Various", filePath: "")
  66. let name = DownloadService.safeFileName(for: track)
  67. XCTAssertFalse(name.contains("/"))
  68. XCTAssertFalse(name.contains(":"))
  69. XCTAssertFalse(name.contains("\\"))
  70. XCTAssertFalse(name.contains("\""))
  71. }
  72. // MARK: - ExportOptions effectiveFileURL
  73. func testEffectiveFileURLForLocalTrack() {
  74. let track = Track(title: "Local", filePath: "/tmp/local.mp3")
  75. let options = ExportOptions.default
  76. let url = options.effectiveFileURL(for: track)
  77. XCTAssertEqual(url?.path, "/tmp/local.mp3")
  78. }
  79. func testEffectiveFileURLForCloudTrackWithDownload() {
  80. let track = Track(title: "Cloud", filePath: "")
  81. track.isCloud = true
  82. track.cloudStreamPath = "/music/Artist/Album/track.flac"
  83. var options = ExportOptions.default
  84. let downloadedURL = URL(fileURLWithPath: "/tmp/downloads/Artist - Cloud.flac")
  85. options.downloadedFiles = [track.id: downloadedURL]
  86. let url = options.effectiveFileURL(for: track)
  87. XCTAssertEqual(url, downloadedURL)
  88. }
  89. func testEffectiveFileURLForCloudTrackWithoutDownload() {
  90. let track = Track(title: "Cloud", filePath: "")
  91. track.isCloud = true
  92. let options = ExportOptions.default
  93. XCTAssertNil(options.effectiveFileURL(for: track))
  94. }
  95. func testEffectiveFileURLDownloadOverridesLocalPath() {
  96. let track = Track(title: "Overridden", filePath: "/tmp/original.mp3")
  97. var options = ExportOptions.default
  98. let downloadedURL = URL(fileURLWithPath: "/tmp/downloads/new.mp3")
  99. options.downloadedFiles = [track.id: downloadedURL]
  100. let url = options.effectiveFileURL(for: track)
  101. XCTAssertEqual(url, downloadedURL)
  102. }
  103. }