Newer
Older
@testable import GroupsFeature
final class GroupsComponentTests: XCTestCase {
enum Action: Equatable {
case didFetchGroups(XXModels.Group.Query)
}
var actions: [Action]!
override func setUp() {
actions = []
}
override func tearDown() {
actions = nil
}
let groupsSubject = PassthroughSubject<[XXModels.Group], Error>()
let store = TestStore(
initialState: GroupsComponent.State(),
reducer: GroupsComponent()
)
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
}
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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)!
)