importer chnges
This commit is contained in:
@@ -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) }
|
||||
|
||||
Reference in New Issue
Block a user