Skip to content
Snippets Groups Projects
NewGroupComponentTests.swift 1.62 KiB
Newer Older
import Combine
Dariusz Rybicki's avatar
Dariusz Rybicki committed
import ComposableArchitecture
import CustomDump
Dariusz Rybicki's avatar
Dariusz Rybicki committed
import XCTest
import XXModels
Dariusz Rybicki's avatar
Dariusz Rybicki committed
@testable import NewGroupFeature

final class NewGroupComponentTests: XCTestCase {
  enum Action: Equatable {
    case didFetchContacts(XXModels.Contact.Query)
  }

  var actions: [Action]!

  override func setUp() {
    actions = []
  }

  override func tearDown() {
    actions = nil
  }

Dariusz Rybicki's avatar
Dariusz Rybicki committed
  func testStart() {
    let contactsSubject = PassthroughSubject<[XXModels.Contact], Error>()

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let store = TestStore(
      initialState: NewGroupComponent.State(),
      reducer: NewGroupComponent()
    )

    store.dependencies.app.mainQueue = .immediate
    store.dependencies.app.bgQueue = .immediate
    store.dependencies.app.dbManager.getDB.run = {
      var db: Database = .unimplemented
      db.fetchContactsPublisher.run = { query in
        self.actions.append(.didFetchContacts(query))
        return contactsSubject.eraseToAnyPublisher()
      }
      return db
    }

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    store.send(.start)

    XCTAssertNoDifference(actions, [
      .didFetchContacts(.init())
    ])

    let contacts: [XXModels.Contact] = [
      .init(id: "contact-1-id".data(using: .utf8)!),
      .init(id: "contact-2-id".data(using: .utf8)!),
      .init(id: "contact-3-id".data(using: .utf8)!),
    ]
    contactsSubject.send(contacts)

    store.receive(.didFetchContacts(contacts)) {
      $0.contacts = IdentifiedArray(uniqueElements: contacts)
    }

    contactsSubject.send(completion: .finished)
  }

  func testFinish() {
    let store = TestStore(
      initialState: NewGroupComponent.State(),
      reducer: NewGroupComponent()
    )

    store.send(.didFinish)