diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift new file mode 100644 index 0000000000000000000000000000000000000000..df8fea1885d56a9c8df0757d1886064d607447e9 --- /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 5526c59c243900c600a4686b1edc10214a5fe213..959aff7ffec86419698f34b9512c5939a31be1ad 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 0000000000000000000000000000000000000000..9e4892269f0ca9cb7819723548c35222c13d1699 --- /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 + ) + } + } +}