From 7113f386ae66fc4290bdbe078b710e4df801621c Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 26 Aug 2022 00:25:23 +0100
Subject: [PATCH] Add MessengerRegisterAuthCallbacks functor

---
 .../MessengerRegisterAuthCallbacks.swift      | 24 +++++++++++++
 .../Messenger/Messenger.swift                 |  3 ++
 .../Messenger/MessengerEnvironment.swift      |  3 ++
 .../MessengerRegisterAuthCallbacksTests.swift | 36 +++++++++++++++++++
 4 files changed, 66 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functors/MessengerRegisterAuthCallbacks.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterAuthCallbacksTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerRegisterAuthCallbacks.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegisterAuthCallbacks.swift
new file mode 100644
index 00000000..ad184957
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegisterAuthCallbacks.swift
@@ -0,0 +1,24 @@
+import XXClient
+import XCTestDynamicOverlay
+
+public struct MessengerRegisterAuthCallbacks {
+  public var run: (AuthCallbacks) -> Cancellable
+
+  public func callAsFunction(_ authCallbacks: AuthCallbacks) -> Cancellable {
+    run(authCallbacks)
+  }
+}
+
+extension MessengerRegisterAuthCallbacks {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterAuthCallbacks {
+    MessengerRegisterAuthCallbacks { callback in
+      env.authCallbacks.register(callback)
+    }
+  }
+}
+
+extension MessengerRegisterAuthCallbacks {
+  public static let unimplemented = MessengerRegisterAuthCallbacks(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 30d63efd..c9563fe8 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -8,6 +8,7 @@ public struct Messenger {
   public var create: MessengerCreate
   public var isLoaded: MessengerIsLoaded
   public var load: MessengerLoad
+  public var registerAuthCallbacks: MessengerRegisterAuthCallbacks
   public var start: MessengerStart
   public var isConnected: MessengerIsConnected
   public var connect: MessengerConnect
@@ -29,6 +30,7 @@ extension Messenger {
       create: .live(env),
       isLoaded: .live(env),
       load: .live(env),
+      registerAuthCallbacks: .live(env),
       start: .live(env),
       isConnected: .live(env),
       connect: .live(env),
@@ -51,6 +53,7 @@ extension Messenger {
     create: .unimplemented,
     isLoaded: .unimplemented,
     load: .unimplemented,
+    registerAuthCallbacks: .unimplemented,
     start: .unimplemented,
     isConnected: .unimplemented,
     connect: .unimplemented,
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index 6ac78b1e..ad94b5ce 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -3,6 +3,7 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerEnvironment {
+  public var authCallbacks: AuthCallbacksRegistry
   public var cMix: Stored<CMix?>
   public var downloadNDF: DownloadAndVerifySignedNdf
   public var e2e: Stored<E2E?>
@@ -34,6 +35,7 @@ extension MessengerEnvironment {
 
   public static func live() -> MessengerEnvironment {
     MessengerEnvironment(
+      authCallbacks: .live(),
       cMix: .inMemory(),
       downloadNDF: .live,
       e2e: .inMemory(),
@@ -60,6 +62,7 @@ extension MessengerEnvironment {
 
 extension MessengerEnvironment {
   public static let unimplemented = MessengerEnvironment(
+    authCallbacks: .unimplemented,
     cMix: .unimplemented(),
     downloadNDF: .unimplemented,
     e2e: .unimplemented(),
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterAuthCallbacksTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterAuthCallbacksTests.swift
new file mode 100644
index 00000000..d7903e2f
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterAuthCallbacksTests.swift
@@ -0,0 +1,36 @@
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+import CustomDump
+
+final class MessengerRegisterAuthCallbacksTests: XCTestCase {
+  func testRegisterAuthCallbacks() {
+    var registeredAuthCallbacks: [AuthCallbacks] = []
+    var didHandleCallbacks: [AuthCallbacks.Callback] = []
+    var didCancelRegisteredAuthCallbacks = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.authCallbacks.register = { authCallbacks in
+      registeredAuthCallbacks.append(authCallbacks)
+      return Cancellable { didCancelRegisteredAuthCallbacks += 1 }
+    }
+    let registerAuthCallbacks: MessengerRegisterAuthCallbacks = .live(env)
+    let cancellable = registerAuthCallbacks(AuthCallbacks { callback in
+      didHandleCallbacks.append(callback)
+    })
+
+    XCTAssertEqual(registeredAuthCallbacks.count, 1)
+
+    registeredAuthCallbacks.forEach { authCallbacks in
+      [AuthCallbacks.Callback].stubs.forEach { callback in
+        authCallbacks.handle(callback)
+      }
+    }
+
+    XCTAssertNoDifference(didHandleCallbacks, .stubs)
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancelRegisteredAuthCallbacks, 1)
+  }
+}
-- 
GitLab