105 lines
3.8 KiB
Swift
105 lines
3.8 KiB
Swift
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))
|
|
}
|
|
}
|