Skip to content

Commit 44dc081

Browse files
mbrandonwmluisbrown
authored andcommitted
Update voice memo test dependencies directly on store. (#1261)
(cherry picked from commit 3b96255304f2717e672a99db0058bd601c6ec6e0) # Conflicts: # Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift
1 parent 52938a0 commit 44dc081

File tree

3 files changed

+48
-52
lines changed

3 files changed

+48
-52
lines changed

Examples/VoiceMemos/VoiceMemos/RecordingMemo.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ComposableArchitecture
2+
import ReactiveSwift
23
import SwiftUI
34

45
struct RecordingMemoState: Equatable {
@@ -30,7 +31,7 @@ enum RecordingMemoAction: Equatable {
3031

3132
struct RecordingMemoEnvironment {
3233
var audioRecorder: AudioRecorderClient
33-
var mainRunLoop: AnySchedulerOf<RunLoop>
34+
var mainRunLoop: DateScheduler
3435
}
3536

3637
let recordingMemoReducer = Reducer<

Examples/VoiceMemos/VoiceMemos/VoiceMemos.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ let voiceMemosReducer = Reducer<VoiceMemosState, VoiceMemosAction, VoiceMemosEnv
7878

7979
case .allowed:
8080
state.recordingMemo = RecordingMemoState(
81-
date: environment.mainRunLoop.now.date,
81+
date: environment.mainRunLoop.currentDate,
8282
url: environment.temporaryDirectory()
8383
.appendingPathComponent(environment.uuid().uuidString)
8484
.appendingPathExtension("m4a")
@@ -110,7 +110,7 @@ let voiceMemosReducer = Reducer<VoiceMemosState, VoiceMemosAction, VoiceMemosEnv
110110
state.audioRecorderPermission = permission ? .allowed : .denied
111111
if permission {
112112
state.recordingMemo = RecordingMemoState(
113-
date: environment.mainRunLoop.now.date,
113+
date: environment.mainRunLoop.currentDate,
114114
url: environment.temporaryDirectory()
115115
.appendingPathComponent(environment.uuid().uuidString)
116116
.appendingPathExtension("m4a")

Examples/VoiceMemos/VoiceMemosTests/VoiceMemosTests.swift

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,26 @@ class VoiceMemosTests: XCTestCase {
1414
// NB: Combine's concatenation behavior is different in 13.3
1515
guard #available(iOS 13.4, *) else { return }
1616

17+
let store = TestStore(
18+
initialState: VoiceMemosState(),
19+
reducer: voiceMemosReducer,
20+
environment: .unimplemented
21+
)
22+
1723
let didFinish = AsyncThrowingStream<Bool, Error>.streamWithContinuation()
1824

19-
var environment = VoiceMemosEnvironment.unimplemented
20-
environment.audioRecorder.currentTime = { 2.5 }
21-
environment.audioRecorder.requestRecordPermission = { true }
22-
environment.audioRecorder.startRecording = { _ in
25+
store.environment.audioRecorder.currentTime = { 2.5 }
26+
store.environment.audioRecorder.requestRecordPermission = { true }
27+
store.environment.audioRecorder.startRecording = { _ in
2328
try await didFinish.stream.first { _ in true }!
2429
}
25-
environment.audioRecorder.stopRecording = {
30+
store.environment.audioRecorder.stopRecording = {
2631
didFinish.continuation.yield(true)
2732
didFinish.continuation.finish()
2833
}
29-
environment.mainRunLoop = mainRunLoop
30-
environment.temporaryDirectory = { URL(fileURLWithPath: "/tmp") }
31-
environment.uuid = { UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")! }
32-
33-
let store = TestStore(
34-
initialState: VoiceMemosState(),
35-
reducer: voiceMemosReducer,
36-
environment: environment
37-
)
34+
store.environment.mainRunLoop = self.mainRunLoop
35+
store.environment.temporaryDirectory = { URL(fileURLWithPath: "/tmp") }
36+
store.environment.uuid = { UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")! }
3837

3938
await store.send(.recordButtonTapped)
4039
await self.mainRunLoop.advance()
@@ -82,17 +81,16 @@ class VoiceMemosTests: XCTestCase {
8281
func testPermissionDenied() async {
8382
let didOpenSettings = ActorIsolated(false)
8483

85-
var environment = VoiceMemosEnvironment.unimplemented
86-
environment.audioRecorder.requestRecordPermission = { false }
87-
environment.mainRunLoop = mainRunLoop
88-
environment.openSettings = { await didOpenSettings.setValue(true) }
89-
9084
let store = TestStore(
9185
initialState: VoiceMemosState(),
9286
reducer: voiceMemosReducer,
93-
environment: environment
87+
environment: .unimplemented
9488
)
9589

90+
store.environment.audioRecorder.requestRecordPermission = { false }
91+
store.environment.mainRunLoop = ImmediateScheduler()
92+
store.environment.openSettings = { await didOpenSettings.setValue(true) }
93+
9694
await store.send(.recordButtonTapped)
9795
await store.receive(.recordPermissionResponse(false)) {
9896
$0.alert = AlertState(title: TextState("Permission is required to record voice memos."))
@@ -107,24 +105,23 @@ class VoiceMemosTests: XCTestCase {
107105

108106
func testRecordMemoFailure() async {
109107
struct SomeError: Error, Equatable {}
110-
let didFinish = AsyncThrowingStream<Bool, Error>.streamWithContinuation()
111-
112-
var environment = VoiceMemosEnvironment.unimplemented
113-
environment.audioRecorder.currentTime = { 2.5 }
114-
environment.audioRecorder.requestRecordPermission = { true }
115-
environment.audioRecorder.startRecording = { _ in
116-
try await didFinish.stream.first { _ in true }!
117-
}
118-
environment.mainRunLoop = TestScheduler(startDate: Date(timeIntervalSince1970: 0))
119-
environment.temporaryDirectory = { URL(fileURLWithPath: "/tmp") }
120-
environment.uuid = { UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")! }
121108

122109
let store = TestStore(
123110
initialState: VoiceMemosState(),
124111
reducer: voiceMemosReducer,
125-
environment: environment
112+
environment: .unimplemented
126113
)
127114

115+
let didFinish = AsyncThrowingStream<Bool, Error>.streamWithContinuation()
116+
117+
store.environment.audioRecorder.requestRecordPermission = { true }
118+
store.environment.audioRecorder.startRecording = { _ in
119+
try await didFinish.stream.first { _ in true }!
120+
}
121+
store.environment.mainRunLoop = TestScheduler(startDate: Date(timeIntervalSince1970: 0))
122+
store.environment.temporaryDirectory = { URL(fileURLWithPath: "/tmp") }
123+
store.environment.uuid = { UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")! }
124+
128125
await store.send(.recordButtonTapped)
129126
await self.mainRunLoop.advance(by: 0.5)
130127
await store.receive(.recordPermissionResponse(true)) {
@@ -149,13 +146,6 @@ class VoiceMemosTests: XCTestCase {
149146
}
150147

151148
func testPlayMemoHappyPath() async {
152-
var environment = VoiceMemosEnvironment.unimplemented
153-
environment.audioPlayer.play = { _ in
154-
try await self.mainRunLoop.sleep(for: .milliseconds(1250))
155-
return true
156-
}
157-
environment.mainRunLoop = mainRunLoop
158-
159149
let url = URL(fileURLWithPath: "pointfreeco/functions.m4a")
160150
let store = TestStore(
161151
initialState: VoiceMemosState(
@@ -170,9 +160,15 @@ class VoiceMemosTests: XCTestCase {
170160
]
171161
),
172162
reducer: voiceMemosReducer,
173-
environment: environment
163+
environment: .unimplemented
174164
)
175165

166+
store.environment.audioPlayer.play = { _ in
167+
try await self.mainRunLoop.sleep(for: .milliseconds(1250))
168+
return true
169+
}
170+
store.environment.mainRunLoop = self.mainRunLoop
171+
176172
let task = await store.send(.voiceMemo(id: url, action: .playButtonTapped)) {
177173
$0.voiceMemos[id: url]?.mode = .playing(progress: 0)
178174
}
@@ -194,10 +190,6 @@ class VoiceMemosTests: XCTestCase {
194190
func testPlayMemoFailure() async {
195191
struct SomeError: Error, Equatable {}
196192

197-
var environment = VoiceMemosEnvironment.unimplemented
198-
environment.audioPlayer.play = { _ in throw SomeError() }
199-
environment.mainRunLoop = mainRunLoop
200-
201193
let url = URL(fileURLWithPath: "pointfreeco/functions.m4a")
202194
let store = TestStore(
203195
initialState: VoiceMemosState(
@@ -212,9 +204,12 @@ class VoiceMemosTests: XCTestCase {
212204
]
213205
),
214206
reducer: voiceMemosReducer,
215-
environment: environment
207+
environment: .unimplemented
216208
)
217209

210+
store.environment.audioPlayer.play = { _ in throw SomeError() }
211+
store.environment.mainRunLoop = self.mainRunLoop
212+
218213
let task = await store.send(.voiceMemo(id: url, action: .playButtonTapped)) {
219214
$0.voiceMemos[id: url]?.mode = .playing(progress: 0)
220215
}
@@ -273,9 +268,6 @@ class VoiceMemosTests: XCTestCase {
273268

274269
func testDeleteMemoWhilePlaying() async {
275270
let url = URL(fileURLWithPath: "pointfreeco/functions.m4a")
276-
var environment = VoiceMemosEnvironment.unimplemented
277-
environment.audioPlayer.play = { _ in try await Task.never() }
278-
environment.mainRunLoop = mainRunLoop
279271

280272
let store = TestStore(
281273
initialState: VoiceMemosState(
@@ -290,9 +282,12 @@ class VoiceMemosTests: XCTestCase {
290282
]
291283
),
292284
reducer: voiceMemosReducer,
293-
environment: environment
285+
environment: .unimplemented
294286
)
295287

288+
store.environment.audioPlayer.play = { _ in try await Task.never() }
289+
store.environment.mainRunLoop = self.mainRunLoop
290+
296291
await store.send(.voiceMemo(id: url, action: .playButtonTapped)) {
297292
$0.voiceMemos[id: url]?.mode = .playing(progress: 0)
298293
}

0 commit comments

Comments
 (0)