From 476713202f5a5f794fff5ff97949460c136d410d Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 21 Nov 2022 11:32:14 +0100
Subject: [PATCH] Add MessengerRegisterGroupChatProcessor

---
 .../MessengerRegisterGroupChatProcessor.swift | 24 +++++++++++++
 .../Messenger/Messenger.swift                 |  3 ++
 ...engerRegisterGroupChatProcessorTests.swift | 34 +++++++++++++++++++
 3 files changed, 61 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupChatProcessor.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupChatProcessorTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupChatProcessor.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupChatProcessor.swift
new file mode 100644
index 00000000..2830dd1a
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupChatProcessor.swift
@@ -0,0 +1,24 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerRegisterGroupChatProcessor {
+  public var run: (GroupChatProcessor) -> Cancellable
+
+  public func callAsFunction(_ processor: GroupChatProcessor) -> Cancellable {
+    run(processor)
+  }
+}
+
+extension MessengerRegisterGroupChatProcessor {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterGroupChatProcessor {
+    MessengerRegisterGroupChatProcessor { processor in
+      env.groupChatProcessors.register(processor)
+    }
+  }
+}
+
+extension MessengerRegisterGroupChatProcessor {
+  public static let unimplemented = MessengerRegisterGroupChatProcessor(
+    run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 4e5585ac..44b213cb 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -50,6 +50,7 @@ public struct Messenger {
   public var trackServices: MessengerTrackServices
   public var getNotificationReports: MessengerGetNotificationReports
   public var registerGroupRequestHandler: MessengerRegisterGroupRequestHandler
+  public var registerGroupChatProcessor: MessengerRegisterGroupChatProcessor
   public var startGroupChat: MessengerStartGroupChat
 }
 
@@ -105,6 +106,7 @@ extension Messenger {
       trackServices: .live(env),
       getNotificationReports: .live(env),
       registerGroupRequestHandler: .live(env),
+      registerGroupChatProcessor: .live(env),
       startGroupChat: .live(env)
     )
   }
@@ -161,6 +163,7 @@ extension Messenger {
     trackServices: .unimplemented,
     getNotificationReports: .unimplemented,
     registerGroupRequestHandler: .unimplemented,
+    registerGroupChatProcessor: .unimplemented,
     startGroupChat: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupChatProcessorTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupChatProcessorTests.swift
new file mode 100644
index 00000000..ca517a3c
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupChatProcessorTests.swift
@@ -0,0 +1,34 @@
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRegisterGroupChatProcessorTests: XCTestCase {
+  func testRegister() {
+    var registered: [GroupChatProcessor] = []
+    var didHandle: [GroupChatProcessor.Result] = []
+    var didCancel = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.groupChatProcessors.register = { processor in
+      registered.append(processor)
+      return Cancellable { didCancel += 1 }
+    }
+    let register: MessengerRegisterGroupChatProcessor = .live(env)
+    let cancellable = register(.init { result in
+      didHandle.append(result)
+    })
+
+    XCTAssertEqual(registered.count, 1)
+
+    let result = GroupChatProcessor.Result.success(.stub())
+    registered.forEach { processor in
+      processor.handle(result)
+    }
+
+    XCTAssertEqual(didHandle, [result])
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancel, 1)
+  }
+}
-- 
GitLab