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

final class MessengerStopTests: XCTestCase {
  func testStop() throws {
    var didStopNetworkFollower = 0

    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.networkFollowerStatus.run = { .running }
      cMix.stopNetworkFollower.run = { didStopNetworkFollower += 1 }
      return cMix
    }
    let stop: MessengerStop = .live(env)

    try stop()

    XCTAssertNoDifference(didStopNetworkFollower, 1)
  }

  func testStopWhenNotLoaded() {
    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = { nil }
    let stop: MessengerStop = .live(env)

    XCTAssertThrowsError(try stop()) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerStop.Error.notLoaded as NSError
      )
    }
  }

  func testStopWhenNotRunning() throws {
    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.networkFollowerStatus.run = { .stopped }
      return cMix
    }
    let stop: MessengerStop = .live(env)

    try stop()
  }

  func testStopFailure() {
    struct Failure: Error {}
    let failure = Failure()

    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.networkFollowerStatus.run = { .running }
      cMix.stopNetworkFollower.run = { throw failure }
      return cMix
    }
    let stop: MessengerStop = .live(env)

    XCTAssertThrowsError(try stop()) { error in
      XCTAssertNoDifference(
        error as NSError,
        failure as NSError
      )
    }
  }

  func testStopAndWait() throws {
    var hasRunningProcesses: [Bool] = [true, true, false]
    var didStopNetworkFollower = 0
    var didSleep: [TimeInterval] = []

    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.networkFollowerStatus.run = { .running }
      cMix.stopNetworkFollower.run = { didStopNetworkFollower += 1 }
      cMix.hasRunningProcesses.run = { hasRunningProcesses.removeFirst() }
      return cMix
    }
    env.sleep = { didSleep.append($0) }
    let stop: MessengerStop = .live(env)

    try stop(wait: .init(sleepInterval: 123, retries: 3))

    XCTAssertNoDifference(didStopNetworkFollower, 1)
    XCTAssertNoDifference(didSleep, [123, 123])
  }

  func testStopAndWaitTimeout() {
    var hasRunningProcesses: [Bool] = [true, true, true, true]
    var didStopNetworkFollower = 0
    var didSleep: [TimeInterval] = []

    var env: MessengerEnvironment = .unimplemented
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.networkFollowerStatus.run = { .running }
      cMix.stopNetworkFollower.run = { didStopNetworkFollower += 1 }
      cMix.hasRunningProcesses.run = { hasRunningProcesses.removeFirst() }
      return cMix
    }
    env.sleep = { didSleep.append($0) }
    let stop: MessengerStop = .live(env)

    XCTAssertThrowsError(
      try stop(wait: .init(
        sleepInterval: 123,
        retries: 3
      ))
    ) { error in
      XCTAssertNoDifference(
        error as NSError,
        MessengerStop.Error.timedOut as NSError
      )
    }

    XCTAssertNoDifference(didStopNetworkFollower, 1)
    XCTAssertNoDifference(didSleep, [123, 123, 123])
  }
}