diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift new file mode 100644 index 0000000000000000000000000000000000000000..4ae282b80df87e730b01ea6464aa89e19f34042d --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift @@ -0,0 +1,36 @@ +import XXClient +import XCTestDynamicOverlay + +public struct MessengerStartGroupChat { + public enum Error: Swift.Error, Equatable { + case notConnected + } + + public var run: () throws -> Void + + public func callAsFunction() throws { + try run() + } +} + +extension MessengerStartGroupChat { + public static func live(_ env: MessengerEnvironment) -> MessengerStartGroupChat { + MessengerStartGroupChat { + guard let e2e = env.e2e.get() else { + throw Error.notConnected + } + let groupChat = try env.newGroupChat( + e2eId: e2e.getId(), + groupRequest: env.groupRequests.registered(), + groupChatProcessor: env.groupChatProcessors.registered() + ) + env.groupChat.set(groupChat) + } + } +} + +extension MessengerStartGroupChat { + public static let unimplemented = MessengerStartGroupChat( + run: XCTestDynamicOverlay.unimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 9261d26467400a3f34fc9852c08dd5df1baf0b5d..c1f7f6862d04d9c13b16577ccd010f312d21761b 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -48,6 +48,7 @@ public struct Messenger { public var receiveFile: MessengerReceiveFile public var trackServices: MessengerTrackServices public var getNotificationReports: MessengerGetNotificationReports + public var startGroupChat: MessengerStartGroupChat } extension Messenger { @@ -99,7 +100,8 @@ extension Messenger { sendFile: .live(env), receiveFile: .live(env), trackServices: .live(env), - getNotificationReports: .live(env) + getNotificationReports: .live(env), + startGroupChat: .live(env) ) } } @@ -152,6 +154,7 @@ extension Messenger { sendFile: .unimplemented, receiveFile: .unimplemented, trackServices: .unimplemented, - getNotificationReports: .unimplemented + getNotificationReports: .unimplemented, + startGroupChat: .unimplemented ) } diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift index 4e83f83b270368c65628cf42d18fcd2c53d32a66..dc146e2f89461ac29cc726d44af0753d7f95d1e6 100644 --- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift +++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift @@ -18,6 +18,7 @@ public struct MessengerEnvironment { public var getFileTransferParams: GetFileTransferParams public var getNotificationsReport: GetNotificationsReport public var getSingleUseParams: GetSingleUseParams + public var groupChat: Stored<GroupChat?> public var groupChatProcessors: GroupChatProcessorRegistry public var groupRequests: GroupRequestCallbacksRegistry public var initFileTransfer: InitFileTransfer @@ -33,6 +34,7 @@ public struct MessengerEnvironment { public var ndfEnvironment: NDFEnvironment public var newCMix: NewCMix public var newCMixFromBackup: NewCMixFromBackup + public var newGroupChat: NewGroupChat public var newOrLoadUd: NewOrLoadUd public var newUdManagerFromBackup: NewUdManagerFromBackup public var passwordStorage: PasswordStorage @@ -73,6 +75,7 @@ extension MessengerEnvironment { getFileTransferParams: .liveDefault, getNotificationsReport: .live, getSingleUseParams: .liveDefault, + groupChat: .inMemory(), groupChatProcessors: .live(), groupRequests: .live(), initFileTransfer: .live, @@ -88,6 +91,7 @@ extension MessengerEnvironment { ndfEnvironment: .mainnet, newCMix: .live, newCMixFromBackup: .live, + newGroupChat: .live, newOrLoadUd: .live, newUdManagerFromBackup: .live, passwordStorage: .keychain, @@ -123,6 +127,7 @@ extension MessengerEnvironment { getFileTransferParams: .unimplemented, getNotificationsReport: .unimplemented, getSingleUseParams: .unimplemented, + groupChat: .unimplemented(), groupChatProcessors: .unimplemented, groupRequests: .unimplemented, initFileTransfer: .unimplemented, @@ -138,6 +143,7 @@ extension MessengerEnvironment { ndfEnvironment: .unimplemented, newCMix: .unimplemented, newCMixFromBackup: .unimplemented, + newGroupChat: .unimplemented, newOrLoadUd: .unimplemented, newUdManagerFromBackup: .unimplemented, passwordStorage: .unimplemented, diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartGroupChatTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartGroupChatTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..aaf31929afab3119079b3c29fe0fbb286dc9191e --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartGroupChatTests.swift @@ -0,0 +1,44 @@ +import CustomDump +import XXClient +import XCTest +@testable import XXMessengerClient + +final class MessengerStartGroupChatTests: XCTestCase { + func testStart() throws { + var didCreateNewGroupChatWithE2eId: [Int] = [] + var didSetGroupChat: [GroupChat?] = [] + + let e2eId = 123 + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { + var e2e: E2E = .unimplemented + e2e.getId.run = { e2eId } + return e2e + } + env.groupRequests.registered = { .unimplemented } + env.groupChatProcessors.registered = { .unimplemented } + env.newGroupChat.run = { e2eId, _, _ in + didCreateNewGroupChatWithE2eId.append(e2eId) + return .unimplemented + } + env.groupChat.set = { groupChat in + didSetGroupChat.append(groupChat) + } + let start: MessengerStartGroupChat = .live(env) + + try start() + + XCTAssertEqual(didCreateNewGroupChatWithE2eId, [e2eId]) + XCTAssertEqual(didSetGroupChat.map { $0 != nil }, [true]) + } + + func testStartWithoutE2E() throws { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { nil } + let start: MessengerStartGroupChat = .live(env) + + XCTAssertThrowsError(try start()) { error in + XCTAssertEqual(error as? MessengerStartGroupChat.Error, .notConnected) + } + } +}