From 7f21e82a6b452b413b7127eda9b4dca04c1f8e7b Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Wed, 8 Jun 2022 13:27:36 +0200 Subject: [PATCH] Make new identity in MyIdentityFeature --- .../example-app/Sources/AppFeature/App.swift | 1 + .../MyIdentityFeature/MyIdentityFeature.swift | 23 +++++++++++++ .../MyIdentityFeatureTests.swift | 32 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/Example/example-app/Sources/AppFeature/App.swift b/Example/example-app/Sources/AppFeature/App.swift index 37007c70..7a4d3ca9 100644 --- a/Example/example-app/Sources/AppFeature/App.swift +++ b/Example/example-app/Sources/AppFeature/App.swift @@ -52,6 +52,7 @@ extension AppEnvironment { myIdentity: MyIdentityEnvironment( getClient: { clientSubject.value }, observeIdentity: { identitySubject.eraseToAnyPublisher() }, + updateIdentity: { identitySubject.value = $0 }, bgScheduler: bgScheduler, mainScheduler: mainScheduler ) diff --git a/Example/example-app/Sources/MyIdentityFeature/MyIdentityFeature.swift b/Example/example-app/Sources/MyIdentityFeature/MyIdentityFeature.swift index 4fe79ffd..bb58876e 100644 --- a/Example/example-app/Sources/MyIdentityFeature/MyIdentityFeature.swift +++ b/Example/example-app/Sources/MyIdentityFeature/MyIdentityFeature.swift @@ -17,23 +17,28 @@ public enum MyIdentityAction: Equatable { case viewDidLoad case observeMyIdentity case didUpdateMyIdentity(Identity?) + case makeIdentity + case didFailMakingIdentity(NSError) } public struct MyIdentityEnvironment { public init( getClient: @escaping () -> Client?, observeIdentity: @escaping () -> AnyPublisher<Identity?, Never>, + updateIdentity: @escaping (Identity?) -> Void, bgScheduler: AnySchedulerOf<DispatchQueue>, mainScheduler: AnySchedulerOf<DispatchQueue> ) { self.getClient = getClient self.observeIdentity = observeIdentity + self.updateIdentity = updateIdentity self.bgScheduler = bgScheduler self.mainScheduler = mainScheduler } public var getClient: () -> Client? public var observeIdentity: () -> AnyPublisher<Identity?, Never> + public var updateIdentity: (Identity?) -> Void public var bgScheduler: AnySchedulerOf<DispatchQueue> public var mainScheduler: AnySchedulerOf<DispatchQueue> } @@ -61,6 +66,23 @@ public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIden case .didUpdateMyIdentity(let identity): state.identity = identity return .none + + case .makeIdentity: + return Effect.run { subscriber in + do { + env.updateIdentity(try env.getClient()?.makeIdentity()) + } catch { + subscriber.send(.didFailMakingIdentity(error as NSError)) + } + subscriber.send(completion: .finished) + return AnyCancellable {} + } + .subscribe(on: env.bgScheduler) + .receive(on: env.mainScheduler) + .eraseToEffect() + + case .didFailMakingIdentity(let error): + return .none } } @@ -69,6 +91,7 @@ extension MyIdentityEnvironment { public static let failing = MyIdentityEnvironment( getClient: { fatalError() }, observeIdentity: { fatalError() }, + updateIdentity: { _ in fatalError() }, bgScheduler: .failing, mainScheduler: .failing ) diff --git a/Example/example-app/Tests/MyIdentityFeatureTests/MyIdentityFeatureTests.swift b/Example/example-app/Tests/MyIdentityFeatureTests/MyIdentityFeatureTests.swift index d3fcdc08..325c1631 100644 --- a/Example/example-app/Tests/MyIdentityFeatureTests/MyIdentityFeatureTests.swift +++ b/Example/example-app/Tests/MyIdentityFeatureTests/MyIdentityFeatureTests.swift @@ -1,5 +1,6 @@ import Combine import ComposableArchitecture +import CustomDump import ElixxirDAppsSDK import XCTest @testable import MyIdentityFeature @@ -43,6 +44,37 @@ final class MyIdentityFeatureTests: XCTestCase { myIdentitySubject.send(completion: .finished) mainScheduler.advance() } + + func testMakeIdentity() { + let newIdentity = Identity.stub() + var didUpdateIdentity = [Identity?]() + let bgScheduler = DispatchQueue.test + let mainScheduler = DispatchQueue.test + + var env = MyIdentityEnvironment.failing + env.getClient = { + var client = Client.failing + client.makeIdentity.make = { newIdentity } + return client + } + env.updateIdentity = { didUpdateIdentity.append($0) } + env.bgScheduler = bgScheduler.eraseToAnyScheduler() + env.mainScheduler = mainScheduler.eraseToAnyScheduler() + + let store = TestStore( + initialState: MyIdentityState(id: UUID()), + reducer: myIdentityReducer, + environment: env + ) + + store.send(.makeIdentity) + + bgScheduler.advance() + + XCTAssertNoDifference(didUpdateIdentity, [newIdentity]) + + mainScheduler.advance() + } } private extension Identity { -- GitLab