From 64e348f1f507274f95712ad95bd9984426c8d4ff Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 21 Nov 2022 11:29:07 +0100
Subject: [PATCH] Add MessengerRegisterGroupRequestHandler

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

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift
new file mode 100644
index 00000000..d298952d
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift
@@ -0,0 +1,24 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerRegisterGroupRequestHandler {
+  public var run: (GroupRequest) -> Cancellable
+
+  public func callAsFunction(_ handler: GroupRequest) -> Cancellable {
+    run(handler)
+  }
+}
+
+extension MessengerRegisterGroupRequestHandler {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterGroupRequestHandler {
+    MessengerRegisterGroupRequestHandler { handler in
+      env.groupRequests.register(handler)
+    }
+  }
+}
+
+extension MessengerRegisterGroupRequestHandler {
+  public static let unimplemented = MessengerRegisterGroupRequestHandler(
+    run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 8a29ed6a..4e5585ac 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -49,6 +49,7 @@ public struct Messenger {
   public var receiveFile: MessengerReceiveFile
   public var trackServices: MessengerTrackServices
   public var getNotificationReports: MessengerGetNotificationReports
+  public var registerGroupRequestHandler: MessengerRegisterGroupRequestHandler
   public var startGroupChat: MessengerStartGroupChat
 }
 
@@ -103,6 +104,7 @@ extension Messenger {
       receiveFile: .live(env),
       trackServices: .live(env),
       getNotificationReports: .live(env),
+      registerGroupRequestHandler: .live(env),
       startGroupChat: .live(env)
     )
   }
@@ -158,6 +160,7 @@ extension Messenger {
     receiveFile: .unimplemented,
     trackServices: .unimplemented,
     getNotificationReports: .unimplemented,
+    registerGroupRequestHandler: .unimplemented,
     startGroupChat: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift
new file mode 100644
index 00000000..0bca164c
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift
@@ -0,0 +1,34 @@
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRegisterGroupRequestHandlerTests: XCTestCase {
+  func testRegister() {
+    var registered: [GroupRequest] = []
+    var didHandle: [Group] = []
+    var didCancel = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.groupRequests.register = { handler in
+      registered.append(handler)
+      return Cancellable { didCancel += 1 }
+    }
+    let register: MessengerRegisterGroupRequestHandler = .live(env)
+    let cancellable = register(.init { group in
+      didHandle.append(group)
+    })
+
+    XCTAssertEqual(registered.count, 1)
+
+    let group = Group.stub(1)
+    registered.forEach { handler in
+      handler.handle(group)
+    }
+
+    XCTAssertEqual(didHandle.map { $0.getId() }, [group.getId()])
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancel, 1)
+  }
+}
-- 
GitLab