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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
final class MessengerConnectTests: XCTestCase {
  func testConnect() throws {
    struct DidLogIn: Equatable {
      var ephemeral: Bool
      var cMixId: Int
      var identity: ReceptionIdentity
      var e2eParamsJSON: Data
    }
    var didMakeReceptionIdentity: [Bool] = []
    var didLogIn: [DidLogIn] = []
    var didLogInWithAuthCallbacks: [AuthCallbacks?] = []
    var didSetE2E: [E2E?] = []
    var didHandleAuthCallbacks: [AuthCallbacks.Callback] = []
    var didSetIsListeningForMessages: [Bool] = []

    let cMixId = 1234
    let receptionId = ReceptionIdentity.stub
    let e2eParams = "e2e-params".data(using: .utf8)!

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getId.run = { cMixId }
      cMix.makeReceptionIdentity.run = { legacy in
        didMakeReceptionIdentity.append(legacy)
        return receptionId
      }
      return cMix
    }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.e2e.set = { didSetE2E.append($0) }
    env.getE2EParams.run = { e2eParams }
    env.authCallbacks.registered = {
      AuthCallbacks { callback in
        didHandleAuthCallbacks.append(callback)
      }
    }
    env.login.run = { ephemeral, cMixId, authCallbacks, identity, e2eParamsJSON in
      didLogIn.append(.init(
        ephemeral: ephemeral,
        cMixId: cMixId,
        identity: identity,
        e2eParamsJSON: e2eParamsJSON
      ))
      didLogInWithAuthCallbacks.append(authCallbacks)
      return .unimplemented
    }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let connect: MessengerConnect = .live(env)

    try connect()

    XCTAssertNoDifference(didMakeReceptionIdentity, [true])
    XCTAssertNoDifference(didLogIn, [
      DidLogIn(
        ephemeral: false,
        cMixId: 1234,
        identity: receptionId,
        e2eParamsJSON: e2eParams
      )
    ])
    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
    XCTAssertEqual(didLogInWithAuthCallbacks.compactMap { $0 }.count, 1)
    XCTAssertEqual(didSetE2E.compactMap { $0 }.count, 1)

    didLogInWithAuthCallbacks.forEach { authCallbacks in
      [AuthCallbacks.Callback].stubs.forEach { callback in
        authCallbacks?.handle(callback)
      }
    }
    XCTAssertNoDifference(didHandleAuthCallbacks, .stubs)
  }

  func testConnectWithoutCMix() {
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = { nil }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let connect: MessengerConnect = .live(env)

    XCTAssertThrowsError(try connect()) { error in
      XCTAssertEqual(
Dariusz Rybicki's avatar
Dariusz Rybicki committed
        error as? MessengerConnect.Error,
        MessengerConnect.Error.notLoaded
      )
    }
  }

  func testMakeLegacyReceptionIdentityFailure() {
    struct Error: Swift.Error, Equatable {}
    let error = Error()

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getId.run = { 1234 }
      cMix.makeReceptionIdentity.run = { _ in throw error }
      return cMix
    }
    env.authCallbacks.registered = { .unimplemented }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let connect: MessengerConnect = .live(env)

    XCTAssertThrowsError(try connect()) { err in
      XCTAssertEqual(err as? Error, error)
    }
  }

  func testLoginFailure() {
    struct Error: Swift.Error, Equatable {}
    let error = Error()

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getId.run = { 1234 }
      cMix.makeReceptionIdentity.run = { _ in .stub }
      return cMix
    }
    env.authCallbacks.registered = { .unimplemented }
    env.getE2EParams.run = { "e2e-params".data(using: .utf8)! }
    env.login.run = { _, _, _, _, _ in throw error }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let connect: MessengerConnect = .live(env)

    XCTAssertThrowsError(try connect()) { err in
      XCTAssertEqual(err as? Error, error)
    }
  }
}

private extension ReceptionIdentity {
  static let stub = ReceptionIdentity(
    id: "id".data(using: .utf8)!,
    rsaPrivatePem: "rsaPrivatePem".data(using: .utf8)!,
    salt: "salt".data(using: .utf8)!,
    dhKeyPrivate: "dhKeyPrivate".data(using: .utf8)!,
    e2eGrp: "e2eGrp".data(using: .utf8)!
  )
}