Newer
Older
import XXClient
import XXMessengerClient
import XXModels
@testable import ChatFeature
final class ChatFeatureTests: XCTestCase {
func testStart() {
let contactId = "contact-id".data(using: .utf8)!
let myContactId = "my-contact-id".data(using: .utf8)!
let store = TestStore(
initialState: ChatState(id: .contact(contactId)),
reducer: chatReducer,
environment: .unimplemented
)
var didFetchMessagesWithQuery: [XXModels.Message.Query] = []
let messagesPublisher = PassthroughSubject<[XXModels.Message], Error>()
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getContact.run = {
var contact: XXClient.Contact = .unimplemented(Data())
contact.getIdFromContact.run = { _ in myContactId }
return contact
}
return e2e
}
store.environment.db.run = {
var db: Database = .failing
db.fetchMessagesPublisher.run = { query in
didFetchMessagesWithQuery.append(query)
return messagesPublisher.eraseToAnyPublisher()
}
return db
}
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
XCTAssertNoDifference(didFetchMessagesWithQuery, [
.init(chat: .direct(myContactId, contactId))
])
messagesPublisher.send([
.init(
id: nil,
senderId: contactId,
recipientId: myContactId,
groupId: nil,
date: Date(timeIntervalSince1970: 0),
status: .received,
isUnread: false,
text: "Message 0"
),
.init(
id: 1,
senderId: contactId,
recipientId: myContactId,
groupId: nil,
date: Date(timeIntervalSince1970: 1),
status: .received,
isUnread: false,
text: "Message 1"
),
.init(
id: 2,
senderId: myContactId,
recipientId: contactId,
groupId: nil,
date: Date(timeIntervalSince1970: 2),
status: .sent,
isUnread: false,
text: "Message 2"
),
])
let expectedMessages = IdentifiedArrayOf<ChatState.Message>(uniqueElements: [
.init(
id: 1,
date: Date(timeIntervalSince1970: 1),
senderId: contactId,
text: "Message 1"
),
.init(
id: 2,
date: Date(timeIntervalSince1970: 2),
senderId: myContactId,
text: "Message 2"
),
])
store.receive(.didFetchMessages(expectedMessages)) {
$0.messages = expectedMessages
}
messagesPublisher.send(completion: .finished)
}
func testStartFailure() {
let store = TestStore(
initialState: ChatState(id: .contact("contact-id".data(using: .utf8)!)),
reducer: chatReducer,
environment: .unimplemented
)
struct Failure: Error {}
let error = Failure()
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getContact.run = {
var contact: XXClient.Contact = .unimplemented(Data())
contact.getIdFromContact.run = { _ in throw error }
return contact
}
return e2e
}
store.send(.start) {
$0.failure = error.localizedDescription
}