Christopher Hotchkiss Christopher Hotchkiss
Login

Code

remindwall / RWPureSwift / Tests / EditSettingsNewTests / Reminders / RemindersTests.swift

Back to remindwall — Current RemindWall

Download this file

import AppTypes
import ComposableArchitecture
import Dao
import DependenciesTestSupport
import SQLiteData
import Testing


@testable import EditSettingsNew_Reminders

@MainActor
@Suite(.dependencies {
    $0.defaultDatabase = try! $0.appDatabase()
    $0.uuid = .incrementing
  })
struct RemindersFeatureTests {
    @Test("Create Reminder, save it, delete it")
    func fullLifeCycle() async throws {
        @Dependency(\.defaultDatabase) var defaultDatabase
        @Dependency(\.uuid) var uuid
        
        // Get a trackee so we can link okay
        let trackee = try! await defaultDatabase.read{ db in
            try! Trackee.all.fetchOne(db)!
        }
        
        let store = TestStore(initialState: RemindersFeature.State(trackee: trackee)) {
            RemindersFeature()
        } withDependencies: {
            $0.dismiss = DismissEffect {}
        }
        
        // Tap the add button
        await store.send(.addReminderButtonTapped) {
            $0.destination = .addReminder(AddReminderFeature.State(trackee: trackee))
        }
        
        // Increment the hour in the time picker
        await store.send(.destination(.presented(.addReminder(.timePicker(.incrementHour))))) {
            $0.destination?.addReminder?.$reminderPart.withLock {
                $0.hour += 1
            }
        }
        
        // Save the reminder
        await store.send(.destination(.presented(.addReminder(.saveButtonTapped))))
        
        // Wait for the delegate action to propagate
        await store.receive(\.destination.presented.addReminder.delegate.saveReminder)
        
        await store.receive(\.destination.dismiss){
            $0.destination = nil
        }
        
        await store.finish()
        
        // Get what was saved
        let savedReminders = try! await defaultDatabase.read { db in
            try! ReminderTime.where { $0.trackeeId.eq( trackee.id) }.fetchAll(db)
        }
        
        #expect(savedReminders.count == 1)
        
        if let savedReminder = savedReminders.first {
            #expect(savedReminder.trackeeId == trackee.id)
            #expect(savedReminder.weekDay == DaysOfWeek.Sunday.rawValue)
            #expect(savedReminder.hour == 2) // Started at 1, incremented by 1
            #expect(savedReminder.minute == 0)
            #expect(savedReminder.associatedTag == nil)
            #expect(savedReminder.lastScan == nil)
        }
    }
}