diff --git a/Tests/MusicAssistantCoreTests/LocalSongProjectStoreTests.swift b/Tests/MusicAssistantCoreTests/LocalSongProjectStoreTests.swift index d4c4901..f368c50 100644 --- a/Tests/MusicAssistantCoreTests/LocalSongProjectStoreTests.swift +++ b/Tests/MusicAssistantCoreTests/LocalSongProjectStoreTests.swift @@ -77,6 +77,53 @@ final class LocalSongProjectStoreTests: XCTestCase { XCTAssertEqual(savedProject.selectedInstrumentIDs, ["oud", "violin"]) } + func testRestoresPersistedProjectVersionAndKeepsVersionHistory() async throws { + let store = LocalSongProjectStore(directoryURL: temporaryDirectoryURL) + let restoredAt = Date(timeIntervalSince1970: 900) + var project = SongProject( + id: "version-recovery-project", + title: "Original Direction", + idea: "Start with acoustic instruments", + genres: [GenreStyle(id: "folk", name: "Folk")], + lyrics: Lyrics(text: "Original lyrics"), + createdAt: Date(timeIntervalSince1970: 100), + updatedAt: Date(timeIntervalSince1970: 200) + ) + + _ = project.createVersion( + id: "original-version", + label: "Original direction", + createdAt: Date(timeIntervalSince1970: 300) + ) + project.title = "Later Direction" + project.idea = "Add electronic elements" + project.selectInstrument(InstrumentTrack(instrumentId: "oud")) + project.lyrics = Lyrics(text: "Later lyrics") + _ = project.createVersion( + id: "later-version", + label: "Later direction", + createdAt: Date(timeIntervalSince1970: 400) + ) + project.title = "Unsaved direction" + + try await store.create(project) + + var recoveredProject = try await store.open(id: project.id) + XCTAssertTrue(recoveredProject.restoreVersion(id: "original-version", restoredAt: restoredAt)) + try await store.save(recoveredProject) + + let restoredProject = try await store.open(id: project.id) + + XCTAssertEqual(restoredProject.title, "Original Direction") + XCTAssertEqual(restoredProject.idea, "Start with acoustic instruments") + XCTAssertEqual(restoredProject.genres, [GenreStyle(id: "folk", name: "Folk")]) + XCTAssertTrue(restoredProject.instruments.isEmpty) + XCTAssertEqual(restoredProject.lyrics, Lyrics(text: "Original lyrics")) + XCTAssertEqual(restoredProject.updatedAt, restoredAt) + XCTAssertEqual(restoredProject.versions.map(\.id), ["original-version", "later-version"]) + XCTAssertEqual(restoredProject.version(id: "later-version")?.snapshot.title, "Later Direction") + } + func testLoadsProjectListSortedByMostRecentUpdate() async throws { let store = LocalSongProjectStore(directoryURL: temporaryDirectoryURL) let older = SongProject( diff --git a/docs/TASKS.md b/docs/TASKS.md index 7d720dd..a06a545 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -115,7 +115,7 @@ requirement is missing and blocks implementation, record it in - [x] Add validation for contradictory/invalid project settings. - [x] Add loading, offline and provider-error states. - [x] Add accessibility labels and keyboard navigation. -- [ ] Test project/version recovery. +- [x] Test project/version recovery. - [ ] Test AI output against locked user choices. - [ ] Test selected instruments influence compiled song-generation context.