From b9bf9513638b31617f43ad9eafa3e968afafa18a Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 13 Sep 2022 10:47:53 +0200
Subject: [PATCH] Add MessengerListenForMessages function

---
 .../MessengerListenForMessages.swift          | 35 ++++++++++
 .../MessengerListenForMessagesTests.swift     | 69 +++++++++++++++++++
 2 files changed, 104 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
new file mode 100644
index 00000000..90fa02da
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
@@ -0,0 +1,35 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerListenForMessages {
+  public enum Error: Swift.Error {
+    case notConnected
+  }
+
+  public var run: () throws -> Void
+
+  public func callAsFunction() throws -> Void {
+    try run()
+  }
+}
+
+extension MessengerListenForMessages {
+  public static func live(_ env: MessengerEnvironment) -> MessengerListenForMessages {
+    MessengerListenForMessages {
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      try e2e.registerListener(
+        senderId: nil,
+        messageType: 2,
+        callback: env.messageListeners.registered()
+      )
+    }
+  }
+}
+
+extension MessengerListenForMessages {
+  public static let unimplemented = MessengerListenForMessages(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift
new file mode 100644
index 00000000..948ee33e
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift
@@ -0,0 +1,69 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerListenForMessagesTests: XCTestCase {
+  func testListen() throws {
+    struct RegisterListenerParams: Equatable {
+      var senderId: Data?
+      var messageType: Int
+    }
+    var didRegisterListenerWithParams: [RegisterListenerParams] = []
+    var didRegisterListenerWithCallback: [Listener] = []
+    var didHandleMessage: [Message] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.registerListener.run = { senderId, messageType, callback in
+        didRegisterListenerWithParams.append(.init(senderId: senderId, messageType: messageType))
+        didRegisterListenerWithCallback.append(callback)
+      }
+      return e2e
+    }
+    env.messageListeners.registered = {
+      Listener { message in didHandleMessage.append(message) }
+    }
+    let listen: MessengerListenForMessages = .live(env)
+
+    try listen()
+
+    XCTAssertNoDifference(didRegisterListenerWithParams, [
+      .init(senderId: nil, messageType: 2)
+    ])
+
+    let message = Message.stub(123)
+    didRegisterListenerWithCallback.first?.handle(message)
+
+    XCTAssertNoDifference(didHandleMessage, [message])
+  }
+
+  func testListenWhenNotLoggedIn() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let listen: MessengerListenForMessages = .live(env)
+
+    XCTAssertThrowsError(try listen()) { error in
+      XCTAssertNoDifference(error as? MessengerListenForMessages.Error, .notConnected)
+    }
+  }
+
+  func testListenFailure() {
+    struct Failure: Error, Equatable {}
+    let error = Failure()
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.registerListener.run = { _, _, _ in throw error }
+      return e2e
+    }
+    env.messageListeners.registered = { Listener.unimplemented }
+    let listen: MessengerListenForMessages = .live(env)
+
+    XCTAssertThrowsError(try listen()) { err in
+      XCTAssertNoDifference(err as? Failure, error)
+    }
+  }
+}
-- 
GitLab