Files
swift-composable-architectu…/Examples/SyncUps/SyncUpsTests/AppFeatureTests.swift
Stephen Celis 57e804f1cc Macro bonanza (#2553)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Silence test warnings

* wip

* wip

* wip

* update a bunch of docs

* wip

* wip

* fix

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Kill integration tests for now

* wip

* wip

* wip

* wip

* updating docs for @Reducer macro

* replaced more Reducer protocols with @Reducer

* Fixed some broken docc references

* wip

* Some @Reducer docs

* more docs

* convert some old styles to new style

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* bump

* update tutorials to use body

* update tutorials to use DML on destination state enum

* Add diagnostic

* wip

* updated a few more tests

* wip

* wip

* Add another gotcha

* wip

* wip

* wip

* fixes

* wip

* wip

* wip

* wip

* wip

* fix

* wip

* remove for now

* wip

* wip

* updated some docs

* migration guides

* more migration guide

* fix ci

* fix

* soft deprecate all apis using AnyCasePath

* wip

* Fix

* fix tests

* swift-format 509 compatibility

* wip

* wip

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>

* wip

* wip

* update optional state case study

* remove initializer

* Don't use @State for BasicsView integration demo

* fix tests

* remove reduce diagnostics for now

* diagnose error not warning

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Jesse Tipton <jesse@jessetipton.com>

* wip

* move integration tests to cron

* Revert "move integration tests to cron"

This reverts commit f9bdf2f04b.

* disable flakey tests on CI

* wip

* wip

* Revert "Revert "move integration tests to cron""

This reverts commit 66aafa7327.

* fix

* wip

* fix

---------

Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: Jesse Tipton <jesse@jessetipton.com>
2023-11-13 12:57:35 -08:00

152 lines
4.5 KiB
Swift

import ComposableArchitecture
import XCTest
@testable import SyncUps
@MainActor
final class AppFeatureTests: XCTestCase {
func testDelete() async throws {
let syncUp = SyncUp.mock
let store = TestStore(initialState: AppFeature.State()) {
AppFeature()
} withDependencies: {
$0.continuousClock = ImmediateClock()
$0.dataManager = .mock(
initialData: try! JSONEncoder().encode([syncUp])
)
}
await store.send(.path(.push(id: 0, state: .detail(SyncUpDetail.State(syncUp: syncUp))))) {
$0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: syncUp))
}
await store.send(.path(.element(id: 0, action: .detail(.deleteButtonTapped)))) {
$0.path[id: 0, case: \.detail]?.destination = .alert(.deleteSyncUp)
}
await store.send(
.path(.element(id: 0, action: .detail(.destination(.presented(.alert(.confirmDeletion))))))
) {
$0.path[id: 0, case: \.detail]?.destination = nil
}
await store.receive(\.path[id:0].detail.delegate.deleteSyncUp) {
$0.syncUpsList.syncUps = []
}
await store.receive(\.path.popFrom) {
$0.path = StackState()
}
}
func testDetailEdit() async throws {
var syncUp = SyncUp.mock
let savedData = LockIsolated(Data?.none)
let store = TestStore(initialState: AppFeature.State()) {
AppFeature()
} withDependencies: { dependencies in
dependencies.continuousClock = ImmediateClock()
dependencies.dataManager = .mock(
initialData: try! JSONEncoder().encode([syncUp])
)
dependencies.dataManager.save = { [dependencies] data, url in
savedData.setValue(data)
try await dependencies.dataManager.save(data, url)
}
}
await store.send(.path(.push(id: 0, state: .detail(SyncUpDetail.State(syncUp: syncUp))))) {
$0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: syncUp))
}
await store.send(.path(.element(id: 0, action: .detail(.editButtonTapped)))) {
$0.path[id: 0, case: \.detail]?.destination = .edit(
SyncUpForm.State(syncUp: syncUp)
)
}
syncUp.title = "Blob"
await store.send(
.path(
.element(
id: 0,
action: .detail(.destination(.presented(.edit(.set(\.$syncUp, syncUp)))))
)
)
) {
$0.path[id: 0, case: \.detail]?.$destination[case: \.edit]?.syncUp.title = "Blob"
}
await store.send(.path(.element(id: 0, action: .detail(.doneEditingButtonTapped)))) {
$0.path[id: 0, case: \.detail]?.destination = nil
$0.path[id: 0, case: \.detail]?.syncUp.title = "Blob"
}
await store.receive(\.path[id:0].detail.delegate.syncUpUpdated) {
$0.syncUpsList.syncUps[0].title = "Blob"
}
var savedSyncUp = syncUp
savedSyncUp.title = "Blob"
XCTAssertNoDifference(
try JSONDecoder().decode([SyncUp].self, from: savedData.value!),
[savedSyncUp]
)
}
func testRecording() async {
let speechResult = SpeechRecognitionResult(
bestTranscription: Transcription(formattedString: "I completed the project"),
isFinal: true
)
let syncUp = SyncUp(
id: SyncUp.ID(),
attendees: [
Attendee(id: Attendee.ID()),
Attendee(id: Attendee.ID()),
Attendee(id: Attendee.ID()),
],
duration: .seconds(6)
)
let store = TestStore(
initialState: AppFeature.State(
path: StackState([
.detail(SyncUpDetail.State(syncUp: syncUp)),
.record(RecordMeeting.State(syncUp: syncUp)),
])
)
) {
AppFeature()
} withDependencies: {
$0.dataManager = .mock(initialData: try! JSONEncoder().encode([syncUp]))
$0.date.now = Date(timeIntervalSince1970: 1_234_567_890)
$0.continuousClock = ImmediateClock()
$0.speechClient.authorizationStatus = { .authorized }
$0.speechClient.startTask = { _ in
AsyncThrowingStream { continuation in
continuation.yield(speechResult)
continuation.finish()
}
}
$0.uuid = .incrementing
}
store.exhaustivity = .off
await store.send(.path(.element(id: 1, action: .record(.onTask))))
await store.receive(\.path[id:1].record.delegate.save) {
$0.path[id: 0, case: \.detail]?.syncUp.meetings = [
Meeting(
id: Meeting.ID(UUID(0)),
date: Date(timeIntervalSince1970: 1_234_567_890),
transcript: "I completed the project"
)
]
}
await store.receive(\.path.popFrom) {
XCTAssertEqual($0.path.count, 1)
}
}
}