Skip to content
Snippets Groups Projects
Commit c0220e52 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add backup callbacks registry

parent d0112814
No related branches found
No related tags found
2 merge requests!107Messenger - backup,!102Release 1.0.0
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 })
)
}
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])
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment