Skip to content
Snippets Groups Projects
UserSearchResultFeatureTests.swift 2.03 KiB
Newer Older
import Combine
import ComposableArchitecture
import XCTest
import XCTestDynamicOverlay
import XXClient
import XXModels
@testable import UserSearchFeature

final class UserSearchResultFeatureTests: XCTestCase {
  func testStart() {
    var contact = Contact.unimplemented("contact-data".data(using: .utf8)!)
    contact.getFactsFromContact.run = { _ in
      [
        Fact(fact: "contact-username", type: 0),
        Fact(fact: "contact-email", type: 1),
        Fact(fact: "contact-phone", type: 2),
      ]
    }

    let store = TestStore(
      initialState: UserSearchResultState(
        id: "contact-id".data(using: .utf8)!,
Dariusz Rybicki's avatar
Dariusz Rybicki committed
        xxContact: contact
      ),
      reducer: userSearchResultReducer,
      environment: .unimplemented
    )

    var dbDidFetchContacts: [XXModels.Contact.Query] = []
    let dbContactsPublisher = PassthroughSubject<[XXModels.Contact], Error>()

    store.environment.mainQueue = .immediate
    store.environment.bgQueue = .immediate
    store.environment.db.run = {
      var db: Database = .failing
      db.fetchContactsPublisher.run = { query in
        dbDidFetchContacts.append(query)
        return dbContactsPublisher.eraseToAnyPublisher()
      }
      return db
    }

    store.send(.start) {
      $0.username = "contact-username"
      $0.email = "contact-email"
      $0.phone = "contact-phone"
    }

    XCTAssertNoDifference(dbDidFetchContacts, [
      .init(id: ["contact-id".data(using: .utf8)!])
    ])

    let dbContact = XXModels.Contact(id: "contact-id".data(using: .utf8)!)
    dbContactsPublisher.send([dbContact])

    store.receive(.didUpdateContact(dbContact)) {
      $0.dbContact = dbContact
    }

    dbContactsPublisher.send(completion: .finished)
  }

  func testSendRequest() {
    let store = TestStore(
      initialState: UserSearchResultState(
        id: "contact-id".data(using: .utf8)!,
        xxContact: .unimplemented("contact-data".data(using: .utf8)!)
      ),
      reducer: userSearchResultReducer,
      environment: .unimplemented
    )

    store.send(.sendRequestButtonTapped)