From e378d3add5eaf42c48dc7933938d0dde742c81aa Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Sun, 16 Oct 2022 23:09:28 +0200
Subject: [PATCH] Add MessengerStartFileTransfer function

---
 .../MessengerStartFileTransfer.swift          | 41 ++++++++++++
 .../Messenger/Messenger.swift                 |  3 +
 .../MessengerStartFileTransferTests.swift     | 63 +++++++++++++++++++
 3 files changed, 107 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift
new file mode 100644
index 00000000..4a8e460d
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift
@@ -0,0 +1,41 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerStartFileTransfer {
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+  }
+
+  public var run: () throws -> Void
+
+  public func callAsFunction() throws -> Void {
+    try run()
+  }
+}
+
+extension MessengerStartFileTransfer {
+  public static func live(_ env: MessengerEnvironment) -> MessengerStartFileTransfer {
+    MessengerStartFileTransfer {
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      let fileTransfer = try env.initFileTransfer(
+        params: InitFileTransfer.Params(
+          e2eId: e2e.getId(),
+          e2eFileTransferParamsJSON: env.getE2EFileTransferParams(),
+          fileTransferParamsJSON: env.getFileTransferParams()
+        ),
+        callback: ReceiveFileCallback { result in
+          // TODO:
+        }
+      )
+      env.fileTransfer.set(fileTransfer)
+    }
+  }
+}
+
+extension MessengerStartFileTransfer {
+  public static let unimplemented = MessengerStartFileTransfer(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 0dce7ff2..793daab0 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -40,6 +40,7 @@ public struct Messenger {
   public var stopBackup: MessengerStopBackup
   public var setLogLevel: MessengerSetLogLevel
   public var startLogging: MessengerStartLogging
+  public var startFileTransfer: MessengerStartFileTransfer
   public var sendFile: MessengerSendFile
   public var receiveFile: MessengerReceiveFile
 }
@@ -86,6 +87,7 @@ extension Messenger {
       stopBackup: .live(env),
       setLogLevel: .live(env),
       startLogging: .live(env),
+      startFileTransfer: .live(env),
       sendFile: .live(env),
       receiveFile: .live(env)
     )
@@ -133,6 +135,7 @@ extension Messenger {
     stopBackup: .unimplemented,
     setLogLevel: .unimplemented,
     startLogging: .unimplemented,
+    startFileTransfer: .unimplemented,
     sendFile: .unimplemented,
     receiveFile: .unimplemented
   )
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift
new file mode 100644
index 00000000..56195f23
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift
@@ -0,0 +1,63 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerStartFileTransferTests: XCTestCase {
+  func testStart() throws {
+    let e2eId = 123
+    let e2eFileTransferParams = "e2eFileTransferParams".data(using: .utf8)!
+    let fileTransferParams = "fileTransferParams".data(using: .utf8)!
+
+    var didInitFileTransfer: [InitFileTransfer.Params] = []
+    var receiveFileCallback: ReceiveFileCallback?
+    var didSetFileTransfer: [FileTransfer?] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = {
+      var e2e: E2E = .unimplemented
+      e2e.getId.run = { e2eId }
+      return e2e
+    }
+    env.getE2EFileTransferParams.run = {
+      e2eFileTransferParams
+    }
+    env.getFileTransferParams.run = {
+      fileTransferParams
+    }
+    env.initFileTransfer.run = { params, callback in
+      didInitFileTransfer.append(params)
+      receiveFileCallback = callback
+      var fileTransfer: FileTransfer = .unimplemented
+      return fileTransfer
+    }
+    env.fileTransfer.set = {
+      didSetFileTransfer.append($0)
+    }
+
+    let start: MessengerStartFileTransfer = .live(env)
+
+    try start()
+
+    XCTAssertNoDifference(didInitFileTransfer, [.init(
+      e2eId: e2eId,
+      e2eFileTransferParamsJSON: e2eFileTransferParams,
+      fileTransferParamsJSON: fileTransferParams
+    )])
+    XCTAssertNotNil(receiveFileCallback)
+    XCTAssertNoDifference(didSetFileTransfer.map { $0 != nil }, [true])
+  }
+
+  func testStartWhenNotConnected() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let start: MessengerStartFileTransfer = .live(env)
+
+    XCTAssertThrowsError(try start()) { error in
+      XCTAssertNoDifference(
+        error as NSError,
+        MessengerStartFileTransfer.Error.notConnected as NSError
+      )
+    }
+  }
+}
-- 
GitLab