Files
wehub-resource-sync 1d1286fadb
Build / Build and test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:18:38 +08:00

142 lines
4.7 KiB
Swift

import XCTest
@testable import ActivityBarPlugin
@MainActor
final class ActivityBarStatsStoreTests: XCTestCase {
private let inputDaysStorageKey = "activity-bar.input.days.v1"
func testInputStatsAggregateByDayAndApp() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
store.incrementKeystroke(app: "Terminal")
store.incrementPointerClick(app: "Terminal")
store.incrementScroll(app: "Safari")
store.addScreenTime(65, app: "Terminal")
XCTAssertEqual(store.today.date, "2026-05-18")
XCTAssertEqual(store.today.keystrokes, 1)
XCTAssertEqual(store.today.pointerClicks, 1)
XCTAssertEqual(store.today.scrollEvents, 1)
XCTAssertEqual(store.today.totalInputs, 3)
XCTAssertEqual(store.today.perApp["Terminal"]?.screenTimeSeconds, 65)
XCTAssertEqual(store.today.topApps.first?.name, "Terminal")
}
func testInputStatsPersistThroughStorage() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
store.incrementKeystroke(app: "Xcode")
store.flushPendingChanges()
let reloaded = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
XCTAssertEqual(reloaded.today.keystrokes, 1)
XCTAssertEqual(reloaded.today.perApp["Xcode"]?.keystrokes, 1)
}
func testInputStatsBatchPersistenceUntilFlush() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() },
persistenceDelay: .seconds(60)
)
store.incrementKeystroke(app: "Terminal")
store.incrementPointerClick(app: "Terminal")
store.incrementScroll(app: "Safari")
XCTAssertEqual(store.today.totalInputs, 3)
XCTAssertEqual(storage.setCallCount(forKey: "activity-bar.input.days.v1"), 0)
store.flushPendingChanges()
XCTAssertEqual(storage.setCallCount(forKey: "activity-bar.input.days.v1"), 1)
let reloaded = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
XCTAssertEqual(reloaded.today.totalInputs, 3)
}
func testResetTodayKeepsCurrentDateButClearsCounters() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
store.incrementKeystroke(app: "Terminal")
store.resetToday()
XCTAssertEqual(store.today.date, "2026-05-18")
XCTAssertEqual(store.today.totalInputs, 0)
XCTAssertTrue(store.today.perApp.isEmpty)
}
func testResetTodayPersistsClearedCountersAfterPreviousFlush() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() },
persistenceDelay: .seconds(60)
)
store.incrementKeystroke(app: "Terminal")
store.flushPendingChanges()
store.resetToday()
let reloaded = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
XCTAssertEqual(reloaded.today.date, "2026-05-18")
XCTAssertEqual(reloaded.today.totalInputs, 0)
XCTAssertTrue(reloaded.today.perApp.isEmpty)
}
func testFlushPendingChangesOnlyWritesWhenStatsAreDirty() {
let storage = ActivityBarMemoryStorage()
let store = ActivityBarStatsStore(
storage: storage,
calendar: activityBarTestCalendar(),
dateProvider: { activityBarTestDate() }
)
store.flushPendingChanges()
XCTAssertEqual(storage.setCallCount(forKey: inputDaysStorageKey), 0)
store.incrementKeystroke(app: "Terminal")
store.flushPendingChanges()
XCTAssertEqual(storage.setCallCount(forKey: inputDaysStorageKey), 1)
store.flushPendingChanges()
XCTAssertEqual(storage.setCallCount(forKey: inputDaysStorageKey), 1)
}
}