From e7a5744e3990f50fc0558b5ee1aedf020ce5dcc3 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 13 Sep 2022 10:28:01 +0200
Subject: [PATCH] Add MessengerRegisterMessageListener function

---
 .../MessengerRegisterMessageListener.swift    | 24 +++++++++++++
 .../Messenger/MessengerEnvironment.swift      |  3 ++
 ...essengerRegisterMessageListenerTests.swift | 34 +++++++++++++++++++
 3 files changed, 61 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterMessageListener.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterMessageListenerTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterMessageListener.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterMessageListener.swift
new file mode 100644
index 00000000..666e2634
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterMessageListener.swift
@@ -0,0 +1,24 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerRegisterMessageListener {
+  public var run: (Listener) -> Cancellable
+
+  public func callAsFunction(_ listener: Listener) -> Cancellable {
+    run(listener)
+  }
+}
+
+extension MessengerRegisterMessageListener {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterMessageListener {
+    MessengerRegisterMessageListener { listener in
+      env.messageListeners.register(listener)
+    }
+  }
+}
+
+extension MessengerRegisterMessageListener {
+  public static let unimplemented = MessengerRegisterMessageListener(
+    run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index 9c483774..b4ff607e 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -16,6 +16,7 @@ public struct MessengerEnvironment {
   public var loadCMix: LoadCMix
   public var login: Login
   public var lookupUD: LookupUD
+  public var messageListeners: ListenersRegistry
   public var ndfEnvironment: NDFEnvironment
   public var newCMix: NewCMix
   public var newOrLoadUd: NewOrLoadUd
@@ -52,6 +53,7 @@ extension MessengerEnvironment {
       loadCMix: .live,
       login: .live,
       lookupUD: .live,
+      messageListeners: .live(),
       ndfEnvironment: .mainnet,
       newCMix: .live,
       newOrLoadUd: .live,
@@ -83,6 +85,7 @@ extension MessengerEnvironment {
     loadCMix: .unimplemented,
     login: .unimplemented,
     lookupUD: .unimplemented,
+    messageListeners: .unimplemented,
     ndfEnvironment: .unimplemented,
     newCMix: .unimplemented,
     newOrLoadUd: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterMessageListenerTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterMessageListenerTests.swift
new file mode 100644
index 00000000..0deedefb
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterMessageListenerTests.swift
@@ -0,0 +1,34 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRegisterMessageListenerTests: XCTestCase {
+  func testRegisterAuthCallbacks() {
+    var registeredListeners: [Listener] = []
+    var didHandleMessage: [Message] = []
+    var didCancelRegisteredListener = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.messageListeners.register = { listener in
+      registeredListeners.append(listener)
+      return Cancellable { didCancelRegisteredListener += 1 }
+    }
+    let registerMessageListener: MessengerRegisterMessageListener = .live(env)
+    let cancellable = registerMessageListener(Listener { message in
+      didHandleMessage.append(message)
+    })
+
+    XCTAssertEqual(registeredListeners.count, 1)
+
+    registeredListeners.forEach { listener in
+      listener.handle(Message.stub(123))
+    }
+
+    XCTAssertNoDifference(didHandleMessage, [Message.stub(123)])
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancelRegisteredListener, 1)
+  }
+}
-- 
GitLab