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