From 145805a662581c519f93ef27a730e31d5f796fe9 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 12 Sep 2022 13:01:57 +0200
Subject: [PATCH] Update auth status when confirming request

---
 .../ConfirmRequestFeature.swift               | 14 ++++++---
 .../ConfirmRequestFeatureTests.swift          | 31 +++++++++++++++++--
 2 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/Examples/xx-messenger/Sources/ConfirmRequestFeature/ConfirmRequestFeature.swift b/Examples/xx-messenger/Sources/ConfirmRequestFeature/ConfirmRequestFeature.swift
index b18f9da9..7cc40da0 100644
--- a/Examples/xx-messenger/Sources/ConfirmRequestFeature/ConfirmRequestFeature.swift
+++ b/Examples/xx-messenger/Sources/ConfirmRequestFeature/ConfirmRequestFeature.swift
@@ -69,16 +69,20 @@ public let confirmRequestReducer = Reducer<ConfirmRequestState, ConfirmRequestAc
     state.isConfirming = true
     state.result = nil
     return Effect.result { [state] in
+      func updateStatus(_ status: XXModels.Contact.AuthStatus) throws {
+        try env.db().bulkUpdateContacts.callAsFunction(
+          .init(id: [try state.contact.getId()]),
+          .init(authStatus: status)
+        )
+      }
       do {
+        try updateStatus(.confirming)
         let e2e = try env.messenger.e2e.tryGet()
         _ = try e2e.confirmReceivedRequest(partner: state.contact)
-        let contactId = try state.contact.getId()
-        try env.db().bulkUpdateContacts.callAsFunction(
-          .init(id: [contactId]),
-          .init(authStatus: .friend)
-        )
+        try updateStatus(.friend)
         return .success(.didConfirm(.success))
       } catch {
+        try? updateStatus(.confirmationFailed)
         return .success(.didConfirm(.failure(error.localizedDescription)))
       }
     }
diff --git a/Examples/xx-messenger/Tests/ConfirmRequestFeatureTests/ConfirmRequestFeatureTests.swift b/Examples/xx-messenger/Tests/ConfirmRequestFeatureTests/ConfirmRequestFeatureTests.swift
index 2686d645..8dea06e1 100644
--- a/Examples/xx-messenger/Tests/ConfirmRequestFeatureTests/ConfirmRequestFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/ConfirmRequestFeatureTests/ConfirmRequestFeatureTests.swift
@@ -49,8 +49,14 @@ final class ConfirmRequestFeatureTests: XCTestCase {
     }
 
     XCTAssertNoDifference(didConfirmRequestFromContact, [contact])
-    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])])
-    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .friend)])
+    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [
+      .init(id: [contactId]),
+      .init(id: [contactId]),
+    ])
+    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [
+      .init(authStatus: .confirming),
+      .init(authStatus: .friend),
+    ])
 
     store.receive(.didConfirm(.success)) {
       $0.isConfirming = false
@@ -74,6 +80,9 @@ final class ConfirmRequestFeatureTests: 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.e2e.get = {
@@ -81,12 +90,30 @@ final class ConfirmRequestFeatureTests: XCTestCase {
       e2e.confirmReceivedRequest.run = { _ in throw error }
       return e2e
     }
+    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(.confirmTapped) {
       $0.isConfirming = true
       $0.result = nil
     }
 
+    XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [
+      .init(id: [contactId]),
+      .init(id: [contactId]),
+    ])
+    XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [
+      .init(authStatus: .confirming),
+      .init(authStatus: .confirmationFailed),
+    ])
+
     store.receive(.didConfirm(.failure(error.localizedDescription))) {
       $0.isConfirming = false
       $0.result = .failure(error.localizedDescription)
-- 
GitLab