From 50d75ed3360b8f95599ae7038b110516ba34910a Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 22 Aug 2022 18:42:21 +0100
Subject: [PATCH] Add MessengerWaitForNetwork functor

---
 .../Functors/MessengerWaitForNetwork.swift    | 36 ++++++++++++
 .../Messenger/Messenger.swift                 |  7 ++-
 .../MessengerWaitForNetworkTests.swift        | 55 +++++++++++++++++++
 3 files changed, 96 insertions(+), 2 deletions(-)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
 create mode 100644 Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
new file mode 100644
index 00000000..df8fea18
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
@@ -0,0 +1,36 @@
+import XXClient
+import XCTestDynamicOverlay
+
+public struct MessengerWaitForNetwork {
+  public enum Error: Swift.Error {
+    case notLoaded
+    case timeout
+  }
+
+  public var run: (Int) throws -> Void
+
+  public func callAsFunction(
+    timeoutMS: Int = 30_000
+  ) throws {
+    try run(timeoutMS)
+  }
+}
+
+extension MessengerWaitForNetwork {
+  public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNetwork {
+    MessengerWaitForNetwork { timeoutMS in
+      guard let cMix = env.ctx.getCMix() else {
+        throw Error.notLoaded
+      }
+      guard cMix.waitForNetwork(timeoutMS: timeoutMS) else {
+        throw Error.timeout
+      }
+    }
+  }
+}
+
+extension MessengerWaitForNetwork {
+  public static let unimplemented = MessengerWaitForNetwork(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 5526c59c..959aff7f 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -15,6 +15,7 @@ public struct Messenger {
   public var register: MessengerRegister
   public var isLoggedIn: MessengerIsLoggedIn
   public var logIn: MessengerLogIn
+  public var waitForNetwork: MessengerWaitForNetwork
 }
 
 extension Messenger {
@@ -33,7 +34,8 @@ extension Messenger {
       isRegistered: .live(env),
       register: .live(env),
       isLoggedIn: .live(env),
-      logIn: .live(env)
+      logIn: .live(env),
+      waitForNetwork: .live(env)
     )
   }
 }
@@ -53,6 +55,7 @@ extension Messenger {
     isRegistered: .unimplemented,
     register: .unimplemented,
     isLoggedIn: .unimplemented,
-    logIn: .unimplemented
+    logIn: .unimplemented,
+    waitForNetwork: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
new file mode 100644
index 00000000..9e489226
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
@@ -0,0 +1,55 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerWaitForNetworkTests: XCTestCase {
+  func testWaitSuccess() throws {
+    var didWaitForNetwork: [Int] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = {
+      var cMix: CMix = .unimplemented
+      cMix.waitForNetwork.run = { timeoutMS in
+        didWaitForNetwork.append(timeoutMS)
+        return true
+      }
+      return cMix
+    }
+    let waitForNetwork: MessengerWaitForNetwork = .live(env)
+
+    try waitForNetwork(timeoutMS: 123)
+
+    XCTAssertNoDifference(didWaitForNetwork, [123])
+  }
+
+  func testWaitWhenNotLoaded() {
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = { nil }
+    let waitForNetwork: MessengerWaitForNetwork = .live(env)
+
+    XCTAssertThrowsError(try waitForNetwork()) { error in
+      XCTAssertEqual(
+        error as? MessengerWaitForNetwork.Error,
+        MessengerWaitForNetwork.Error.notLoaded
+      )
+    }
+  }
+
+  func testWaitTimeout() {
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = {
+      var cMix: CMix = .unimplemented
+      cMix.waitForNetwork.run = { _ in false }
+      return cMix
+    }
+    let waitForNetwork: MessengerWaitForNetwork = .live(env)
+
+    XCTAssertThrowsError(try waitForNetwork()) { error in
+      XCTAssertEqual(
+        error as? MessengerWaitForNetwork.Error,
+        MessengerWaitForNetwork.Error.timeout
+      )
+    }
+  }
+}
-- 
GitLab