Christopher Hotchkiss Christopher Hotchkiss
Login

Code

remindwall / RWPureSwift / Tests / EditSettingsNewTests / BusSettings / AddDriveTests.swift

Back to remindwall — Current RemindWall

Download this file

import ComposableArchitecture
import Dao
import DependenciesTestSupport
import Foundation
import Testing
import TrafficAPI

@testable import EditSettingsNew_BusSettings

@MainActor
@Suite("AddDrive Feature Tests", .dependencies {
    $0.defaultDatabase = try! $0.appDatabase()
    $0.uuid = .incrementing
})
struct AddDriveTests {

    @Test("search loads results; selecting fills the label")
    func searchAndSelect() async {
        let store = TestStore(initialState: AddDriveFeature.State(sortOrder: 0)) {
            AddDriveFeature()
        } withDependencies: {
            $0.placeSearch.search = { _ in [schoolPlace] }
        }

        await store.send(.queryChanged("maple")) {
            $0.query = "maple"
        }
        await store.send(.searchTapped) {
            $0.isSearching = true
        }
        await store.receive(\._resultsLoaded) {
            $0.isSearching = false
            $0.results = [schoolPlace]
        }
        await store.send(.placeSelected(schoolPlace)) {
            $0.selectedPlace = schoolPlace
            $0.label = "Maple Elementary"
        }
        #expect(store.state.canSave)
    }

    @Test("save emits a draft carrying coords, label and normal minutes")
    func saveDraft() async {
        var state = AddDriveFeature.State(sortOrder: 3)
        state.selectedPlace = schoolPlace
        state.label = "School run"
        state.normalMinutes = 12

        let store = TestStore(initialState: state) {
            AddDriveFeature()
        }
        store.exhaustivity = .off

        await store.send(.saveButtonTapped)
        await store.receive(.delegate(.saveRoute(
            MonitoredRoute.Draft(
                label: "School run",
                destinationLatitude: 47.5423, destinationLongitude: -122.3866,
                destinationName: "Maple Elementary", normalMinutes: 12, sortOrder: 3,
                window: nil, enabled: true
            )
        )))
    }

    @Test("a failed search surfaces the error, an empty one says so")
    func searchFailures() async {
        let store = TestStore(initialState: AddDriveFeature.State(sortOrder: 0)) {
            AddDriveFeature()
        } withDependencies: {
            $0.placeSearch.search = { _ in [] }
        }

        await store.send(.queryChanged("nowhere")) { $0.query = "nowhere" }
        await store.send(.searchTapped) { $0.isSearching = true }
        await store.receive(\._resultsLoaded) {
            $0.isSearching = false
            $0.errorMessage = "No places found"
        }
    }
}

private let schoolPlace = FoundPlace(
    id: "p1", name: "Maple Elementary", address: "402 School Rd, Seattle",
    latitude: 47.5423, longitude: -122.3866
)