Skip to content
Snippets Groups Projects
Commit 311fbed0 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add Completion to SendMessage function

parent 388c66c7
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!87Messenger example - chat
......@@ -6,15 +6,17 @@ import XXModels
public struct SendMessage {
public typealias OnError = (Error) -> Void
public typealias Completion = () -> Void
public var run: (String, Data, @escaping OnError) -> Void
public var run: (String, Data, @escaping OnError, @escaping Completion) -> Void
public func callAsFunction(
text: String,
to recipientId: Data,
onError: @escaping OnError
onError: @escaping OnError,
completion: @escaping Completion
) {
run(text, recipientId, onError)
run(text, recipientId, onError, completion)
}
}
......@@ -24,7 +26,7 @@ extension SendMessage {
db: DBManagerGetDB,
now: @escaping () -> Date
) -> SendMessage {
SendMessage { text, recipientId, onError in
SendMessage { text, recipientId, onError, completion in
do {
let myContactId = try messenger.e2e.tryGet().getContact().getId()
let message = try db().saveMessage(.init(
......@@ -59,6 +61,7 @@ extension SendMessage {
} catch {
onError(error)
}
completion()
}
)
if var message = try db().fetchMessages(.init(id: [message.id])).first {
......@@ -68,6 +71,7 @@ extension SendMessage {
}
} catch {
onError(error)
completion()
}
}
}
......
......@@ -154,10 +154,12 @@ public let chatReducer = Reducer<ChatState, ChatAction, ChatEnvironment>
onError: { error in
// TODO: handle error
print("^^^ ERROR: \(error)")
},
completion: {
subscriber.send(completion: .finished)
}
)
}
subscriber.send(completion: .finished)
return AnyCancellable {}
}
.subscribe(on: env.bgQueue)
......
......@@ -23,6 +23,7 @@ final class SendMessageTests: XCTestCase {
var dbDidFetchMessagesWithQuery: [XXModels.Message.Query] = []
var dbDidBulkUpdateMessages: [MessageBulkUpdate] = []
var didReceiveError: [Error] = []
var didComplete = 0
let myContactId = "my-contact-id".data(using: .utf8)!
let text = "Hello"
......@@ -82,7 +83,8 @@ final class SendMessageTests: XCTestCase {
send(
text: text,
to: recipientId,
onError: { error in didReceiveError.append(error) }
onError: { error in didReceiveError.append(error) },
completion: { didComplete += 1 }
)
XCTAssertNoDifference(dbDidSaveMessage, [
......@@ -116,6 +118,7 @@ final class SendMessageTests: XCTestCase {
])
dbDidBulkUpdateMessages = []
didComplete = 0
messengerDidSendMessageWithDeliveryCallback.first??(.init(
report: sendReport,
result: .delivered
......@@ -124,8 +127,10 @@ final class SendMessageTests: XCTestCase {
XCTAssertNoDifference(dbDidBulkUpdateMessages, [
.init(query: .init(id: [messageId]), assignments: .init(status: .sent))
])
XCTAssertNoDifference(didComplete, 1)
dbDidBulkUpdateMessages = []
didComplete = 0
messengerDidSendMessageWithDeliveryCallback.first??(.init(
report: sendReport,
result: .notDelivered(timedOut: true)
......@@ -134,8 +139,10 @@ final class SendMessageTests: XCTestCase {
XCTAssertNoDifference(dbDidBulkUpdateMessages, [
.init(query: .init(id: [messageId]), assignments: .init(status: .sendingTimedOut))
])
XCTAssertNoDifference(didComplete, 1)
dbDidBulkUpdateMessages = []
didComplete = 0
messengerDidSendMessageWithDeliveryCallback.first??(.init(
report: sendReport,
result: .notDelivered(timedOut: false)
......@@ -144,19 +151,23 @@ final class SendMessageTests: XCTestCase {
XCTAssertNoDifference(dbDidBulkUpdateMessages, [
.init(query: .init(id: [messageId]), assignments: .init(status: .sendingFailed))
])
XCTAssertNoDifference(didComplete, 1)
dbDidBulkUpdateMessages = []
didComplete = 0
let deliveryFailure = NSError(domain: "test", code: 123)
messengerDidSendMessageWithDeliveryCallback.first??(.init(
report: sendReport,
result: .failure(deliveryFailure)
))
XCTAssertNoDifference(didComplete, 1)
XCTAssertNoDifference(dbDidBulkUpdateMessages, [
.init(query: .init(id: [messageId]), assignments: .init(status: .sendingFailed))
])
XCTAssertNoDifference(didReceiveError.count, 1)
XCTAssertNoDifference(didReceiveError.first as NSError?, deliveryFailure)
XCTAssertNoDifference(didComplete, 1)
}
func testSendDatabaseFailure() {
......@@ -164,6 +175,7 @@ final class SendMessageTests: XCTestCase {
let error = Failure()
var didReceiveError: [Error] = []
var didComplete = 0
var messenger: Messenger = .unimplemented
messenger.e2e.get = {
......@@ -186,11 +198,13 @@ final class SendMessageTests: XCTestCase {
send(
text: "Hello",
to: "recipient-id".data(using: .utf8)!,
onError: { error in didReceiveError.append(error) }
onError: { error in didReceiveError.append(error) },
completion: { didComplete += 1 }
)
XCTAssertNoDifference(didReceiveError.count, 1)
XCTAssertNoDifference(didReceiveError.first as? Failure, error)
XCTAssertNoDifference(didComplete, 1)
}
func testBulkUpdateOnDeliveryFailure() {
......@@ -206,6 +220,7 @@ final class SendMessageTests: XCTestCase {
var messengerDidSendMessageWithDeliveryCallback: [MessengerSendMessage.DeliveryCallback?] = []
var didReceiveError: [Error] = []
var didComplete = 0
var messenger: Messenger = .unimplemented
messenger.e2e.get = {
......@@ -238,7 +253,8 @@ final class SendMessageTests: XCTestCase {
send(
text: "Hello",
to: "recipient-id".data(using: .utf8)!,
onError: { error in didReceiveError.append(error) }
onError: { error in didReceiveError.append(error) },
completion: { didComplete += 1 }
)
messengerDidSendMessageWithDeliveryCallback.first??(.init(
......@@ -248,6 +264,7 @@ final class SendMessageTests: XCTestCase {
XCTAssertNoDifference(didReceiveError.count, 1)
XCTAssertNoDifference(didReceiveError.first as? Failure, error)
XCTAssertNoDifference(didComplete, 1)
}
}
import AppCore
import Combine
import ComposableArchitecture
import CustomDump
......@@ -139,6 +140,7 @@ final class ChatFeatureTests: XCTestCase {
var recipientId: Data
}
var didSendMessageWithParams: [SendMessageParams] = []
var sendMessageCompletion: SendMessage.Completion?
let store = TestStore(
initialState: ChatState(id: .contact("contact-id".data(using: .utf8)!)),
......@@ -148,8 +150,9 @@ final class ChatFeatureTests: XCTestCase {
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.sendMessage.run = { text, recipientId, _ in
store.environment.sendMessage.run = { text, recipientId, _, completion in
didSendMessageWithParams.append(.init(text: text, recipientId: recipientId))
sendMessageCompletion = completion
}
store.send(.set(\.$text, "Hello")) {
......@@ -163,5 +166,7 @@ final class ChatFeatureTests: XCTestCase {
XCTAssertNoDifference(didSendMessageWithParams, [
.init(text: "Hello", recipientId: "contact-id".data(using: .utf8)!)
])
sendMessageCompletion?()
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment