From 35da3a3d7bca3704a2b9e7cd394b1aeff240234e Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 21 Sep 2022 19:43:33 +0200
Subject: [PATCH] Test MessengerRestoreBackup function wrapper

---
 .../MessengerRestoreBackupTests.swift         | 218 ++++++++++++++++++
 1 file changed, 218 insertions(+)
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift

diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift
new file mode 100644
index 00000000..28e6f204
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift
@@ -0,0 +1,218 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRestoreBackupTests: XCTestCase {
+  func testRestore() throws {
+    let backupData = "backup-data".data(using: .utf8)!
+    let backupPassphrase = "backup-passphrase"
+    let ndfData = "ndf-data".data(using: .utf8)!
+    let password = "password".data(using: .utf8)!
+    let backupParams = BackupParams(
+      username: "backup-username",
+      email: "backup-email",
+      phone: "backup-phone"
+    )
+    let backupReport = BackupReport(
+      restoredContacts: [],
+      params: String(data: try! JSONEncoder().encode(backupParams), encoding: .utf8)!
+    )
+    let cMixParams = "cmix-params".data(using: .utf8)!
+    let e2eParams = "e2e-params".data(using: .utf8)!
+    let cMixId = 123
+    let e2eId = 456
+    let receptionIdentity = ReceptionIdentity(
+      id: "reception-id".data(using: .utf8)!,
+      rsaPrivatePem: "reception-rsaPrivatePem".data(using: .utf8)!,
+      salt: "reception-salt".data(using: .utf8)!,
+      dhKeyPrivate: "reception-dhKeyPrivate".data(using: .utf8)!,
+      e2eGrp: "reception-e2eGrp".data(using: .utf8)!
+    )
+    let udContactFromNdf = "ud-contact".data(using: .utf8)!
+    let udCertFromNdf = "ud-cert".data(using: .utf8)!
+    let udAddressFromNdf = "ud-address"
+
+    var caughtActions: [CaughtAction] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.downloadNDF.run = { ndfEnvironment in
+      caughtActions.append(.didDownloadNDF(environment: ndfEnvironment))
+      return ndfData
+    }
+    env.generateSecret.run = { _ in password }
+    env.passwordStorage.save = { caughtActions.append(.didSavePassword(password: $0)) }
+    env.passwordStorage.load = { password }
+    env.fileManager.removeDirectory = { caughtActions.append(.didRemoveDirectory(path: $0)) }
+    env.fileManager.createDirectory = { caughtActions.append(.didCreateDirectory(path: $0)) }
+    env.newCMixFromBackup.run = {
+      ndfJSON, storageDir, backupPassphrase, sessionPassword, backupFileContents in
+      caughtActions.append(.didNewCMixFromBackup(
+        ndfJSON: ndfJSON,
+        storageDir: storageDir,
+        backupPassphrase: backupPassphrase,
+        sessionPassword: sessionPassword,
+        backupFileContents: backupFileContents
+      ))
+      return backupReport
+    }
+    env.getCMixParams.run = { cMixParams }
+    env.getE2EParams.run = { e2eParams }
+    env.loadCMix.run = { storageDir, password, cMixParams in
+      caughtActions.append(.didLoadCMix(
+        storageDir: storageDir,
+        password: password,
+        cMixParams: cMixParams
+      ))
+      var cMix: CMix = .unimplemented
+      cMix.getId.run = { cMixId }
+      cMix.makeReceptionIdentity.run = { legacy in
+        caughtActions.append(.cMixDidMakeReceptionIdentity(legacy: legacy))
+        return receptionIdentity
+      }
+      return cMix
+    }
+    env.login.run = { ephemeral, cMixId, _, identity, e2eParams in
+      caughtActions.append(.didLogin(
+        ephemeral: ephemeral,
+        cMixId: cMixId,
+        identity: identity,
+        e2eParamsJSON: e2eParams
+      ))
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { e2eId }
+      e2e.getUdCertFromNdf.run = { udCertFromNdf }
+      e2e.getUdContactFromNdf.run = { udContactFromNdf }
+      e2e.getUdAddressFromNdf.run = { udAddressFromNdf }
+      return e2e
+    }
+    env.newUdManagerFromBackup.run = { params, _ in
+      caughtActions.append(.didNewUdManagerFromBackup(params: params))
+      return .unimplemented
+    }
+    env.authCallbacks.registered = {
+      AuthCallbacks { _ in }
+    }
+    env.cMix.set = { _ in caughtActions.append(.didSetCMix) }
+    env.e2e.set = { _ in caughtActions.append(.didSetE2E) }
+    env.ud.set = { _ in caughtActions.append(.didSetUD) }
+
+    let restore: MessengerRestoreBackup = .live(env)
+
+    let result = try restore(
+      backupData: backupData,
+      backupPassphrase: backupPassphrase
+    )
+
+    XCTAssertNoDifference(caughtActions, [
+      .didDownloadNDF(
+        environment: env.ndfEnvironment
+      ),
+      .didSavePassword(
+        password: password
+      ),
+      .didRemoveDirectory(
+        path: env.storageDir
+      ),
+      .didCreateDirectory(
+        path: env.storageDir
+      ),
+      .didNewCMixFromBackup(
+        ndfJSON: String(data: ndfData, encoding: .utf8)!,
+        storageDir: env.storageDir,
+        backupPassphrase: backupPassphrase,
+        sessionPassword: password,
+        backupFileContents: backupData
+      ),
+      .didLoadCMix(
+        storageDir: env.storageDir,
+        password: password,
+        cMixParams: cMixParams
+      ),
+      .cMixDidMakeReceptionIdentity(
+        legacy: true
+      ),
+      .didLogin(
+        ephemeral: false,
+        cMixId: cMixId,
+        identity: receptionIdentity,
+        e2eParamsJSON: e2eParams
+      ),
+      .didNewUdManagerFromBackup(params: .init(
+        e2eId: e2eId,
+        username: Fact(type: .username, value: backupParams.username),
+        email: Fact(type: .email, value: backupParams.email!),
+        phone: Fact(type: .phone, value: backupParams.phone!),
+        cert: udCertFromNdf,
+        contact: udContactFromNdf,
+        address: udAddressFromNdf
+      )),
+      .didSetCMix,
+      .didSetE2E,
+      .didSetUD,
+    ])
+
+    XCTAssertNoDifference(result, backupParams)
+  }
+
+  func testDownloadNdfFailure() {
+    struct Failure: Error, Equatable {}
+    let failure = Failure()
+
+    var actions: [CaughtAction] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.downloadNDF.run = { _ in throw failure }
+    env.fileManager.removeDirectory = { actions.append(.didRemoveDirectory(path: $0)) }
+    let restore: MessengerRestoreBackup = .live(env)
+
+    XCTAssertThrowsError(try restore(backupData: Data(), backupPassphrase: "")) { error in
+      XCTAssertNoDifference(error as? Failure, failure)
+    }
+    XCTAssertNoDifference(actions, [
+      .didRemoveDirectory(path: env.storageDir)
+    ])
+  }
+}
+
+private enum CaughtAction: Equatable {
+  case didDownloadNDF(
+    environment: NDFEnvironment
+  )
+  case didSavePassword(
+    password: Data
+  )
+  case didRemoveDirectory(
+    path: String
+  )
+  case didCreateDirectory(
+    path: String
+  )
+  case didNewCMixFromBackup(
+    ndfJSON: String,
+    storageDir: String,
+    backupPassphrase: String,
+    sessionPassword: Data,
+    backupFileContents: Data
+  )
+  case didLoadCMix(
+    storageDir: String,
+    password: Data,
+    cMixParams: Data
+  )
+  case didLogin(
+    ephemeral: Bool,
+    cMixId: Int,
+    identity: ReceptionIdentity,
+    e2eParamsJSON: Data
+  )
+  case cMixDidMakeReceptionIdentity(
+    legacy: Bool
+  )
+  case didNewUdManagerFromBackup(
+    params: NewUdManagerFromBackup.Params
+  )
+  case didSetCMix
+  case didSetE2E
+  case didSetUD
+}
-- 
GitLab