import ComposableArchitecture
import CustomDump
import XCTest
import XXClient
@testable import ResetAuthFeature

final class ResetAuthComponentTests: XCTestCase {
  func testReset() {
    let partnerData = "contact-data".data(using: .utf8)!
    let partner = Contact.unimplemented(partnerData)

    var didResetAuthChannel: [Contact] = []

    let store = TestStore(
      initialState: ResetAuthComponent.State(
        partner: partner
      ),
      reducer: ResetAuthComponent()
    )
    store.dependencies.app.mainQueue = .immediate
    store.dependencies.app.bgQueue = .immediate
    store.dependencies.app.messenger.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.resetAuthenticatedChannel.run = { contact in
        didResetAuthChannel.append(contact)
        return 0
      }
      return e2e
    }

    store.send(.resetTapped) {
      $0.isResetting = true
    }

    XCTAssertNoDifference(didResetAuthChannel, [partner])

    store.receive(.didReset) {
      $0.isResetting = false
      $0.didReset = true
    }
  }

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

    let store = TestStore(
      initialState: ResetAuthComponent.State(
        partner: .unimplemented(Data())
      ),
      reducer: ResetAuthComponent()
    )
    store.dependencies.app.mainQueue = .immediate
    store.dependencies.app.bgQueue = .immediate
    store.dependencies.app.messenger.e2e.get = {
      var e2e: E2E = .unimplemented
      e2e.resetAuthenticatedChannel.run = { _ in throw failure }
      return e2e
    }

    store.send(.resetTapped) {
      $0.isResetting = true
    }

    store.receive(.didFail(failure.localizedDescription)) {
      $0.isResetting = false
      $0.failure = failure.localizedDescription
    }
  }
}