fix: unify location report state
This commit is contained in:
@ -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 {}
|
||||
|
||||
Reference in New Issue
Block a user