fix: history load notifies and never overwrites unreadable file; dictionary keeps ids across external edits, undo safety
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,20 @@ struct HistoryViewModelTests {
|
||||
return store
|
||||
}
|
||||
|
||||
@Test func daysAreFilledAfterTheStoreLoads() {
|
||||
let url = FileManager.default.temporaryDirectory.appending(path: "sst-vm-\(UUID().uuidString)/h.json")
|
||||
let writer = HistoryStore(fileURL: url)
|
||||
writer.add(HistoryEntry(date: .now, duration: 1, rawText: "x", finalText: "x"))
|
||||
writer.flush()
|
||||
let store = HistoryStore(fileURL: url)
|
||||
let model = HistoryViewModel(store: store)
|
||||
store.onChange = { model.refresh() }
|
||||
#expect(model.days.isEmpty)
|
||||
store.load()
|
||||
#expect(!model.days.isEmpty)
|
||||
#expect(model.totalCount == 1)
|
||||
}
|
||||
|
||||
@Test func listsAllEntriesNewestFirstAndFiltersByQuery() {
|
||||
let model = HistoryViewModel(store: store(["eerste", "tweede zin", "derde"]))
|
||||
#expect(model.totalCount == 3)
|
||||
@@ -152,6 +166,31 @@ struct DictionaryViewModelTests {
|
||||
#expect(store.entries == [term("Supabase")])
|
||||
}
|
||||
|
||||
@Test func externalChangeClearsUndo() throws {
|
||||
let (model, store) = try makeModel("Supabase\n")
|
||||
model.add(.term("Vercel"))
|
||||
#expect(model.canUndo)
|
||||
model.externalChangeDetected()
|
||||
#expect(!model.canUndo)
|
||||
model.undo()
|
||||
#expect(store.entries == [term("Supabase"), term("Vercel")])
|
||||
}
|
||||
|
||||
@Test func failedUndoKeepsTheSnapshot() throws {
|
||||
let (model, store) = try makeModel("Supabase\n")
|
||||
model.add(.term("Vercel"))
|
||||
let folder = store.fileURL.deletingLastPathComponent()
|
||||
try FileManager.default.setAttributes([.posixPermissions: 0o500], ofItemAtPath: folder.path)
|
||||
model.undo()
|
||||
try FileManager.default.setAttributes([.posixPermissions: 0o700], ofItemAtPath: folder.path)
|
||||
#expect(model.errorMessage != nil)
|
||||
#expect(model.canUndo)
|
||||
model.errorMessage = nil
|
||||
model.undo()
|
||||
#expect(store.entries == [term("Supabase")])
|
||||
#expect(!model.canUndo)
|
||||
}
|
||||
|
||||
@Test func searchMatchesBothSidesIgnoringCaseAndDiacritics() throws {
|
||||
let (model, _) = try makeModel("cloud code => Claude Code\nCafé\nVercel\n")
|
||||
model.query = "CLAUDE"
|
||||
|
||||
Reference in New Issue
Block a user