remindwall / RWPureSwift / Tests / EditSettingsNewTests / BusSettings / WatchDetailTests.swift
Back to remindwall — Current RemindWall
import AppTypes
import ComposableArchitecture
import Dao
import DependenciesTestSupport
import Foundation
import Testing
@testable import EditSettingsNew_BusSettings
@MainActor
@Suite("WatchDetail Feature Tests", .dependencies {
$0.defaultDatabase = try! $0.appDatabase()
$0.uuid = .incrementing
$0.date = .constant(Date(timeIntervalSince1970: 0))
})
struct WatchDetailTests {
private func seededRoute() async -> MonitoredRoute {
@Dependency(\.defaultDatabase) var database
@Dependency(\.uuid) var uuid
let route = MonitoredRoute(
id: MonitoredRoute.ID(uuid()), label: "School run",
destinationLatitude: 47.5423, destinationLongitude: -122.3866,
destinationName: "Maple Elementary", normalMinutes: 12, sortOrder: 0
)
try! await database.write { db in
try MonitoredRoute.insert { route }.execute(db)
}
return route
}
@Test("window edits persist to the watch's own row")
func windowEditPersists() async throws {
let route = await seededRoute()
@Dependency(\.defaultDatabase) var database
let store = TestStore(initialState: WatchDetailFeature.State(watch: .drive(route))) {
WatchDetailFeature()
}
store.exhaustivity = .off
await store.send(.setWindowStart(hour: 7, minute: 45))
await store.receive(\.delegate.watchChanged)
await store.send(.toggleWeekday(.Saturday))
await store.receive(\.delegate.watchChanged)
await store.finish()
let stored = try await database.read { db in
try MonitoredRoute.find(route.id).fetchOne(db)
}
let window = try #require(stored?.window)
#expect(window.startHour == 7)
#expect(window.startMinute == 45)
#expect(window.weekdays.contains(.Saturday))
#expect(store.state.watch.window == window)
}
@Test("enable toggle and normal minutes persist")
func enabledAndMinutesPersist() async throws {
let route = await seededRoute()
@Dependency(\.defaultDatabase) var database
let store = TestStore(initialState: WatchDetailFeature.State(watch: .drive(route))) {
WatchDetailFeature()
}
store.exhaustivity = .off
await store.send(.enabledToggled(false))
await store.receive(\.delegate.watchChanged)
await store.send(.normalMinutesChanged(25))
await store.receive(\.delegate.watchChanged)
await store.finish()
let stored = try await database.read { db in
try MonitoredRoute.find(route.id).fetchOne(db)
}
#expect(stored?.enabled == false)
#expect(stored?.normalMinutes == 25)
}
@Test("remove asks the parent instead of deleting itself")
func removeDelegates() async {
let route = await seededRoute()
let store = TestStore(initialState: WatchDetailFeature.State(watch: .drive(route))) {
WatchDetailFeature()
}
await store.send(.removeTapped)
await store.receive(.delegate(.removeRequested(.drive(route.id))))
}
}