importer chnges

This commit is contained in:
Mark Gregory
2026-11-05 10:26:34 +00:00
parent 38a99d94ba
commit faa1fe43d0
4 changed files with 71 additions and 7 deletions
+36
View File
@@ -6,6 +6,42 @@ import UniformTypeIdentifiers
@testable import KJamsClone
final class KJamsCloneTests: XCTestCase {
func testRecursiveFolderImportPairsDeduplicatesAndSkipsManagedMedia() throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let nested = root.appendingPathComponent("Input/Artist/Album")
try FileManager.default.createDirectory(at:nested,withIntermediateDirectories:true)
let fixtures = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures"))
let audio = nested.appendingPathComponent("Song.MP3")
try FileManager.default.copyItem(at:fixtures.appendingPathComponent("Demo.mp3"),to:audio)
try FileManager.default.copyItem(at:fixtures.appendingPathComponent("Demo.cdg"),to:nested.appendingPathComponent("song.CDG"))
try FileManager.default.copyItem(at:fixtures.appendingPathComponent("Demo.zip"),to:root.appendingPathComponent("Input/Archive.zip"))
try Data("ignored".utf8).write(to:nested.appendingPathComponent("Notes.txt"))
try FileManager.default.createSymbolicLink(at:nested.appendingPathComponent("Loop"),withDestinationURL:root)
let media = root.appendingPathComponent("Input/Managed")
try FileManager.default.createDirectory(at:media,withIntermediateDirectories:true)
try FileManager.default.copyItem(at:fixtures.appendingPathComponent("TestTrack.mp3"),to:media.appendingPathComponent("Existing.mp3"))
let db = try Library(url:root.appendingPathComponent("Library.sqlite")),importer = Importer(media:media)
var updates = [ImportProgress]()
let ids = try importer.run([root.appendingPathComponent("Input"),nested,audio],library:db,progress:{updates.append($0)})
XCTAssertEqual(ids.count,1);XCTAssertEqual(try db.songs().count,1)
XCTAssertNotNil(try db.songs().first?.cdg)
XCTAssertEqual(updates.last?.completed,2);XCTAssertEqual(updates.last?.total,2)
XCTAssertTrue(updates.contains{$0.current.hasPrefix("Scanning ")})
var latest = ImportProgress()
XCTAssertEqual(try importer.run([root.appendingPathComponent("Input")],library:db,progress:{latest = $0}),ids)
XCTAssertEqual(latest.skipped,2);XCTAssertTrue(latest.finished)
}
func testFolderDiscoveryCancellationEmptyFolderAndMissingInput() throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
try FileManager.default.createDirectory(at:root,withIntermediateDirectories:true)
defer { try? FileManager.default.removeItem(at:root) }
let db = try Library(url:root.appendingPathComponent("Library.sqlite")),importer = Importer(media:root.appendingPathComponent("Media"))
XCTAssertThrowsError(try importer.run([root],library:db,cancelled:{true})) { XCTAssertTrue($0 is CancellationError) }
XCTAssertThrowsError(try importer.run([root],library:db)) { XCTAssertTrue($0.localizedDescription.contains("No audio found")) }
XCTAssertThrowsError(try importer.run([root.appendingPathComponent("Missing")],library:db)) { XCTAssertTrue($0.localizedDescription.contains("Missing")) }
XCTAssertTrue(try db.songs().isEmpty)
}
@MainActor func testLargeImportReturnsImmediatelyAndReportsCompletion() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }