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

Add ReceiveFileCallbacksRegistry

parent cb778700
No related branches found
No related tags found
2 merge requests!123Messenger receive file,!102Release 1.0.0
import Foundation
import XCTestDynamicOverlay
import XXClient
public struct ReceiveFileCallbacksRegistry {
public var register: (ReceiveFileCallback) -> Cancellable
public var registered: () -> ReceiveFileCallback
}
extension ReceiveFileCallbacksRegistry {
public static func live() -> ReceiveFileCallbacksRegistry {
class Registry {
var callbacks: [UUID: ReceiveFileCallback] = [:]
}
let registry = Registry()
return ReceiveFileCallbacksRegistry(
register: { callback in
let id = UUID()
registry.callbacks[id] = callback
return Cancellable { registry.callbacks[id] = nil }
},
registered: {
ReceiveFileCallback { result in
registry.callbacks.values.forEach { $0.handle(result) }
}
}
)
}
}
extension ReceiveFileCallbacksRegistry {
public static let unimplemented = ReceiveFileCallbacksRegistry(
register: XCTUnimplemented("\(Self.self).register", placeholder: Cancellable {}),
registered: XCTUnimplemented("\(Self.self).registered", placeholder: .unimplemented)
)
}
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient
final class ReceiveFileCallbacksRegistryTests: XCTestCase {
func testRegistry() {
var firstCallbackDidHandle: [Result<ReceivedFile, NSError>] = []
var secondCallbackDidHandle: [Result<ReceivedFile, NSError>] = []
let firstCallback = ReceiveFileCallback { result in
firstCallbackDidHandle.append(result)
}
let secondCallback = ReceiveFileCallback { result in
secondCallbackDidHandle.append(result)
}
let callbackRegistry: ReceiveFileCallbacksRegistry = .live()
let registeredCallbacks = callbackRegistry.registered()
let firstCallbackCancellable = callbackRegistry.register(firstCallback)
let secondCallbackCancellable = callbackRegistry.register(secondCallback)
let firstResult = Result<ReceivedFile, NSError>.success(.stub(1))
registeredCallbacks.handle(firstResult)
XCTAssertNoDifference(firstCallbackDidHandle, [firstResult])
XCTAssertNoDifference(secondCallbackDidHandle, [firstResult])
firstCallbackCancellable.cancel()
let secondError = NSError(domain: "test", code: 321)
let secondResult = Result<ReceivedFile, NSError>.failure(secondError)
registeredCallbacks.handle(secondResult)
XCTAssertNoDifference(firstCallbackDidHandle, [firstResult])
XCTAssertNoDifference(secondCallbackDidHandle, [firstResult, secondResult])
secondCallbackCancellable.cancel()
let thirdData = Result<ReceivedFile, NSError>.success(.stub(2))
registeredCallbacks.handle(thirdData)
XCTAssertNoDifference(firstCallbackDidHandle, [firstResult])
XCTAssertNoDifference(secondCallbackDidHandle, [firstResult, secondResult])
}
}
private extension ReceivedFile {
static func stub(_ id: Int) -> ReceivedFile {
ReceivedFile(
transferId: "transfer-id-\(id)".data(using: .utf8)!,
senderId: "sender-id-\(id)".data(using: .utf8)!,
preview: "preview-\(id)".data(using: .utf8)!,
name: "name-\(id)",
type: "type-\(id)",
size: id
)
}
}
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