498f407585
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.
60 lines
2.1 KiB
Swift
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])
|
|
}
|
|
}
|