Skip to content
Snippets Groups Projects
WelcomeFeatureTests.swift 1.76 KiB
Newer Older
import ComposableArchitecture
import XCTest
@testable import WelcomeFeature

@MainActor
final class WelcomeFeatureTests: XCTestCase {
  func testNewAccountTapped() {
    let store = TestStore(
      initialState: WelcomeState(),
      reducer: welcomeReducer,
      environment: .unimplemented
    )

    let mainQueue = DispatchQueue.test
    let bgQueue = DispatchQueue.test
    var messengerDidCreate = false

    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
    store.environment.messenger.create.run = { messengerDidCreate = true }

    store.send(.newAccountTapped) {
      $0.isCreatingAccount = true
    }

    bgQueue.advance()

    XCTAssertTrue(messengerDidCreate)

    mainQueue.advance()

    store.receive(.finished) {
      $0.isCreatingAccount = false
    }
  }

  func testNewAccountTappedMessengerCreateFailure() {
    let store = TestStore(
      initialState: WelcomeState(),
      reducer: welcomeReducer,
      environment: .unimplemented
    )

    let mainQueue = DispatchQueue.test
    let bgQueue = DispatchQueue.test
    struct Error: Swift.Error, Equatable {}
    let error = Error()

    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
    store.environment.messenger.create.run = { throw error }

    store.send(.newAccountTapped) {
      $0.isCreatingAccount = true
    }

    bgQueue.advance()
    mainQueue.advance()

    store.receive(.failed(error.localizedDescription)) {
      $0.isCreatingAccount = false
    }
  }

  func testRestore() {
    let store = TestStore(
      initialState: WelcomeState(),
      reducer: welcomeReducer,
      environment: .unimplemented
    )

    store.send(.restoreTapped)
  }
}