Skip to content
Snippets Groups Projects
Commit 7f21e82a authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Make new identity in MyIdentityFeature

parent deb1f482
No related branches found
No related tags found
1 merge request!14[Example App] Make identity & contact
...@@ -52,6 +52,7 @@ extension AppEnvironment { ...@@ -52,6 +52,7 @@ extension AppEnvironment {
myIdentity: MyIdentityEnvironment( myIdentity: MyIdentityEnvironment(
getClient: { clientSubject.value }, getClient: { clientSubject.value },
observeIdentity: { identitySubject.eraseToAnyPublisher() }, observeIdentity: { identitySubject.eraseToAnyPublisher() },
updateIdentity: { identitySubject.value = $0 },
bgScheduler: bgScheduler, bgScheduler: bgScheduler,
mainScheduler: mainScheduler mainScheduler: mainScheduler
) )
......
...@@ -17,23 +17,28 @@ public enum MyIdentityAction: Equatable { ...@@ -17,23 +17,28 @@ public enum MyIdentityAction: Equatable {
case viewDidLoad case viewDidLoad
case observeMyIdentity case observeMyIdentity
case didUpdateMyIdentity(Identity?) case didUpdateMyIdentity(Identity?)
case makeIdentity
case didFailMakingIdentity(NSError)
} }
public struct MyIdentityEnvironment { public struct MyIdentityEnvironment {
public init( public init(
getClient: @escaping () -> Client?, getClient: @escaping () -> Client?,
observeIdentity: @escaping () -> AnyPublisher<Identity?, Never>, observeIdentity: @escaping () -> AnyPublisher<Identity?, Never>,
updateIdentity: @escaping (Identity?) -> Void,
bgScheduler: AnySchedulerOf<DispatchQueue>, bgScheduler: AnySchedulerOf<DispatchQueue>,
mainScheduler: AnySchedulerOf<DispatchQueue> mainScheduler: AnySchedulerOf<DispatchQueue>
) { ) {
self.getClient = getClient self.getClient = getClient
self.observeIdentity = observeIdentity self.observeIdentity = observeIdentity
self.updateIdentity = updateIdentity
self.bgScheduler = bgScheduler self.bgScheduler = bgScheduler
self.mainScheduler = mainScheduler self.mainScheduler = mainScheduler
} }
public var getClient: () -> Client? public var getClient: () -> Client?
public var observeIdentity: () -> AnyPublisher<Identity?, Never> public var observeIdentity: () -> AnyPublisher<Identity?, Never>
public var updateIdentity: (Identity?) -> Void
public var bgScheduler: AnySchedulerOf<DispatchQueue> public var bgScheduler: AnySchedulerOf<DispatchQueue>
public var mainScheduler: AnySchedulerOf<DispatchQueue> public var mainScheduler: AnySchedulerOf<DispatchQueue>
} }
...@@ -61,6 +66,23 @@ public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIden ...@@ -61,6 +66,23 @@ public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIden
case .didUpdateMyIdentity(let identity): case .didUpdateMyIdentity(let identity):
state.identity = identity state.identity = identity
return .none 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 { ...@@ -69,6 +91,7 @@ extension MyIdentityEnvironment {
public static let failing = MyIdentityEnvironment( public static let failing = MyIdentityEnvironment(
getClient: { fatalError() }, getClient: { fatalError() },
observeIdentity: { fatalError() }, observeIdentity: { fatalError() },
updateIdentity: { _ in fatalError() },
bgScheduler: .failing, bgScheduler: .failing,
mainScheduler: .failing mainScheduler: .failing
) )
......
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import CustomDump
import ElixxirDAppsSDK import ElixxirDAppsSDK
import XCTest import XCTest
@testable import MyIdentityFeature @testable import MyIdentityFeature
...@@ -43,6 +44,37 @@ final class MyIdentityFeatureTests: XCTestCase { ...@@ -43,6 +44,37 @@ final class MyIdentityFeatureTests: XCTestCase {
myIdentitySubject.send(completion: .finished) myIdentitySubject.send(completion: .finished)
mainScheduler.advance() 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 { private extension Identity {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment