import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient

final class MessengerWaitForNetworkTests: XCTestCase {
  func testWaitSuccess() throws {
    var didWaitForNetwork: [Int] = []

    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.waitForNetwork.run = { timeoutMS in
        didWaitForNetwork.append(timeoutMS)
        return true
      }
      return cMix
    }
    let waitForNetwork: MessengerWaitForNetwork = .live(env)

    try waitForNetwork(timeoutMS: 123)

    XCTAssertNoDifference(didWaitForNetwork, [123])
  }

  func testWaitWhenNotLoaded() {
    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = { nil }
    let waitForNetwork: MessengerWaitForNetwork = .live(env)

    XCTAssertThrowsError(try waitForNetwork()) { error in
      XCTAssertEqual(
        error as? MessengerWaitForNetwork.Error,
        MessengerWaitForNetwork.Error.notLoaded
      )
    }
  }

  func testWaitTimeout() {
    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.waitForNetwork.run = { _ in false }
      return cMix
    }
    let waitForNetwork: MessengerWaitForNetwork = .live(env)

    XCTAssertThrowsError(try waitForNetwork()) { error in
      XCTAssertEqual(
        error as? MessengerWaitForNetwork.Error,
        MessengerWaitForNetwork.Error.timeout
      )
    }
  }
}