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

Handle failures when making identity

parent 7f21e82a
No related branches found
No related tags found
1 merge request!14[Example App] Make identity & contact
...@@ -140,10 +140,15 @@ let package = Package( ...@@ -140,10 +140,15 @@ let package = Package(
.target( .target(
name: "MyIdentityFeature", name: "MyIdentityFeature",
dependencies: [ dependencies: [
.target(name: "ErrorFeature"),
.product( .product(
name: "ComposableArchitecture", name: "ComposableArchitecture",
package: "swift-composable-architecture" package: "swift-composable-architecture"
), ),
.product(
name: "ComposablePresentation",
package: "swift-composable-presentation"
),
.product( .product(
name: "ElixxirDAppsSDK", name: "ElixxirDAppsSDK",
package: "elixxir-dapps-sdk-swift" package: "elixxir-dapps-sdk-swift"
......
...@@ -54,7 +54,8 @@ extension AppEnvironment { ...@@ -54,7 +54,8 @@ extension AppEnvironment {
observeIdentity: { identitySubject.eraseToAnyPublisher() }, observeIdentity: { identitySubject.eraseToAnyPublisher() },
updateIdentity: { identitySubject.value = $0 }, updateIdentity: { identitySubject.value = $0 },
bgScheduler: bgScheduler, bgScheduler: bgScheduler,
mainScheduler: mainScheduler mainScheduler: mainScheduler,
error: ErrorEnvironment()
) )
) )
) )
......
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation
import ElixxirDAppsSDK import ElixxirDAppsSDK
import ErrorFeature
public struct MyIdentityState: Equatable { public struct MyIdentityState: Equatable {
public init( public init(
id: UUID id: UUID,
error: ErrorState? = nil
) { ) {
self.id = id self.id = id
self.error = error
} }
public var id: UUID public var id: UUID
public var identity: Identity? public var identity: Identity?
public var error: ErrorState?
} }
public enum MyIdentityAction: Equatable { public enum MyIdentityAction: Equatable {
...@@ -19,6 +24,8 @@ public enum MyIdentityAction: Equatable { ...@@ -19,6 +24,8 @@ public enum MyIdentityAction: Equatable {
case didUpdateMyIdentity(Identity?) case didUpdateMyIdentity(Identity?)
case makeIdentity case makeIdentity
case didFailMakingIdentity(NSError) case didFailMakingIdentity(NSError)
case didDismissError
case error(ErrorAction)
} }
public struct MyIdentityEnvironment { public struct MyIdentityEnvironment {
...@@ -27,13 +34,15 @@ public struct MyIdentityEnvironment { ...@@ -27,13 +34,15 @@ public struct MyIdentityEnvironment {
observeIdentity: @escaping () -> AnyPublisher<Identity?, Never>, observeIdentity: @escaping () -> AnyPublisher<Identity?, Never>,
updateIdentity: @escaping (Identity?) -> Void, updateIdentity: @escaping (Identity?) -> Void,
bgScheduler: AnySchedulerOf<DispatchQueue>, bgScheduler: AnySchedulerOf<DispatchQueue>,
mainScheduler: AnySchedulerOf<DispatchQueue> mainScheduler: AnySchedulerOf<DispatchQueue>,
error: ErrorEnvironment
) { ) {
self.getClient = getClient self.getClient = getClient
self.observeIdentity = observeIdentity self.observeIdentity = observeIdentity
self.updateIdentity = updateIdentity self.updateIdentity = updateIdentity
self.bgScheduler = bgScheduler self.bgScheduler = bgScheduler
self.mainScheduler = mainScheduler self.mainScheduler = mainScheduler
self.error = error
} }
public var getClient: () -> Client? public var getClient: () -> Client?
...@@ -41,6 +50,7 @@ public struct MyIdentityEnvironment { ...@@ -41,6 +50,7 @@ public struct MyIdentityEnvironment {
public var updateIdentity: (Identity?) -> Void 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>
public var error: ErrorEnvironment
} }
public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIdentityEnvironment> public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIdentityEnvironment>
...@@ -81,10 +91,22 @@ public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIden ...@@ -81,10 +91,22 @@ public let myIdentityReducer = Reducer<MyIdentityState, MyIdentityAction, MyIden
.receive(on: env.mainScheduler) .receive(on: env.mainScheduler)
.eraseToEffect() .eraseToEffect()
case .didDismissError:
state.error = nil
return .none
case .didFailMakingIdentity(let error): case .didFailMakingIdentity(let error):
state.error = ErrorState(error: error)
return .none return .none
} }
} }
.presenting(
errorReducer,
state: .keyPath(\.error),
id: .keyPath(\.?.error),
action: /MyIdentityAction.error,
environment: \.error
)
#if DEBUG #if DEBUG
extension MyIdentityEnvironment { extension MyIdentityEnvironment {
...@@ -93,7 +115,8 @@ extension MyIdentityEnvironment { ...@@ -93,7 +115,8 @@ extension MyIdentityEnvironment {
observeIdentity: { fatalError() }, observeIdentity: { fatalError() },
updateIdentity: { _ in fatalError() }, updateIdentity: { _ in fatalError() },
bgScheduler: .failing, bgScheduler: .failing,
mainScheduler: .failing mainScheduler: .failing,
error: .failing
) )
} }
#endif #endif
...@@ -2,6 +2,7 @@ import Combine ...@@ -2,6 +2,7 @@ import Combine
import ComposableArchitecture import ComposableArchitecture
import CustomDump import CustomDump
import ElixxirDAppsSDK import ElixxirDAppsSDK
import ErrorFeature
import XCTest import XCTest
@testable import MyIdentityFeature @testable import MyIdentityFeature
...@@ -75,6 +76,40 @@ final class MyIdentityFeatureTests: XCTestCase { ...@@ -75,6 +76,40 @@ final class MyIdentityFeatureTests: XCTestCase {
mainScheduler.advance() mainScheduler.advance()
} }
func testMakeIdentityFailure() {
let error = NSError(domain: "test", code: 1234)
let bgScheduler = DispatchQueue.test
let mainScheduler = DispatchQueue.test
var env = MyIdentityEnvironment.failing
env.getClient = {
var client = Client.failing
client.makeIdentity.make = { throw error }
return client
}
env.bgScheduler = bgScheduler.eraseToAnyScheduler()
env.mainScheduler = mainScheduler.eraseToAnyScheduler()
let store = TestStore(
initialState: MyIdentityState(id: UUID()),
reducer: myIdentityReducer,
environment: env
)
store.send(.makeIdentity)
bgScheduler.advance()
mainScheduler.advance()
store.receive(.didFailMakingIdentity(error)) {
$0.error = ErrorState(error: error)
}
store.send(.didDismissError) {
$0.error = nil
}
}
} }
private extension Identity { private extension Identity {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment