fix: unify location report state

This commit is contained in:
2026-07-07 16:24:26 +08:00
parent 9378748a4d
commit 97060c2a32
4 changed files with 143 additions and 10 deletions

View File

@ -10,9 +10,10 @@ import XCTest
final class HomeLocationStateStoreTests: XCTestCase {
private var appStore: AppStore!
private var defaults: UserDefaults!
override func setUp() {
let defaults = UserDefaults(suiteName: "HomeLocationStateStoreTests")!
defaults = UserDefaults(suiteName: "HomeLocationStateStoreTests")!
defaults.removePersistentDomain(forName: "HomeLocationStateStoreTests")
appStore = AppStore(defaults: defaults)
appStore.userId = "1001"
@ -63,4 +64,88 @@ final class HomeLocationStateStoreTests: XCTestCase {
// verify helper with manual expectation on threshold logic.
XCTAssertFalse(stateStore.shouldTriggerTimeoutReminder())
}
func testMultipleObserversReceiveStateChanges() {
let stateStore = HomeLocationStateStore(store: appStore)
let firstOwner = StateObserverOwner()
let secondOwner = StateObserverOwner()
var firstChangeCount = 0
var secondChangeCount = 0
stateStore.observe(firstOwner) { firstChangeCount += 1 }
stateStore.observe(secondOwner) { secondChangeCount += 1 }
stateStore.updateReminderMinutes(5)
XCTAssertEqual(firstChangeCount, 1)
XCTAssertEqual(secondChangeCount, 1)
stateStore.removeObserver(firstOwner)
stateStore.updateReminderMinutes(10)
XCTAssertEqual(firstChangeCount, 1)
XCTAssertEqual(secondChangeCount, 2)
}
func testViewModelsShareReminderMinutesWhenUsingSameStateStore() {
let stateStore = HomeLocationStateStore(store: appStore)
let homeViewModel = HomeViewModel(appStore: appStore, locationStateStore: stateStore)
let reportViewModel = LocationReportViewModel(
locationStateStore: stateStore,
locationProvider: MockLocationProvider()
)
homeViewModel.updateReminderMinutes(15)
XCTAssertEqual(reportViewModel.reminderMinutes, 15)
reportViewModel.updateReminderMinutes(5)
XCTAssertEqual(homeViewModel.reminderMinutes, 5)
}
func testViewModelsShareOnlineStateWhenUsingSameStateStore() {
let stateStore = HomeLocationStateStore(store: appStore)
let homeViewModel = HomeViewModel(appStore: appStore, locationStateStore: stateStore)
let reportViewModel = LocationReportViewModel(
locationStateStore: stateStore,
locationProvider: MockLocationProvider()
)
stateStore.startLocationReport(at: Int64(Date().timeIntervalSince1970 * 1000))
XCTAssertTrue(homeViewModel.isOnline)
XCTAssertTrue(reportViewModel.isOnline)
XCTAssertGreaterThan(stateStore.nextReportCountdownSeconds, 0)
stateStore.updateOnlineStatus(false)
XCTAssertFalse(homeViewModel.isOnline)
XCTAssertFalse(reportViewModel.isOnline)
}
func testRestoreClearsOnlineStateWhenStoredLastReportTimeIsMissing() {
appStore.onlineStatus = true
appStore.lastLocationReportTime = 0
let stateStore = HomeLocationStateStore(store: appStore)
stateStore.restoreStateIfNeeded()
XCTAssertFalse(stateStore.isOnline)
XCTAssertFalse(appStore.onlineStatus)
XCTAssertEqual(appStore.lastLocationReportTime, 0)
XCTAssertEqual(stateStore.nextReportCountdownSeconds, 0)
}
func testRestoreClearsRuntimeStateWhenPersistedOffline() {
let stateStore = HomeLocationStateStore(store: appStore)
stateStore.startLocationReport(at: Int64(Date().timeIntervalSince1970 * 1000))
appStore.onlineStatus = false
stateStore.restoreStateIfNeeded()
XCTAssertFalse(stateStore.isOnline)
XCTAssertEqual(stateStore.nextReportCountdownSeconds, 0)
}
}
private final class StateObserverOwner {}