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

Add GroupChatProcessorRegistry

parent 19719a9e
No related branches found
No related tags found
2 merge requests!147Group Chats,!102Release 1.0.0
...@@ -2,6 +2,8 @@ import Bindings ...@@ -2,6 +2,8 @@ import Bindings
import XCTestDynamicOverlay import XCTestDynamicOverlay
public struct GroupChatProcessor { public struct GroupChatProcessor {
public typealias Result = Swift.Result<Callback, NSError>
public struct Callback: Equatable { public struct Callback: Equatable {
public init( public init(
decryptedMessage: GroupChatMessage, decryptedMessage: GroupChatMessage,
...@@ -29,14 +31,14 @@ public struct GroupChatProcessor { ...@@ -29,14 +31,14 @@ public struct GroupChatProcessor {
public init( public init(
name: String = "GroupChatProcessor", name: String = "GroupChatProcessor",
handle: @escaping (Result<Callback, NSError>) -> Void handle: @escaping (Result) -> Void
) { ) {
self.name = name self.name = name
self.handle = handle self.handle = handle
} }
public var name: String public var name: String
public var handle: (Result<Callback, NSError>) -> Void public var handle: (Result) -> Void
} }
extension GroupChatProcessor { extension GroupChatProcessor {
......
...@@ -18,6 +18,7 @@ public struct MessengerEnvironment { ...@@ -18,6 +18,7 @@ public struct MessengerEnvironment {
public var getFileTransferParams: GetFileTransferParams public var getFileTransferParams: GetFileTransferParams
public var getNotificationsReport: GetNotificationsReport public var getNotificationsReport: GetNotificationsReport
public var getSingleUseParams: GetSingleUseParams public var getSingleUseParams: GetSingleUseParams
public var groupChatProcessors: GroupChatProcessorRegistry
public var groupRequests: GroupRequestCallbacksRegistry public var groupRequests: GroupRequestCallbacksRegistry
public var initFileTransfer: InitFileTransfer public var initFileTransfer: InitFileTransfer
public var initializeBackup: InitializeBackup public var initializeBackup: InitializeBackup
...@@ -72,6 +73,7 @@ extension MessengerEnvironment { ...@@ -72,6 +73,7 @@ extension MessengerEnvironment {
getFileTransferParams: .liveDefault, getFileTransferParams: .liveDefault,
getNotificationsReport: .live, getNotificationsReport: .live,
getSingleUseParams: .liveDefault, getSingleUseParams: .liveDefault,
groupChatProcessors: .live(),
groupRequests: .live(), groupRequests: .live(),
initFileTransfer: .live, initFileTransfer: .live,
initializeBackup: .live, initializeBackup: .live,
...@@ -121,6 +123,7 @@ extension MessengerEnvironment { ...@@ -121,6 +123,7 @@ extension MessengerEnvironment {
getFileTransferParams: .unimplemented, getFileTransferParams: .unimplemented,
getNotificationsReport: .unimplemented, getNotificationsReport: .unimplemented,
getSingleUseParams: .unimplemented, getSingleUseParams: .unimplemented,
groupChatProcessors: .unimplemented,
groupRequests: .unimplemented, groupRequests: .unimplemented,
initFileTransfer: .unimplemented, initFileTransfer: .unimplemented,
initializeBackup: .unimplemented, initializeBackup: .unimplemented,
......
import Foundation
import XCTestDynamicOverlay
import XXClient
public struct GroupChatProcessorRegistry {
public var register: (GroupChatProcessor) -> Cancellable
public var registered: () -> GroupChatProcessor
}
extension GroupChatProcessorRegistry {
public static func live() -> GroupChatProcessorRegistry {
class Registry {
var items: [UUID: GroupChatProcessor] = [:]
}
let registry = Registry()
return GroupChatProcessorRegistry(
register: { processor in
let id = UUID()
registry.items[id] = processor
return Cancellable { registry.items[id] = nil }
},
registered: {
GroupChatProcessor(
name: "GroupChatProcessorRegistry.registered",
handle: { result in
registry.items.values.forEach { $0.handle(result) }
}
)
}
)
}
}
extension GroupChatProcessorRegistry {
public static let unimplemented = GroupChatProcessorRegistry(
register: XCTestDynamicOverlay.unimplemented(
"\(Self.self).register",
placeholder: Cancellable {}
),
registered: XCTestDynamicOverlay.unimplemented(
"\(Self.self).registered",
placeholder: .unimplemented
)
)
}
...@@ -63,3 +63,28 @@ extension Group { ...@@ -63,3 +63,28 @@ extension Group {
return group return group
} }
} }
extension GroupChatMessage {
static func stub() -> GroupChatMessage {
GroupChatMessage(
groupId: "\(Int.random(in: 100...999))".data(using: .utf8)!,
senderId: "\(Int.random(in: 100...999))".data(using: .utf8)!,
messageId: "\(Int.random(in: 100...999))".data(using: .utf8)!,
payload: "\(Int.random(in: 100...999))".data(using: .utf8)!,
timestamp: Int64.random(in: 100...999)
)
}
}
extension GroupChatProcessor.Callback {
static func stub() -> GroupChatProcessor.Callback {
GroupChatProcessor.Callback(
decryptedMessage: .stub(),
msg: "\(Int.random(in: 100...999))".data(using: .utf8)!,
receptionId: "\(Int.random(in: 100...999))".data(using: .utf8)!,
ephemeralId: Int64.random(in: 100...999),
roundId: Int64.random(in: 100...999),
roundUrl: "\(Int.random(in: 100...999))"
)
}
}
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient
final class GroupChatProcessorRegistryTests: XCTestCase {
func testRegistry() {
var firstProcessorDidHandle: [GroupChatProcessor.Result] = []
var secondProcessorDidHandle: [GroupChatProcessor.Result] = []
let firstProcessor = GroupChatProcessor(
name: "first",
handle: { firstProcessorDidHandle.append($0) }
)
let secondProcessor = GroupChatProcessor(
name: "second",
handle: { secondProcessorDidHandle.append($0) }
)
let registry: GroupChatProcessorRegistry = .live()
let registeredProcessors = registry.registered()
let firstProcessorCancellable = registry.register(firstProcessor)
let secondProcessorCancellable = registry.register(secondProcessor)
let firstResult = GroupChatProcessor.Result.success(.stub())
registeredProcessors.handle(firstResult)
XCTAssertNoDifference(firstProcessorDidHandle, [firstResult])
XCTAssertNoDifference(secondProcessorDidHandle, [firstResult])
firstProcessorDidHandle = []
secondProcessorDidHandle = []
firstProcessorCancellable.cancel()
let secondResult = GroupChatProcessor.Result.success(.stub())
registeredProcessors.handle(secondResult)
XCTAssertNoDifference(firstProcessorDidHandle, [])
XCTAssertNoDifference(secondProcessorDidHandle, [secondResult])
firstProcessorDidHandle = []
secondProcessorDidHandle = []
secondProcessorCancellable.cancel()
let thirdResult = GroupChatProcessor.Result.success(.stub())
registeredProcessors.handle(thirdResult)
XCTAssertNoDifference(firstProcessorDidHandle, [])
XCTAssertNoDifference(secondProcessorDidHandle, [])
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment