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
}
store.send(.start) {
$0.myContactId = myContactId
}
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
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",
status: .received
),
.init(
id: 2,
date: Date(timeIntervalSince1970: 2),
senderId: myContactId,
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
130
131
132
133
134
),
])
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
}
func testSend() {
struct SendMessageParams: Equatable {
var text: String
var recipientId: Data
}
var didSendMessageWithParams: [SendMessageParams] = []
var sendMessageCompletion: SendMessage.Completion?
let store = TestStore(
initialState: ChatState(id: .contact("contact-id".data(using: .utf8)!)),
reducer: chatReducer,
environment: .unimplemented
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.sendMessage.run = { text, recipientId, _, completion in
didSendMessageWithParams.append(.init(text: text, recipientId: recipientId))
sendMessageCompletion = completion
}
store.send(.set(\.$text, "Hello")) {
$0.text = "Hello"
}
store.send(.sendTapped) {
$0.text = ""
}
XCTAssertNoDifference(didSendMessageWithParams, [
.init(text: "Hello", recipientId: "contact-id".data(using: .utf8)!)
])
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
func testSendFailure() {
var sendMessageOnError: SendMessage.OnError?
var sendMessageCompletion: SendMessage.Completion?
let store = TestStore(
initialState: ChatState(
id: .contact("contact-id".data(using: .utf8)!),
text: "Hello"
),
reducer: chatReducer,
environment: .unimplemented
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.sendMessage.run = { _, _, onError, completion in
sendMessageOnError = onError
sendMessageCompletion = completion
}
store.send(.sendTapped) {
$0.text = ""
}
let error = NSError(domain: "test", code: 123)
sendMessageOnError?(error)
store.receive(.sendFailed(error.localizedDescription)) {
$0.sendFailure = error.localizedDescription
}
sendMessageCompletion?()
store.send(.dismissSendFailureTapped) {
$0.sendFailure = nil
}
}