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

final class GroupsComponentTests: XCTestCase {
Dariusz Rybicki's avatar
Dariusz Rybicki committed
  enum Action: Equatable {
    case didFetchGroups(XXModels.Group.Query)
  }

  var actions: [Action]!

  override func setUp() {
    actions = []
  }

  override func tearDown() {
    actions = nil
  }

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

    let store = TestStore(
      initialState: GroupsComponent.State(),
      reducer: GroupsComponent()
    )

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    store.dependencies.app.mainQueue = .immediate
    store.dependencies.app.bgQueue = .immediate
    store.dependencies.app.dbManager.getDB.run = {
      var db: Database = .unimplemented
      db.fetchGroupsPublisher.run = { query in
        self.actions.append(.didFetchGroups(query))
        return groupsSubject.eraseToAnyPublisher()
      }
      return db
    }

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

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

    let groups: [XXModels.Group] = [
      .stub(1),
      .stub(2),
      .stub(3),
    ]
    groupsSubject.send(groups)

    store.receive(.didFetchGroups(groups)) {
      $0.groups = IdentifiedArray(uniqueElements: groups)
    }

    groupsSubject.send(completion: .finished)
  }

  func testSelectGroup() {
    let store = TestStore(
      initialState: GroupsComponent.State(
        groups: IdentifiedArray(uniqueElements: [
          .stub(1),
          .stub(2),
          .stub(3),
        ])
      ),
      reducer: GroupsComponent()
    )

    store.send(.didSelectGroup(.stub(2)))
  }
}

private extension XXModels.Group {
  static func stub(_ id: Int) -> XXModels.Group {
    XXModels.Group(
      id: "group-\(id)-id".data(using: .utf8)!,
      name: "Group \(id)",
      leaderId: "group-\(id)-leader-id".data(using: .utf8)!,
      createdAt: Date(timeIntervalSince1970: TimeInterval(id * 86_400)),
      authStatus: .participating,
      serialized: "group-\(id)-serialized".data(using: .utf8)!
    )