From 712a6c512a392d7e7c76f32274c2910f4ffedcd4 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 28 Sep 2022 14:28:41 +0200
Subject: [PATCH] Add MessengerBackupParams function

---
 .../Functions/MessengerBackupParams.swift     | 33 ++++++++++
 .../Messenger/Messenger.swift                 |  3 +
 .../MessengerBackupParamsTests.swift          | 62 +++++++++++++++++++
 3 files changed, 98 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerBackupParams.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerBackupParamsTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerBackupParams.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerBackupParams.swift
new file mode 100644
index 00000000..f5ac71f0
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerBackupParams.swift
@@ -0,0 +1,33 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct MessengerBackupParams {
+  public enum Error: Swift.Error, Equatable {
+    case notRunning
+  }
+
+  public var run: (BackupParams) throws -> Void
+
+  public func callAsFunction(_ params: BackupParams) throws {
+    try run(params)
+  }
+}
+
+extension MessengerBackupParams {
+  public static func live(_ env: MessengerEnvironment) -> MessengerBackupParams {
+    MessengerBackupParams { params in
+      guard let backup = env.backup(), backup.isRunning() else {
+        throw Error.notRunning
+      }
+      let paramsData = try params.encode()
+      let paramsString = String(data: paramsData, encoding: .utf8)!
+      backup.addJSON(paramsString)
+    }
+  }
+}
+
+extension MessengerBackupParams {
+  public static let unimplemented = MessengerBackupParams(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 087bc40d..dab59a2f 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -33,6 +33,7 @@ public struct Messenger {
   public var isBackupRunning: MessengerIsBackupRunning
   public var startBackup: MessengerStartBackup
   public var resumeBackup: MessengerResumeBackup
+  public var backupParams: MessengerBackupParams
   public var stopBackup: MessengerStopBackup
 }
 
@@ -71,6 +72,7 @@ extension Messenger {
       isBackupRunning: .live(env),
       startBackup: .live(env),
       resumeBackup: .live(env),
+      backupParams: .live(env),
       stopBackup: .live(env)
     )
   }
@@ -110,6 +112,7 @@ extension Messenger {
     isBackupRunning: .unimplemented,
     startBackup: .unimplemented,
     resumeBackup: .unimplemented,
+    backupParams: .unimplemented,
     stopBackup: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerBackupParamsTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerBackupParamsTests.swift
new file mode 100644
index 00000000..e0af7129
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerBackupParamsTests.swift
@@ -0,0 +1,62 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerBackupParamsTests: XCTestCase {
+  func testBackupParams() throws {
+    var didAddJSON: [String] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.backup.get = {
+      var backup: Backup = .unimplemented
+      backup.isRunning.run = { true }
+      backup.addJSON.run = { didAddJSON.append($0) }
+      return backup
+    }
+    let backup: MessengerBackupParams = .live(env)
+    let params = BackupParams(
+      username: "test-username",
+      email: "test-email",
+      phone: "test-phone"
+    )
+
+    try backup(params)
+
+    XCTAssertNoDifference(didAddJSON, [
+      String(data: try params.encode(), encoding: .utf8)!
+    ])
+  }
+
+  func testBackupParamsWhenNoBackup() {
+    var env: MessengerEnvironment = .unimplemented
+    env.backup.get = { nil }
+    let backup: MessengerBackupParams = .live(env)
+    let params = BackupParams(username: "test", email: nil, phone: nil)
+
+    XCTAssertThrowsError(try backup(params)) { error in
+      XCTAssertNoDifference(
+        error as NSError,
+        MessengerBackupParams.Error.notRunning as NSError
+      )
+    }
+  }
+
+  func testBackupParamsWhenBackupNotRunning() {
+    var env: MessengerEnvironment = .unimplemented
+    env.backup.get = {
+      var backup: Backup = .unimplemented
+      backup.isRunning.run = { false }
+      return backup
+    }
+    let backup: MessengerBackupParams = .live(env)
+    let params = BackupParams(username: "test", email: nil, phone: nil)
+
+    XCTAssertThrowsError(try backup(params)) { error in
+      XCTAssertNoDifference(
+        error as NSError,
+        MessengerBackupParams.Error.notRunning as NSError
+      )
+    }
+  }
+}
-- 
GitLab