From 8120d8c099aad0916633ca5aaeb4d80e12d07b26 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 5 Dec 2022 12:47:14 +0100 Subject: [PATCH] Use SendGroupMessage in ChatComponent --- .../Sources/AppCore/AppDependecies.swift | 7 ++ .../Sources/ChatFeature/ChatComponent.swift | 13 +++- .../ChatFeatureTests/ChatComponentTests.swift | 76 ++++++++++++++++++- 3 files changed, 93 insertions(+), 3 deletions(-) diff --git a/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift b/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift index c67559af..9e55ac6d 100644 --- a/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift +++ b/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift @@ -12,6 +12,7 @@ public struct AppDependencies { public var bgQueue: AnySchedulerOf<DispatchQueue> public var now: () -> Date public var sendMessage: SendMessage + public var sendGroupMessage: SendGroupMessage public var sendImage: SendImage public var messageListener: MessageListenerHandler public var receiveFileHandler: ReceiveFileHandler @@ -46,6 +47,11 @@ extension AppDependencies { db: dbManager.getDB, now: now ), + sendGroupMessage: .live( + messenger: messenger, + db: dbManager.getDB, + now: now + ), sendImage: .live( messenger: messenger, db: dbManager.getDB, @@ -85,6 +91,7 @@ extension AppDependencies { placeholder: Date(timeIntervalSince1970: 0) ), sendMessage: .unimplemented, + sendGroupMessage: .unimplemented, sendImage: .unimplemented, messageListener: .unimplemented, receiveFileHandler: .unimplemented, diff --git a/Examples/xx-messenger/Sources/ChatFeature/ChatComponent.swift b/Examples/xx-messenger/Sources/ChatFeature/ChatComponent.swift index a538e28e..66585edd 100644 --- a/Examples/xx-messenger/Sources/ChatFeature/ChatComponent.swift +++ b/Examples/xx-messenger/Sources/ChatFeature/ChatComponent.swift @@ -78,6 +78,7 @@ public struct ChatComponent: ReducerProtocol { @Dependency(\.app.messenger) var messenger: Messenger @Dependency(\.app.dbManager.getDB) var db: DBManagerGetDB @Dependency(\.app.sendMessage) var sendMessage: SendMessage + @Dependency(\.app.sendGroupMessage) var sendGroupMessage: SendGroupMessage @Dependency(\.app.sendImage) var sendImage: SendImage @Dependency(\.app.mainQueue) var mainQueue: AnySchedulerOf<DispatchQueue> @Dependency(\.app.bgQueue) var bgQueue: AnySchedulerOf<DispatchQueue> @@ -173,8 +174,16 @@ public struct ChatComponent: ReducerProtocol { } ) case .group(let groupId): - // TODO: send group message - fatalError() + sendGroupMessage( + text: text, + to: groupId, + onError: { error in + subscriber.send(.sendFailed(error.localizedDescription)) + }, + completion: { + subscriber.send(completion: .finished) + } + ) } return AnyCancellable {} } diff --git a/Examples/xx-messenger/Tests/ChatFeatureTests/ChatComponentTests.swift b/Examples/xx-messenger/Tests/ChatFeatureTests/ChatComponentTests.swift index 4303416c..fb77001c 100644 --- a/Examples/xx-messenger/Tests/ChatFeatureTests/ChatComponentTests.swift +++ b/Examples/xx-messenger/Tests/ChatFeatureTests/ChatComponentTests.swift @@ -306,7 +306,7 @@ final class ChatComponentTests: XCTestCase { sendMessageCompletion?() } - func testSendFailure() { + func testSendDirectMessageFailure() { var sendMessageOnError: SendMessage.OnError? var sendMessageCompletion: SendMessage.Completion? @@ -343,6 +343,80 @@ final class ChatComponentTests: XCTestCase { } } + func testSendGroupMessage() { + let groupId = "group-id".data(using: .utf8)! + let text = "Hello" + struct SendGroupMessageParams: Equatable { + var text: String + var groupId: Data + } + var didSendGroupMessageWithParams: [SendGroupMessageParams] = [] + var sendGroupMessageCompletion: SendGroupMessage.Completion? + + let store = TestStore( + initialState: ChatComponent.State(id: .group(groupId)), + reducer: ChatComponent() + ) + + store.dependencies.app.mainQueue = .immediate + store.dependencies.app.bgQueue = .immediate + store.dependencies.app.sendGroupMessage.run = { text, groupId, _, completion in + didSendGroupMessageWithParams.append(.init(text: text, groupId: groupId)) + sendGroupMessageCompletion = completion + } + + store.send(.set(\.$text, text)) { + $0.text = text + } + + store.send(.sendTapped) { + $0.text = "" + } + + XCTAssertNoDifference(didSendGroupMessageWithParams, [ + .init(text: text, groupId: groupId) + ]) + + sendGroupMessageCompletion?() + } + + func testSendGroupMessageFailure() { + var sendGroupMessageOnError: SendGroupMessage.OnError? + var sendGroupMessageCompletion: SendGroupMessage.Completion? + + let store = TestStore( + initialState: ChatComponent.State( + id: .group("group-id".data(using: .utf8)!), + text: "Hello" + ), + reducer: ChatComponent() + ) + + store.dependencies.app.mainQueue = .immediate + store.dependencies.app.bgQueue = .immediate + store.dependencies.app.sendGroupMessage.run = { _, _, onError, completion in + sendGroupMessageOnError = onError + sendGroupMessageCompletion = completion + } + + store.send(.sendTapped) { + $0.text = "" + } + + let error = NSError(domain: "test", code: 123) + sendGroupMessageOnError?(error) + + store.receive(.sendFailed(error.localizedDescription)) { + $0.sendFailure = error.localizedDescription + } + + sendGroupMessageCompletion?() + + store.send(.dismissSendFailureTapped) { + $0.sendFailure = nil + } + } + func testSendImage() { struct SendImageParams: Equatable { var image: Data -- GitLab