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

final class MessengerMyContactTests: XCTestCase {
  func testMyContactWithAllFacts() throws {
    let e2eContactData = "e2e-contact-data".data(using: .utf8)!
    var e2eContactSetFacts: [[Fact]] = []
    let e2eContactWithFactsData = "e2e-contact-with-facts-data".data(using: .utf8)!
    let udFacts = [
      Fact(type: .username, value: "ud-fact-username"),
      Fact(type: .email, value: "ud-fact-email"),
      Fact(type: .phone, value: "ud-fact-phone"),
    ]
    var env: MessengerEnvironment = .unimplemented
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getContact.run = {
        var contact: Contact = .unimplemented(e2eContactData)
        contact.setFactsOnContact.run = { _, facts in
          e2eContactSetFacts.append(facts)
          return e2eContactWithFactsData
        }
        return contact
      }
      return e2e
    }
    env.ud.get = {
      var ud: UserDiscovery = .unimplemented
      ud.getFacts.run = { udFacts }
      return ud
    }
    let myContact: MessengerMyContact = .live(env)

    let contact = try myContact()

    XCTAssertNoDifference(e2eContactSetFacts, [udFacts])
    XCTAssertNoDifference(contact, .unimplemented(e2eContactWithFactsData))
  }

  func testMyContactWithoutFacts() throws {
    let e2eContactData = "e2e-contact-data".data(using: .utf8)!
    var env: MessengerEnvironment = .unimplemented
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getContact.run = { .unimplemented(e2eContactData) }
      return e2e
    }
    let myContact: MessengerMyContact = .live(env)

    let contact = try myContact(includeFacts: .none)

    XCTAssertNoDifference(contact, .unimplemented(e2eContactData))
  }

  func testMyContactWithFactTypes() throws {
    let e2eContactData = "e2e-contact-data".data(using: .utf8)!
    var e2eContactSetFacts: [[Fact]] = []
    let e2eContactWithFactsData = "e2e-contact-with-facts-data".data(using: .utf8)!
    let udFactUsername = Fact(type: .username, value: "ud-fact-username")
    let udFactEmail = Fact(type: .email, value: "ud-fact-email")
    let udFactPhone = Fact(type: .phone, value: "ud-fact-phone")
    let udFacts = [udFactUsername, udFactEmail, udFactPhone]
    var env: MessengerEnvironment = .unimplemented
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getContact.run = {
        var contact: Contact = .unimplemented(e2eContactData)
        contact.setFactsOnContact.run = { _, facts in
          e2eContactSetFacts.append(facts)
          return e2eContactWithFactsData
        }
        return contact
      }
      return e2e
    }
    env.ud.get = {
      var ud: UserDiscovery = .unimplemented
      ud.getFacts.run = { udFacts }
      return ud
    }
    let myContact: MessengerMyContact = .live(env)

    let contact = try myContact(includeFacts: .types([.username, .phone]))

    XCTAssertNoDifference(e2eContactSetFacts, [[udFactUsername, udFactPhone]])
    XCTAssertNoDifference(contact, .unimplemented(e2eContactWithFactsData))
  }

  func testMyContactWhenNotConnected() {
    var env: MessengerEnvironment = .unimplemented
    env.e2e.get = { nil }
    let myContact: MessengerMyContact = .live(env)

    XCTAssertThrowsError(try myContact()) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerMyContact.Error.notConnected as NSError
      )
    }
  }

  func testMyContactWithFactsWhenNotLoggedIn() {
    var env: MessengerEnvironment = .unimplemented
    env.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.getContact.run = { .unimplemented(Data()) }
      return e2e
    }
    env.ud.get = { nil }
    let myContact: MessengerMyContact = .live(env)

    XCTAssertThrowsError(try myContact()) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerMyContact.Error.notLoggedIn as NSError
      )
    }
  }
}