From 1a39609ed0e0d2aa6b5bfeb8b49dba68fc1681bc Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 1 Nov 2022 22:11:47 +0100
Subject: [PATCH] Update MessengerReceiveFile and MessengerSendFile

---
 .../Functions/MessengerReceiveFile.swift      | 34 ++++----
 .../Functions/MessengerSendFile.swift         | 36 ++++----
 .../Functions/MessengerReceiveFileTests.swift | 85 ++++++++++---------
 .../Functions/MessengerSendFileTests.swift    | 61 ++++++++-----
 4 files changed, 116 insertions(+), 100 deletions(-)

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift
index 399de8c0..9c3bda14 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift
@@ -18,8 +18,8 @@ public struct MessengerReceiveFile {
 
   public enum CallbackInfo: Equatable {
     public enum Failure: Equatable {
-      case callbackError(NSError)
-      case receiveError(NSError)
+      case callback(NSError)
+      case receive(NSError)
     }
 
     case progress(transmitted: Int, total: Int)
@@ -53,24 +53,22 @@ extension MessengerReceiveFile {
         transferId: params.transferId,
         period: params.callbackIntervalMS,
         callback: FileTransferProgressCallback { result in
-          switch result {
-          case .success(let info):
-            if info.progress.completed {
-              do {
-                callback(.finished(try fileTransfer.receive(transferId: params.transferId)))
-              } catch {
-                callback(.failed(.receiveError(error as NSError)))
-              }
-            } else {
-              callback(.progress(
-                transmitted: info.progress.transmitted,
-                total: info.progress.total
-              ))
+          if let error = result.error {
+            callback(.failed(.callback(error as NSError)))
+            return
+          }
+          if result.progress.completed {
+            do {
+              callback(.finished(try fileTransfer.receive(transferId: params.transferId)))
+            } catch {
+              callback(.failed(.receive(error as NSError)))
             }
-
-          case .failure(let error):
-            callback(.failed(.callbackError(error)))
+            return
           }
+          callback(.progress(
+            transmitted: result.progress.transmitted,
+            total: result.progress.total
+          ))
         }
       )
     }
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
index 8a0b1776..35158ecb 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
@@ -24,7 +24,7 @@ public struct MessengerSendFile {
 
   public enum CallbackInfo: Equatable {
     public enum Failure: Equatable {
-      case error(NSError)
+      case callback(NSError)
       case close(NSError)
     }
 
@@ -62,8 +62,7 @@ extension MessengerSendFile {
           callback(.failed(id: id, .close(error as NSError)))
         }
       }
-      var transferId: Data!
-      transferId = try fileTransfer.send(
+      let transferId = try fileTransfer.send(
         params: FileTransferSend.Params(
           payload: params.file,
           recipientId: params.recipientId,
@@ -71,26 +70,21 @@ extension MessengerSendFile {
           period: params.callbackIntervalMS
         ),
         callback: FileTransferProgressCallback { result in
-          guard let transferId else {
-            fatalError("Bindings issue: file transfer progress callback was called before send function returned transfer id.")
+          if let error = result.error {
+            callback(.failed(id: result.progress.transferId, .callback(error as NSError)))
+            close(id: result.progress.transferId)
+            return
           }
-          switch result {
-          case .failure(let error):
-            callback(.failed(id: transferId, .error(error)))
-            close(id: transferId)
-
-          case .success(let cb):
-            if cb.progress.completed {
-              callback(.finished(id: transferId))
-              close(id: transferId)
-            } else {
-              callback(.progress(
-                id: transferId,
-                transmitted: cb.progress.transmitted,
-                total: cb.progress.total
-              ))
-            }
+          if result.progress.completed {
+            callback(.finished(id: result.progress.transferId))
+            close(id: result.progress.transferId)
+            return
           }
+          callback(.progress(
+            id: result.progress.transferId,
+            transmitted: result.progress.transmitted,
+            total: result.progress.total
+          ))
         }
       )
       return transferId
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift
index b2fcefd8..39d641fb 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift
@@ -43,15 +43,15 @@ final class MessengerReceiveFileTests: XCTestCase {
     XCTAssertNoDifference(didReceiveCallback, [])
 
     didReceiveCallback = []
-    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success(
-      FileTransferProgressCallback.Callback(
-        progress: Progress(
-          completed: false,
-          transmitted: 1,
-          total: 3
-        ),
-        partTracker: .unimplemented
-      )
+    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.init(
+      progress: .init(
+        transferId: params.transferId,
+        completed: false,
+        transmitted: 1,
+        total: 3
+      ),
+      partTracker: .unimplemented,
+      error: nil
     ))
 
     XCTAssertNoDifference(didReceiveCallback, [
@@ -59,15 +59,15 @@ final class MessengerReceiveFileTests: XCTestCase {
     ])
 
     didReceiveCallback = []
-    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success(
-      FileTransferProgressCallback.Callback(
-        progress: Progress(
-          completed: false,
-          transmitted: 2,
-          total: 3
-        ),
-        partTracker: .unimplemented
-      )
+    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.init(
+      progress: .init(
+        transferId: params.transferId,
+        completed: false,
+        transmitted: 2,
+        total: 3
+      ),
+      partTracker: .unimplemented,
+      error: nil
     ))
 
     XCTAssertNoDifference(didReceiveCallback, [
@@ -75,15 +75,15 @@ final class MessengerReceiveFileTests: XCTestCase {
     ])
 
     didReceiveCallback = []
-    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success(
-      FileTransferProgressCallback.Callback(
-        progress: Progress(
-          completed: true,
-          transmitted: 3,
-          total: 3
-        ),
-        partTracker: .unimplemented
-      )
+    didRegisterReceivedProgressCallbackWithCallback.first?.handle(.init(
+      progress: Progress(
+        transferId: params.transferId,
+        completed: true,
+        transmitted: 3,
+        total: 3
+      ),
+      partTracker: .unimplemented,
+      error: nil
     ))
 
     XCTAssertNoDifference(didReceiveTransferId, [
@@ -127,14 +127,19 @@ final class MessengerReceiveFileTests: XCTestCase {
       didReceiveCallback.append(info)
     }
 
-    receivedProgressCallback?.handle(.failure(error))
+    receivedProgressCallback?.handle(.init(
+      progress: Progress(transferId: Data(), completed: false, transmitted: 0, total: 0),
+      partTracker: .unimplemented,
+      error: error
+    ))
 
     XCTAssertNoDifference(didReceiveCallback, [
-      .failed(.callbackError(error))
+      .failed(.callback(error))
     ])
   }
 
   func testReceiveFileReceiveError() throws {
+    let params: MessengerReceiveFile.Params = .stub
     let error = NSError(domain: "test", code: 123)
 
     var receivedProgressCallback: FileTransferProgressCallback?
@@ -153,23 +158,23 @@ final class MessengerReceiveFileTests: XCTestCase {
     }
     let receiveFile: MessengerReceiveFile = .live(env)
 
-    try receiveFile(.stub) { info in
+    try receiveFile(params) { info in
       didReceiveCallback.append(info)
     }
 
-    receivedProgressCallback?.handle(.success(
-      FileTransferProgressCallback.Callback(
-        progress: Progress(
-          completed: true,
-          transmitted: 3,
-          total: 3
-        ),
-        partTracker: .unimplemented
-      )
+    receivedProgressCallback?.handle(.init(
+      progress: Progress(
+        transferId: params.transferId,
+        completed: true,
+        transmitted: 3,
+        total: 3
+      ),
+      partTracker: .unimplemented,
+      error: nil
     ))
 
     XCTAssertNoDifference(didReceiveCallback, [
-      .failed(.receiveError(error))
+      .failed(.receive(error))
     ])
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift
index 54823eb8..2a0b74dc 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift
@@ -43,30 +43,36 @@ final class MessengerSendFileTests: XCTestCase {
       )
     ])
 
-    fileTransferProgressCallback.handle(.success(.init(
+    fileTransferProgressCallback.handle(.init(
       progress: Progress(
+        transferId: newTransferId,
         completed: false,
         transmitted: 1,
         total: 10
       ),
-      partTracker: .unimplemented
-    )))
-    fileTransferProgressCallback.handle(.success(.init(
+      partTracker: .unimplemented,
+      error: nil
+    ))
+    fileTransferProgressCallback.handle(.init(
       progress: Progress(
+        transferId: newTransferId,
         completed: false,
         transmitted: 6,
         total: 10
       ),
-      partTracker: .unimplemented
-    )))
-    fileTransferProgressCallback.handle(.success(.init(
+      partTracker: .unimplemented,
+      error: nil
+    ))
+    fileTransferProgressCallback.handle(.init(
       progress: Progress(
+        transferId: newTransferId,
         completed: true,
         transmitted: 10,
         total: 10
       ),
-      partTracker: .unimplemented
-    )))
+      partTracker: .unimplemented,
+      error: nil
+    ))
 
     XCTAssertNoDifference(didReceiveCallback, [
       .progress(id: transferId, transmitted: 1, total: 10),
@@ -90,6 +96,9 @@ final class MessengerSendFileTests: XCTestCase {
   }
 
   func testSendFileCallbackFailure() throws {
+    let newTransferId = "transferId".data(using: .utf8)!
+    let error = NSError(domain: "test", code: 1234)
+
     var didCloseSend: [Data] = []
     var didReceiveCallback: [MessengerSendFile.CallbackInfo] = []
     var fileTransferProgressCallback: FileTransferProgressCallback!
@@ -99,7 +108,7 @@ final class MessengerSendFileTests: XCTestCase {
       var fileTransfer: FileTransfer = .unimplemented
       fileTransfer.send.run = { _, callback in
         fileTransferProgressCallback = callback
-        return "transferId".data(using: .utf8)!
+        return newTransferId
       }
       fileTransfer.closeSend.run = { id in
         didCloseSend.append(id)
@@ -111,18 +120,26 @@ final class MessengerSendFileTests: XCTestCase {
     let transferId = try sendFile(.stub) { info in
       didReceiveCallback.append(info)
     }
-
-    let error = NSError(domain: "test", code: 1234)
-    fileTransferProgressCallback.handle(.failure(error))
+    fileTransferProgressCallback.handle(.init(
+      progress: .init(
+        transferId: newTransferId,
+        completed: false,
+        transmitted: 0,
+        total: 0
+      ),
+      partTracker: .unimplemented,
+      error: error
+    ))
 
     XCTAssertNoDifference(didReceiveCallback, [
-      .failed(id: transferId, .error(error)),
+      .failed(id: newTransferId, .callback(error)),
     ])
-    XCTAssertNoDifference(didCloseSend, [transferId])
+    XCTAssertNoDifference(didCloseSend, [newTransferId])
   }
 
   func testSendFileCloseError() throws {
     let closeError = NSError(domain: "test", code: 1234)
+    let newTransferId = "transferId".data(using: .utf8)!
 
     var didReceiveCallback: [MessengerSendFile.CallbackInfo] = []
     var fileTransferProgressCallback: FileTransferProgressCallback!
@@ -132,7 +149,7 @@ final class MessengerSendFileTests: XCTestCase {
       var fileTransfer: FileTransfer = .unimplemented
       fileTransfer.send.run = { _, callback in
         fileTransferProgressCallback = callback
-        return "transferId".data(using: .utf8)!
+        return newTransferId
       }
       fileTransfer.closeSend.run = { id in
         throw closeError
@@ -145,18 +162,20 @@ final class MessengerSendFileTests: XCTestCase {
       didReceiveCallback.append(info)
     }
 
-    fileTransferProgressCallback.handle(.success(.init(
+    fileTransferProgressCallback.handle(.init(
       progress: .init(
+        transferId: newTransferId,
         completed: true,
         transmitted: 1,
         total: 1
       ),
-      partTracker: .unimplemented
-    )))
+      partTracker: .unimplemented,
+      error: nil
+    ))
 
     XCTAssertNoDifference(didReceiveCallback, [
-      .finished(id: transferId),
-      .failed(id: transferId, .close(closeError)),
+      .finished(id: newTransferId),
+      .failed(id: newTransferId, .close(closeError)),
     ])
   }
 }
-- 
GitLab