From a05510e2255fc40f2652697420e9bb44b52f391e Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 7 Sep 2022 13:14:16 +0200
Subject: [PATCH] Save contact

---
 .../ContactFeature/ContactFeature.swift       | 13 ++++++-
 .../Sources/ContactFeature/ContactView.swift  |  1 +
 .../ContactFeatureTests.swift                 | 39 ++++++++++++++++++-
 3 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift b/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift
index 37388359..7bbb5f3c 100644
--- a/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift
+++ b/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift
@@ -79,7 +79,18 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
     return .none
 
   case .saveFactsTapped:
-    return .none
+    guard let xxContact = state.xxContact else { return .none }
+    return .fireAndForget { [state] in
+      var dbContact = state.dbContact ?? XXModels.Contact(id: state.id)
+      dbContact.marshaled = xxContact.data
+      dbContact.username = xxContact.username
+      dbContact.email = xxContact.email
+      dbContact.phone = xxContact.phone
+      _ = try! env.db().saveContact(dbContact)
+    }
+    .subscribe(on: env.bgQueue)
+    .receive(on: env.mainQueue)
+    .eraseToEffect()
 
   case .sendRequestTapped:
     return .none
diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift b/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift
index ca5eb328..6bf50150 100644
--- a/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift
+++ b/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift
@@ -159,6 +159,7 @@ public struct ContactView: View {
         }
       }
       .navigationTitle("Contact")
+      .task { viewStore.send(.start) }
     }
   }
 }
diff --git a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift b/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift
index b0d3e8b6..f14c9e39 100644
--- a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift
@@ -2,6 +2,7 @@ import Combine
 import ComposableArchitecture
 import CustomDump
 import XCTest
+import XXClient
 import XXModels
 @testable import ContactFeature
 
@@ -46,15 +47,51 @@ final class ContactFeatureTests: XCTestCase {
   }
 
   func testSaveFacts() {
+    let dbContact: XXModels.Contact = .init(
+      id: "contact-id".data(using: .utf8)!
+    )
+
+    var xxContact: XXClient.Contact = .unimplemented("contact-data".data(using: .utf8)!)
+    xxContact.getFactsFromContact.run = { _ in
+      [
+        Fact(fact: "contact-username", type: 0),
+        Fact(fact: "contact-email", type: 1),
+        Fact(fact: "contact-phone", type: 2),
+      ]
+    }
+
     let store = TestStore(
       initialState: ContactState(
-        id: "contact-id".data(using: .utf8)!
+        id: "contact-id".data(using: .utf8)!,
+        dbContact: dbContact,
+        xxContact: xxContact
       ),
       reducer: contactReducer,
       environment: .unimplemented
     )
 
+    var dbDidSaveContact: [XXModels.Contact] = []
+
+    store.environment.mainQueue = .immediate
+    store.environment.bgQueue = .immediate
+    store.environment.db.run = {
+      var db: Database = .failing
+      db.saveContact.run = { contact in
+        dbDidSaveContact.append(contact)
+        return contact
+      }
+      return db
+    }
+
     store.send(.saveFactsTapped)
+
+    var expectedSavedContact = dbContact
+    expectedSavedContact.marshaled = xxContact.data
+    expectedSavedContact.username = "contact-username"
+    expectedSavedContact.email = "contact-email"
+    expectedSavedContact.phone = "contact-phone"
+
+    XCTAssertNoDifference(dbDidSaveContact, [expectedSavedContact])
   }
 
   func testSendRequest() {
-- 
GitLab