Files
OSGKeyboard/OSGKeyboardTests/SpeechHistoryDayDeletionTests.swift
Rocky 498f407585 feat(account): add managed credits and cloud gateway
Introduce optional Apple account-backed credits with scoped gateway access while preserving local and BYOK paths. Refresh assistant behavior, tests, privacy disclosures, docs, and the website for the 2.0 experience.
2026-08-20 11:43:21 +08:00

60 lines
2.1 KiB
Swift

// SpeechHistoryDayDeletionTests.swift
// OSGKeyboardTests
//
// Day-boundary and tombstone coverage for History's delete-day action.
@testable import OSGKeyboardShared
import XCTest
@MainActor
final class SpeechHistoryDayDeletionTests: XCTestCase {
func testDeleteEntriesRemovesOnlySelectedLocalDayAndRecordsTombstones() {
let suiteName = "group.com.osgkeyboard.shared.tests.delete-day.\(UUID().uuidString)"
let defaults = UserDefaults(suiteName: suiteName)!
defaults.removePersistentDomain(forName: suiteName)
defer { defaults.removePersistentDomain(forName: suiteName) }
let calendar = Calendar.current
let selectedDay = Date(timeIntervalSince1970: 1_752_163_200)
let start = calendar.startOfDay(for: selectedDay)
let end = calendar.date(byAdding: .day, value: 1, to: start)!
let previous = SpeechHistoryEntry(
text: "previous",
createdAt: start.addingTimeInterval(-1)
)
let firstSelected = SpeechHistoryEntry(
text: "first selected",
createdAt: start.addingTimeInterval(1)
)
let lastSelected = SpeechHistoryEntry(
text: "last selected",
createdAt: end.addingTimeInterval(-1)
)
let next = SpeechHistoryEntry(
text: "next",
createdAt: end
)
SpeechHistoryStorage.save(
SyncedSpeechHistory(
entries: [next, lastSelected, firstSelected, previous]
),
to: defaults
)
let store = SpeechHistoryStore(defaults: defaults)
store.deleteEntries(on: selectedDay)
let persisted = SpeechHistoryStorage.load(from: defaults)
XCTAssertEqual(
Set(persisted.entries.map(\.id)),
Set([previous.id, next.id])
)
XCTAssertNotNil(persisted.deletedEntryIDs[firstSelected.id])
XCTAssertNotNil(persisted.deletedEntryIDs[lastSelected.id])
XCTAssertNil(persisted.deletedEntryIDs[previous.id])
XCTAssertNil(persisted.deletedEntryIDs[next.id])
}
}