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