From 6fcb3a4fcbde172e04c590aed6af8da9b9581c29 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 21 Nov 2022 11:06:42 +0100
Subject: [PATCH] Add MessengerStartGroupChat

---
 .../Functions/MessengerStartGroupChat.swift   | 36 +++++++++++++++
 .../Messenger/Messenger.swift                 |  7 ++-
 .../Messenger/MessengerEnvironment.swift      |  6 +++
 .../MessengerStartGroupChatTests.swift        | 44 +++++++++++++++++++
 4 files changed, 91 insertions(+), 2 deletions(-)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartGroupChatTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartGroupChat.swift
new file mode 100644
index 00000000..4ae282b8
--- /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 9261d264..c1f7f686 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 4e83f83b..dc146e2f 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 00000000..aaf31929
--- /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)
+    }
+  }
+}
-- 
GitLab