From 3dd8a19c4061835fac34535529dd325ac7bddd0b Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Sat, 24 Sep 2022 00:43:15 +0200
Subject: [PATCH] Save restored contact

---
 Examples/xx-messenger/Package.swift           |  2 +
 .../AppFeature/AppEnvironment+Live.swift      |  2 +
 .../RestoreFeature/RestoreFeature.swift       | 19 ++++++++-
 .../RestoreFeatureTests.swift                 | 40 ++++++++++++++++---
 4 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift
index 4cf167f9..b310549f 100644
--- a/Examples/xx-messenger/Package.swift
+++ b/Examples/xx-messenger/Package.swift
@@ -274,8 +274,10 @@ let package = Package(
     .target(
       name: "RestoreFeature",
       dependencies: [
+        .target(name: "AppCore"),
         .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
         .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+        .product(name: "XXModels", package: "client-ios-db"),
       ],
       swiftSettings: swiftSettings
     ),
diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift
index c79d5b93..24e5bd89 100644
--- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift
+++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift
@@ -103,7 +103,9 @@ extension AppEnvironment {
       restore: {
         RestoreEnvironment(
           messenger: messenger,
+          db: dbManager.getDB,
           loadData: .live,
+          now: Date.init,
           mainQueue: mainQueue,
           bgQueue: bgQueue
         )
diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift
index 5339c89b..c941a8f9 100644
--- a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift
+++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift
@@ -1,8 +1,10 @@
+import AppCore
 import Combine
 import ComposableArchitecture
 import Foundation
 import XCTestDynamicOverlay
 import XXMessengerClient
+import XXModels
 
 public struct RestoreState: Equatable {
   public enum Field: String, Hashable {
@@ -58,18 +60,24 @@ public enum RestoreAction: Equatable, BindableAction {
 public struct RestoreEnvironment {
   public init(
     messenger: Messenger,
+    db: DBManagerGetDB,
     loadData: URLDataLoader,
+    now: @escaping () -> Date,
     mainQueue: AnySchedulerOf<DispatchQueue>,
     bgQueue: AnySchedulerOf<DispatchQueue>
   ) {
     self.messenger = messenger
+    self.db = db
     self.loadData = loadData
+    self.now = now
     self.mainQueue = mainQueue
     self.bgQueue = bgQueue
   }
 
   public var messenger: Messenger
+  public var db: DBManagerGetDB
   public var loadData: URLDataLoader
+  public var now: () -> Date
   public var mainQueue: AnySchedulerOf<DispatchQueue>
   public var bgQueue: AnySchedulerOf<DispatchQueue>
 }
@@ -77,7 +85,9 @@ public struct RestoreEnvironment {
 extension RestoreEnvironment {
   public static let unimplemented = RestoreEnvironment(
     messenger: .unimplemented,
+    db: .unimplemented,
     loadData: .unimplemented,
+    now: XCTUnimplemented("\(Self.self).now"),
     mainQueue: .unimplemented,
     bgQueue: .unimplemented
   )
@@ -118,10 +128,17 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
     state.restoreFailure = nil
     return Effect.result {
       do {
-        _ = try env.messenger.restoreBackup(
+        let result = try env.messenger.restoreBackup(
           backupData: backupData,
           backupPassphrase: backupPassphrase
         )
+        try env.db().saveContact(Contact(
+          id: try env.messenger.e2e.tryGet().getContact().getId(),
+          username: result.restoredParams.username,
+          email: result.restoredParams.email,
+          phone: result.restoredParams.phone,
+          createdAt: env.now()
+        ))
         return .success(.finished)
       } catch {
         return .success(.failed(error as NSError))
diff --git a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift
index 9a3cde32..88bf551f 100644
--- a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift
@@ -1,8 +1,10 @@
-import CustomDump
 import ComposableArchitecture
+import CustomDump
 import XCTest
-@testable import RestoreFeature
+import XXClient
 import XXMessengerClient
+import XXModels
+@testable import RestoreFeature
 
 final class RestoreFeatureTests: XCTestCase {
   func testFileImport() {
@@ -79,15 +81,18 @@ final class RestoreFeatureTests: XCTestCase {
     let backupPassphrase = "backup-passphrase"
     let restoreResult = MessengerRestoreBackup.Result(
       restoredParams: BackupParams.init(
-        username: "",
-        email: nil,
-        phone: nil
+        username: "restored-username",
+        email: "restored-email",
+        phone: "restored-phone"
       ),
       restoredContacts: []
     )
+    let now = Date()
+    let contactId = "contact-id".data(using: .utf8)!
 
     var didRestoreWithData: [Data] = []
     var didRestoreWithPassphrase: [String] = []
+    var didSaveContact: [XXModels.Contact] = []
 
     let store = TestStore(
       initialState: RestoreState(
@@ -99,11 +104,29 @@ final class RestoreFeatureTests: XCTestCase {
 
     store.environment.bgQueue = .immediate
     store.environment.mainQueue = .immediate
+    store.environment.now = { now }
     store.environment.messenger.restoreBackup.run = { data, passphrase in
       didRestoreWithData.append(data)
       didRestoreWithPassphrase.append(passphrase)
       return restoreResult
     }
+    store.environment.messenger.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getContact.run = {
+        var contact: XXClient.Contact = .unimplemented(Data())
+        contact.getIdFromContact.run = { _ in contactId }
+        return contact
+      }
+      return e2e
+    }
+    store.environment.db.run = {
+      var db: Database = .unimplemented
+      db.saveContact.run = { contact in
+        didSaveContact.append(contact)
+        return contact
+      }
+      return db
+    }
 
     store.send(.set(\.$passphrase, backupPassphrase)) {
       $0.passphrase = backupPassphrase
@@ -115,6 +138,13 @@ final class RestoreFeatureTests: XCTestCase {
 
     XCTAssertNoDifference(didRestoreWithData, [backupData])
     XCTAssertNoDifference(didRestoreWithPassphrase, [backupPassphrase])
+    XCTAssertNoDifference(didSaveContact, [Contact(
+      id: contactId,
+      username: restoreResult.restoredParams.username,
+      email: restoreResult.restoredParams.email,
+      phone: restoreResult.restoredParams.phone,
+      createdAt: now
+    )])
 
     store.receive(.finished) {
       $0.isRestoring = false
-- 
GitLab