From 64847678745b17b433ae399172cb15dd15d0ff14 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 12 Sep 2022 12:58:16 +0200
Subject: [PATCH] Update auth status when verifying contact

---
 .../VerifyContactFeature.swift                | 14 ++++--
 .../VerifyContactFeatureTests.swift           | 47 +++++++++++++++++--
 2 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift b/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift
index 8a69a072..1663d155 100644
--- a/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift
+++ b/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift
@@ -69,15 +69,19 @@ public let verifyContactReducer = Reducer<VerifyContactState, VerifyContactActio
     state.isVerifying = true
     state.result = nil
     return Effect.result { [state] in
-      do {
-        let result = try env.messenger.verifyContact(state.contact)
-        let contactId = try state.contact.getId()
+      func updateStatus(_ status: XXModels.Contact.AuthStatus) throws {
         try env.db().bulkUpdateContacts.callAsFunction(
-          .init(id: [contactId]),
-          .init(authStatus: result ? .verified : .verificationFailed)
+          .init(id: [try state.contact.getId()]),
+          .init(authStatus: status)
         )
+      }
+      do {
+        try updateStatus(.verificationInProgress)
+        let result = try env.messenger.verifyContact(state.contact)
+        try updateStatus(result ? .verified : .verificationFailed)
         return .success(.didVerify(.success(result)))
       } catch {
+        try? updateStatus(.verificationFailed)
         return .success(.didVerify(.failure(error.localizedDescription)))
       }
     }
diff --git a/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift b/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift
index 6ca82b1e..97f8b428 100644
--- a/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift
@@ -45,8 +45,14 @@ final class VerifyContactFeatureTests: XCTestCase {
     }
 
     XCTAssertNoDifference(didVerifyContact, [contact])
-    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])])
-    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .verified)])
+    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [
+      .init(id: [contactId]),
+      .init(id: [contactId]),
+    ])
+    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [
+      .init(authStatus: .verificationInProgress),
+      .init(authStatus: .verified)
+    ])
 
     store.receive(.didVerify(.success(true))) {
       $0.isVerifying = false
@@ -93,8 +99,14 @@ final class VerifyContactFeatureTests: XCTestCase {
     }
 
     XCTAssertNoDifference(didVerifyContact, [contact])
-    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])])
-    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .verificationFailed)])
+    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [
+      .init(id: [contactId]),
+      .init(id: [contactId]),
+    ])
+    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [
+      .init(authStatus: .verificationInProgress),
+      .init(authStatus: .verificationFailed),
+    ])
 
     store.receive(.didVerify(.success(false))) {
       $0.isVerifying = false
@@ -103,9 +115,13 @@ final class VerifyContactFeatureTests: XCTestCase {
   }
 
   func testVerifyFailure() {
+    var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!)
+    let contactId = "contact-id".data(using: .utf8)!
+    contact.getIdFromContact.run = { _ in contactId }
+
     let store = TestStore(
       initialState: VerifyContactState(
-        contact: .unimplemented("contact-data".data(using: .utf8)!)
+        contact: contact
       ),
       reducer: verifyContactReducer,
       environment: .unimplemented
@@ -114,15 +130,36 @@ final class VerifyContactFeatureTests: XCTestCase {
     struct Failure: Error {}
     let error = Failure()
 
+    var didBulkUpdateContactsWithQuery: [XXModels.Contact.Query] = []
+    var didBulkUpdateContactsWithAssignments: [XXModels.Contact.Assignments] = []
+
     store.environment.mainQueue = .immediate
     store.environment.bgQueue = .immediate
     store.environment.messenger.verifyContact.run = { _ in throw error }
+    store.environment.db.run = {
+      var db: Database = .failing
+      db.bulkUpdateContacts.run = { query, assignments in
+        didBulkUpdateContactsWithQuery.append(query)
+        didBulkUpdateContactsWithAssignments.append(assignments)
+        return 0
+      }
+      return db
+    }
 
     store.send(.verifyTapped) {
       $0.isVerifying = true
       $0.result = nil
     }
 
+    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [
+      .init(id: [contactId]),
+      .init(id: [contactId]),
+    ])
+    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [
+      .init(authStatus: .verificationInProgress),
+      .init(authStatus: .verificationFailed),
+    ])
+
     store.receive(.didVerify(.failure(error.localizedDescription))) {
       $0.isVerifying = false
       $0.result = .failure(error.localizedDescription)
-- 
GitLab