From c0220e52e51a0197cf8b857a4e67d109a98009eb Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Wed, 28 Sep 2022 13:12:06 +0200 Subject: [PATCH] Add backup callbacks registry --- .../Utils/BackupCallbackRegistry.swift | 36 ++++++++++++++++ .../Utils/BackupCallbackRegistryTests.swift | 43 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Sources/XXMessengerClient/Utils/BackupCallbackRegistry.swift create mode 100644 Tests/XXMessengerClientTests/Utils/BackupCallbackRegistryTests.swift diff --git a/Sources/XXMessengerClient/Utils/BackupCallbackRegistry.swift b/Sources/XXMessengerClient/Utils/BackupCallbackRegistry.swift new file mode 100644 index 00000000..7c7fc9e8 --- /dev/null +++ b/Sources/XXMessengerClient/Utils/BackupCallbackRegistry.swift @@ -0,0 +1,36 @@ +import Foundation +import XCTestDynamicOverlay +import XXClient + +public struct BackupCallbacksRegistry { + public var register: (UpdateBackupFunc) -> Cancellable + public var registered: () -> UpdateBackupFunc +} + +extension BackupCallbacksRegistry { + public static func live() -> BackupCallbacksRegistry { + class Registry { + var callbacks: [UUID: UpdateBackupFunc] = [:] + } + let registry = Registry() + return BackupCallbacksRegistry( + register: { callback in + let id = UUID() + registry.callbacks[id] = callback + return Cancellable { registry.callbacks[id] = nil } + }, + registered: { + UpdateBackupFunc { data in + registry.callbacks.values.forEach { $0.handle(data) } + } + } + ) + } +} + +extension BackupCallbacksRegistry { + public static let unimplemented = BackupCallbacksRegistry( + register: XCTUnimplemented("\(Self.self).register", placeholder: Cancellable {}), + registered: XCTUnimplemented("\(Self.self).registered", placeholder: UpdateBackupFunc { _ in }) + ) +} diff --git a/Tests/XXMessengerClientTests/Utils/BackupCallbackRegistryTests.swift b/Tests/XXMessengerClientTests/Utils/BackupCallbackRegistryTests.swift new file mode 100644 index 00000000..d3cba50c --- /dev/null +++ b/Tests/XXMessengerClientTests/Utils/BackupCallbackRegistryTests.swift @@ -0,0 +1,43 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class BackupCallbackRegistryTests: XCTestCase { + func testRegistry() { + var firstCallbackDidHandle: [Data] = [] + var secondCallbackDidHandle: [Data] = [] + + let firstCallback = UpdateBackupFunc { data in + firstCallbackDidHandle.append(data) + } + let secondCallback = UpdateBackupFunc { data in + secondCallbackDidHandle.append(data) + } + let callbackRegistry: BackupCallbacksRegistry = .live() + let registeredCallbacks = callbackRegistry.registered() + let firstCallbackCancellable = callbackRegistry.register(firstCallback) + let secondCallbackCancellable = callbackRegistry.register(secondCallback) + + let firstData = "1".data(using: .utf8)! + registeredCallbacks.handle(firstData) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstData]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstData]) + + firstCallbackCancellable.cancel() + let secondData = "2".data(using: .utf8)! + registeredCallbacks.handle(secondData) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstData]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstData, secondData]) + + secondCallbackCancellable.cancel() + + let thirdData = "3".data(using: .utf8)! + registeredCallbacks.handle(thirdData) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstData]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstData, secondData]) + } +} -- GitLab