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