From d08dae564071d70a16b39990af43b88726577621 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Fri, 26 Aug 2022 00:23:22 +0100 Subject: [PATCH] Add AuthCallbacksRegistry --- .../Utils/AuthCallbacksRegistry.swift | 36 ++++++++++++++++ .../AuthCallback.Callback+stubs.swift | 24 +++++++++++ .../Utils/AuthCallbacksRegistryTests.swift | 43 +++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 Sources/XXMessengerClient/Utils/AuthCallbacksRegistry.swift create mode 100644 Tests/XXMessengerClientTests/TestHelpers/AuthCallback.Callback+stubs.swift create mode 100644 Tests/XXMessengerClientTests/Utils/AuthCallbacksRegistryTests.swift diff --git a/Sources/XXMessengerClient/Utils/AuthCallbacksRegistry.swift b/Sources/XXMessengerClient/Utils/AuthCallbacksRegistry.swift new file mode 100644 index 00000000..dfe8bce2 --- /dev/null +++ b/Sources/XXMessengerClient/Utils/AuthCallbacksRegistry.swift @@ -0,0 +1,36 @@ +import XXClient +import XCTestDynamicOverlay +import Foundation + +public struct AuthCallbacksRegistry { + public var register: (AuthCallbacks) -> Cancellable + public var registered: () -> AuthCallbacks +} + +extension AuthCallbacksRegistry { + public static func live() -> AuthCallbacksRegistry { + class Registry { + var authCallbacks: [UUID: AuthCallbacks] = [:] + } + let registry = Registry() + return AuthCallbacksRegistry( + register: { authCallbacks in + let id = UUID() + registry.authCallbacks[id] = authCallbacks + return Cancellable { registry.authCallbacks[id] = nil } + }, + registered: { + AuthCallbacks { callback in + registry.authCallbacks.values.forEach { $0.handle(callback) } + } + } + ) + } +} + +extension AuthCallbacksRegistry { + public static let unimplemented = AuthCallbacksRegistry( + register: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {}), + registered: XCTUnimplemented("\(Self.self)", placeholder: AuthCallbacks { _ in }) + ) +} diff --git a/Tests/XXMessengerClientTests/TestHelpers/AuthCallback.Callback+stubs.swift b/Tests/XXMessengerClientTests/TestHelpers/AuthCallback.Callback+stubs.swift new file mode 100644 index 00000000..9617c0b2 --- /dev/null +++ b/Tests/XXMessengerClientTests/TestHelpers/AuthCallback.Callback+stubs.swift @@ -0,0 +1,24 @@ +import XXClient + +extension Array where Element == AuthCallbacks.Callback { + static let stubs: [AuthCallbacks.Callback] = [ + .confirm( + contact: "contact-1".data(using: .utf8)!, + receptionId: "reception-id-1".data(using: .utf8)!, + ephemeralId: 1, + roundId: 1 + ), + .request( + contact: "contact-2".data(using: .utf8)!, + receptionId: "reception-id-2".data(using: .utf8)!, + ephemeralId: 2, + roundId: 2 + ), + .reset( + contact: "contact-3".data(using: .utf8)!, + receptionId: "reception-id-3".data(using: .utf8)!, + ephemeralId: 3, + roundId: 3 + ), + ] +} diff --git a/Tests/XXMessengerClientTests/Utils/AuthCallbacksRegistryTests.swift b/Tests/XXMessengerClientTests/Utils/AuthCallbacksRegistryTests.swift new file mode 100644 index 00000000..1d1ba7b2 --- /dev/null +++ b/Tests/XXMessengerClientTests/Utils/AuthCallbacksRegistryTests.swift @@ -0,0 +1,43 @@ +import XCTest +import XXClient +@testable import XXMessengerClient +import CustomDump + +final class AuthCallbacksRegistryTests: XCTestCase { + func testRegistry() { + var firstAuthCallbacksDidHandle: [AuthCallbacks.Callback] = [] + var secondAuthCallbacksDidHandle: [AuthCallbacks.Callback] = [] + + let firstAuthCallbacks = AuthCallbacks { callback in + firstAuthCallbacksDidHandle.append(callback) + } + let secondAuthCallbacks = AuthCallbacks { callback in + secondAuthCallbacksDidHandle.append(callback) + } + let messengerAuthCallbacks: AuthCallbacksRegistry = .live() + let registeredAuthCallbacks = messengerAuthCallbacks.registered() + let firstAuthCallbacksCancellable = messengerAuthCallbacks.register(firstAuthCallbacks) + let secondAuthCallbacksCancellable = messengerAuthCallbacks.register(secondAuthCallbacks) + + let firstCallback = [AuthCallbacks.Callback].stubs[0] + registeredAuthCallbacks.handle(firstCallback) + + XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback]) + XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback]) + + firstAuthCallbacksCancellable.cancel() + let secondCallback = [AuthCallbacks.Callback].stubs[1] + registeredAuthCallbacks.handle(secondCallback) + + XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback]) + XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback, secondCallback]) + + secondAuthCallbacksCancellable.cancel() + + let thirdCallback = [AuthCallbacks.Callback].stubs[2] + registeredAuthCallbacks.handle(thirdCallback) + + XCTAssertNoDifference(firstAuthCallbacksDidHandle, [firstCallback]) + XCTAssertNoDifference(secondAuthCallbacksDidHandle, [firstCallback, secondCallback]) + } +} -- GitLab