Skip to content
Snippets Groups Projects
MessengerCreateTests.swift 4.83 KiB
Newer Older
Dariusz Rybicki's avatar
Dariusz Rybicki committed
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient

Dariusz Rybicki's avatar
Dariusz Rybicki committed
final class MessengerCreateTests: XCTestCase {
  func testCreate() throws {
    struct DidNewCMix: Equatable {
      var ndfJSON: String
      var storageDir: String
      var password: Data
      var registrationCode: String?
    }

    var didDownloadNDF: [NDFEnvironment] = []
    var didGenerateSecret: [Int] = []
    var didSavePassword: [Data] = []
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var didRemoveItem: [String] = []
    var didCreateDirectory: [String] = []
    var didNewCMix: [DidNewCMix] = []

    let ndf = "ndf".data(using: .utf8)!
    let password = "password".data(using: .utf8)!
    let storageDir = "storage-dir"

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { ndfEnvironment in
      didDownloadNDF.append(ndfEnvironment)
      return ndf
    }
    env.generateSecret.run = { numBytes in
      didGenerateSecret.append(numBytes)
      return password
    }
    env.passwordStorage.save = { password in
      didSavePassword.append(password)
    }
    env.storageDir = storageDir
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.removeItem = { path in
      didRemoveItem.append(path)
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.createDirectory = { path in
      didCreateDirectory.append(path)
    }
    env.newCMix.run = { ndfJSON, storageDir, password, registrationCode in
      didNewCMix.append(.init(
        ndfJSON: ndfJSON,
        storageDir: storageDir,
        password: password,
        registrationCode: registrationCode
      ))
    }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let create: MessengerCreate = .live(env)

    try create()

    XCTAssertNoDifference(didDownloadNDF, [.unimplemented])
    XCTAssertNoDifference(didGenerateSecret, [32])
    XCTAssertNoDifference(didSavePassword, [password])
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    XCTAssertNoDifference(didRemoveItem, [storageDir])
    XCTAssertNoDifference(didCreateDirectory, [storageDir])
    XCTAssertNoDifference(didNewCMix, [.init(
      ndfJSON: String(data: ndf, encoding: .utf8)!,
      storageDir: storageDir,
      password: password,
      registrationCode: nil
    )])
  }

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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { _ in throw error }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let create: MessengerCreate = .live(env)

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

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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { _ in "ndf".data(using: .utf8)! }
    env.generateSecret.run = { _ in "password".data(using: .utf8)! }
    env.passwordStorage.save = { _ in throw error }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let create: MessengerCreate = .live(env)

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

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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { _ in "ndf".data(using: .utf8)! }
    env.generateSecret.run = { _ in "password".data(using: .utf8)! }
    env.passwordStorage.save = { _ in }
    env.storageDir = "storage-dir"
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.removeItem = { _ in throw error }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let create: MessengerCreate = .live(env)

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

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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { _ in "ndf".data(using: .utf8)! }
    env.generateSecret.run = { _ in "password".data(using: .utf8)! }
    env.passwordStorage.save = { _ in }
    env.storageDir = "storage-dir"
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.removeItem = { _ in }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.createDirectory = { _ in throw error }
    let create: MessengerCreate = .live(env)

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

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

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
    env.ndfEnvironment = .unimplemented
    env.downloadNDF.run = { _ in "ndf".data(using: .utf8)! }
    env.generateSecret.run = { _ in "password".data(using: .utf8)! }
    env.passwordStorage.save = { _ in }
    env.storageDir = "storage-dir"
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.removeItem = { _ in }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.fileManager.createDirectory = { _ in }
    env.newCMix.run = { _, _, _, _ in throw error }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let create: MessengerCreate = .live(env)

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