Enforce user locks for AI updates
This commit is contained in:
@@ -105,10 +105,69 @@ final class StructuredAIResponseSchemaTests: XCTestCase {
|
||||
XCTAssertEqual(result.project.createdAt, createdAt)
|
||||
XCTAssertEqual(result.project.updatedAt, updatedAt)
|
||||
XCTAssertEqual(result.project.versions, [version])
|
||||
XCTAssertEqual(result.project.title, "Updated")
|
||||
XCTAssertEqual(result.project.title, "Original")
|
||||
XCTAssertEqual(result.project.lyrics.text, "Updated lyrics")
|
||||
XCTAssertEqual(result.changedScopes, [.genres, .lyrics])
|
||||
XCTAssertEqual(result.notes, ["Proposed focused update."])
|
||||
XCTAssertEqual(result.followUpQuestions, ["Keep it minimal?"])
|
||||
}
|
||||
|
||||
func testStructuredResponsePreservesLockedScopesAndManualValues() {
|
||||
let section = SongSection(id: "verse", type: .verse, title: "Manual Verse")
|
||||
let manualInstrument = InstrumentTrack(
|
||||
instrumentId: "oud",
|
||||
selected: true,
|
||||
role: "Manual lead",
|
||||
autoArrangementEnabled: false,
|
||||
placements: [InstrumentPlacement(sectionId: "verse", direction: "Manual entry")]
|
||||
)
|
||||
let existingProject = SongProject(
|
||||
title: "Original Title",
|
||||
idea: "Original Idea",
|
||||
genres: [GenreStyle(id: "arabic-pop", name: "Arabic Pop")],
|
||||
bpm: ManualAutoValue(mode: .manual, value: 96),
|
||||
key: ManualAutoValue(mode: .auto),
|
||||
structureMode: .manual,
|
||||
sections: [section],
|
||||
instruments: [manualInstrument],
|
||||
lyrics: Lyrics(text: "Locked lyrics"),
|
||||
userLocks: SongProjectUserLocks(scopes: [.genres, .lyrics])
|
||||
)
|
||||
let response = StructuredSongProjectUpdateResponse(
|
||||
project: SongProjectSnapshot(
|
||||
title: "AI Title",
|
||||
idea: "AI Idea",
|
||||
genres: [GenreStyle(id: "rock", name: "Rock")],
|
||||
bpm: ManualAutoValue(mode: .auto, value: 120),
|
||||
key: ManualAutoValue(mode: .auto, value: "A"),
|
||||
sections: [SongSection(id: "chorus", type: .chorus, title: "AI Chorus")],
|
||||
instruments: [
|
||||
InstrumentTrack(
|
||||
instrumentId: "oud",
|
||||
selected: true,
|
||||
role: "AI lead",
|
||||
placements: [InstrumentPlacement(sectionId: "chorus", direction: "AI entry")]
|
||||
)
|
||||
],
|
||||
lyrics: Lyrics(text: "AI lyrics")
|
||||
),
|
||||
changedScopes: [.genres, .lyrics, .instruments, .musicalParameters, .structure, .arrangement]
|
||||
)
|
||||
|
||||
let result = response.makeUpdateResult(
|
||||
updating: existingProject,
|
||||
updatedAt: Date(timeIntervalSince1970: 500)
|
||||
)
|
||||
|
||||
XCTAssertEqual(result.project.title, "Original Title")
|
||||
XCTAssertEqual(result.project.idea, "Original Idea")
|
||||
XCTAssertEqual(result.project.genres, existingProject.genres)
|
||||
XCTAssertEqual(result.project.lyrics, existingProject.lyrics)
|
||||
XCTAssertEqual(result.project.bpm, existingProject.bpm)
|
||||
XCTAssertEqual(result.project.key, ManualAutoValue(mode: .auto, value: "A"))
|
||||
XCTAssertEqual(result.project.sections, existingProject.sections)
|
||||
XCTAssertEqual(result.project.instruments, existingProject.instruments)
|
||||
XCTAssertEqual(result.project.userLocks, existingProject.userLocks)
|
||||
XCTAssertEqual(result.changedScopes, [.musicalParameters])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user