Skip to content
Snippets Groups Projects
MessengerStartBackupTests.swift 5.75 KiB
Newer Older
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient

final class MessengerStartBackupTests: XCTestCase {
  func testStartWithParams() throws {
    struct InitBackupParams: Equatable {
      var e2eId: Int
      var udId: Int
      var password: String
    }
    var didInitializeBackup: [InitBackupParams] = []
    var backupCallbacks: [UpdateBackupFunc] = []
    var didHandleCallback: [Data] = []
    var didSetBackup: [Backup?] = []
    var didAddJSON: [String] = []
    let params = "backup-params"
    let password = "test-password"
    let e2eId = 123
    let udId = 321
    let dataWithoutParams = "backup-without-params".data(using: .utf8)!
    let dataWithParams = "backup-with-params".data(using: .utf8)!

    var env: MessengerEnvironment = .unimplemented
    env.backup.get = { didSetBackup.last as? Backup }
    env.backup.set = { didSetBackup.append($0) }
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getId.run = { e2eId }
      return e2e
    }
    env.ud.get = {
      var ud: UserDiscovery = .unimplemented
      ud.getId.run = { udId }
      return ud
    }
    env.backupCallbacks.registered = {
      UpdateBackupFunc { didHandleCallback.append($0) }
    }
    env.initializeBackup.run = { e2eId, udId, password, callback in
      didInitializeBackup.append(.init(e2eId: e2eId, udId: udId, password: password))
      backupCallbacks.append(callback)
      var backup: Backup = .unimplemented
      backup.addJSON.run = { string in
        didAddJSON.append(string)
      }
      return backup
    }
    let start: MessengerStartBackup = .live(env)

    try start(password: password, params: params)

    XCTAssertNoDifference(didInitializeBackup, [
      .init(e2eId: e2eId, udId: udId, password: password)
    ])
    XCTAssertNoDifference(didSetBackup.map { $0 != nil }, [true])

    backupCallbacks.forEach { $0.handle(dataWithoutParams) }

    XCTAssertNoDifference(
      didHandleCallback.map(StringData.init),
      [].map(StringData.init)
    )
    XCTAssertNoDifference(didAddJSON, [params])

    backupCallbacks.forEach { $0.handle(dataWithParams) }
    XCTAssertNoDifference(
      didHandleCallback.map(StringData.init),
      [dataWithParams].map(StringData.init)
    )
  func testStartWithoutParams() throws {
    struct InitBackupParams: Equatable {
      var e2eId: Int
      var udId: Int
      var password: String
    }
    var didInitializeBackup: [InitBackupParams] = []
    var backupCallbacks: [UpdateBackupFunc] = []
    var didHandleCallback: [Data] = []
    var didSetBackup: [Backup?] = []

    let password = "test-password"
    let e2eId = 123
    let udId = 321
    let dataWithoutParams = "backup-without-params".data(using: .utf8)!

    var env: MessengerEnvironment = .unimplemented
    env.backup.get = { didSetBackup.last as? Backup }
    env.backup.set = { didSetBackup.append($0) }
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getId.run = { e2eId }
      return e2e
    }
    env.ud.get = {
      var ud: UserDiscovery = .unimplemented
      ud.getId.run = { udId }
      return ud
    }
    env.backupCallbacks.registered = {
      UpdateBackupFunc { didHandleCallback.append($0) }
    }
    env.initializeBackup.run = { e2eId, udId, password, callback in
      didInitializeBackup.append(.init(e2eId: e2eId, udId: udId, password: password))
      backupCallbacks.append(callback)
      return .unimplemented
    }
    let start: MessengerStartBackup = .live(env)

    try start(password: password)

    XCTAssertNoDifference(didInitializeBackup, [
      .init(e2eId: e2eId, udId: udId, password: password)
    ])
    XCTAssertNoDifference(didSetBackup.map { $0 != nil }, [true])

    backupCallbacks.forEach { $0.handle(dataWithoutParams) }

    XCTAssertNoDifference(
      didHandleCallback.map(StringData.init),
      [dataWithoutParams].map(StringData.init)
    )
  }

  func testStartWhenRunning() {
    var env: MessengerEnvironment = .unimplemented
    env.backup.get = {
      var backup: Backup = .unimplemented
      backup.isRunning.run = { true }
      return backup
    }
    let start: MessengerStartBackup = .live(env)

    XCTAssertThrowsError(try start(password: "")) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerStartBackup.Error.isRunning as NSError
      )
    }
  }

  func testStartWhenNotConnected() {
    var env: MessengerEnvironment = .unimplemented
    env.backup.get = { nil }
    env.e2e.get = { nil }
    let start: MessengerStartBackup = .live(env)

    XCTAssertThrowsError(try start(password: "")) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerStartBackup.Error.notConnected as NSError
      )
    }
  }

  func testStartWhenNotLoggedIn() {
    var env: MessengerEnvironment = .unimplemented
    env.backup.get = { nil }
    env.e2e.get = { .unimplemented }
    env.ud.get = { nil }
    let start: MessengerStartBackup = .live(env)

    XCTAssertThrowsError(try start(password: "")) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerStartBackup.Error.notLoggedIn as NSError
      )
    }
  }

  func testStartFailure() {
    struct Failure: Error, Equatable {}
    let failure = Failure()

    var env: MessengerEnvironment = .unimplemented
    env.backup.get = { nil }
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getId.run = { 123 }
      return e2e
    }
    env.ud.get = {
      var ud: UserDiscovery = .unimplemented
      ud.getId.run = { 321 }
      return ud
    }
    env.backupCallbacks.registered = { UpdateBackupFunc { _ in  } }
    env.initializeBackup.run = { _, _, _, _ in throw failure }
    let start: MessengerStartBackup = .live(env)

    XCTAssertThrowsError(try start(password: "")) { error in
      XCTAssertNoDifference(error as NSError, failure as NSError)
    }
  }
}