import Foundation import MusicAssistantCore import XCTest final class ProjectAutosaveServiceTests: XCTestCase { private var temporaryDirectoryURL: URL! override func setUpWithError() throws { temporaryDirectoryURL = FileManager.default.temporaryDirectory .appendingPathComponent("music-assistant-autosave-tests") .appendingPathComponent(UUID().uuidString) } override func tearDownWithError() throws { if let temporaryDirectoryURL { try? FileManager.default.removeItem(at: temporaryDirectoryURL) } temporaryDirectoryURL = nil } func testAutosavePersistsCurrentProjectWithoutCreatingExcessiveVersions() async throws { let store = LocalSongProjectStore(directoryURL: temporaryDirectoryURL) let autosaver = ProjectAutosaveService( store: store, policy: ProjectAutosavePolicy(minimumVersionInterval: 300) ) var project = SongProject( id: "autosaved-project", title: "Draft", idea: "Initial idea", updatedAt: Date(timeIntervalSince1970: 50) ) try await store.create(project) let firstAutosave = try await autosaver.autosave( project, at: Date(timeIntervalSince1970: 100) ) XCTAssertTrue(firstAutosave.didCreateVersion) XCTAssertEqual(firstAutosave.project.versions.count, 1) XCTAssertEqual(firstAutosave.project.versions.first?.snapshot.title, "Draft") XCTAssertEqual(firstAutosave.project.updatedAt, Date(timeIntervalSince1970: 100)) project = firstAutosave.project project.title = "Draft with small edit" let rapidAutosave = try await autosaver.autosave( project, at: Date(timeIntervalSince1970: 120) ) XCTAssertFalse(rapidAutosave.didCreateVersion) XCTAssertEqual(rapidAutosave.project.versions.count, 1) XCTAssertEqual(rapidAutosave.project.title, "Draft with small edit") XCTAssertEqual(rapidAutosave.project.updatedAt, Date(timeIntervalSince1970: 120)) let storedRapidAutosave = try await store.open(id: project.id) XCTAssertEqual(storedRapidAutosave, rapidAutosave.project) project = rapidAutosave.project project.idea = "Later autosaved idea" let laterAutosave = try await autosaver.autosave( project, at: Date(timeIntervalSince1970: 420) ) XCTAssertTrue(laterAutosave.didCreateVersion) XCTAssertEqual(laterAutosave.project.versions.count, 2) XCTAssertEqual(laterAutosave.project.versions.last?.snapshot.idea, "Later autosaved idea") XCTAssertEqual(laterAutosave.project.updatedAt, Date(timeIntervalSince1970: 420)) } func testAutosaveSkipsVersionWhenCurrentSnapshotMatchesLatestVersion() async throws { let store = LocalSongProjectStore(directoryURL: temporaryDirectoryURL) let autosaver = ProjectAutosaveService( store: store, policy: ProjectAutosavePolicy(minimumVersionInterval: 300) ) var project = SongProject( id: "unchanged-autosave-project", title: "Stable", idea: "No meaningful changes" ) _ = project.createVersion( id: "version-1", label: "Stable checkpoint", createdAt: Date(timeIntervalSince1970: 100) ) try await store.create(project) let autosave = try await autosaver.autosave( project, at: Date(timeIntervalSince1970: 1_000) ) XCTAssertFalse(autosave.didCreateVersion) XCTAssertEqual(autosave.project.versions.count, 1) XCTAssertEqual(autosave.project.updatedAt, Date(timeIntervalSince1970: 1_000)) } }