diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift index efca553a512e4ab3745eb292fd54e59232fe03f4..d4bc0fa90b6e4bfe72e1cd292ca3990875a35d0d 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift @@ -25,6 +25,7 @@ extension MessengerConnect { identity: try cMix.makeReceptionIdentity(legacy: true), e2eParamsJSON: env.getE2EParams() )) + env.isListeningForMessages.set(false) } } } diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift index 65a718dffa7c33c246de7a8b371c749433f2898b..7d6932badafbae5128694b414df70a32c405fd02 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift @@ -22,6 +22,7 @@ extension MessengerDestroy { env.ud.set(nil) env.e2e.set(nil) env.cMix.set(nil) + env.isListeningForMessages.set(false) try env.fileManager.removeDirectory(env.storageDir) try env.passwordStorage.remove() } diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift new file mode 100644 index 0000000000000000000000000000000000000000..a5cbd390456dc8063345655e007daca8bb4693fc --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift @@ -0,0 +1,21 @@ +import XCTestDynamicOverlay + +public struct MessengerIsListeningForMessages { + public var run: () -> Bool + + public func callAsFunction() -> Bool { + run() + } +} + +extension MessengerIsListeningForMessages { + public static func live(_ env: MessengerEnvironment) -> MessengerIsListeningForMessages { + MessengerIsListeningForMessages(run: env.isListeningForMessages.get) + } +} + +extension MessengerIsListeningForMessages { + public static let unimplemented = MessengerIsListeningForMessages( + run: XCTUnimplemented("\(Self.self)", placeholder: false) + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift index 90fa02dab3cf84d85e50e3d696fe0a5a226d4884..62b9a600a58eb7c279a518aff0b23d7110aaaaf5 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift @@ -16,14 +16,20 @@ public struct MessengerListenForMessages { extension MessengerListenForMessages { public static func live(_ env: MessengerEnvironment) -> MessengerListenForMessages { MessengerListenForMessages { - guard let e2e = env.e2e() else { - throw Error.notConnected + do { + guard let e2e = env.e2e() else { + throw Error.notConnected + } + try e2e.registerListener( + senderId: nil, + messageType: 2, + callback: env.messageListeners.registered() + ) + env.isListeningForMessages.set(true) + } catch { + env.isListeningForMessages.set(false) + throw error } - try e2e.registerListener( - senderId: nil, - messageType: 2, - callback: env.messageListeners.registered() - ) } } } diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift index 8b05e7d44dba67916bc2d0f5e0d99d005dc41e5b..9f0d591b44e0820c6f2f6af6611055c72f74be06 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift @@ -73,6 +73,7 @@ extension MessengerRestoreBackup { env.cMix.set(cMix) env.e2e.set(e2e) env.ud.set(ud) + env.isListeningForMessages.set(false) return Result( restoredParams: params, restoredContacts: report.restoredContacts diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index ad3fff797d257b6d7014b67792f90b87a74f51c8..ea85852c6752e30af60987264851d57af910e811 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -14,6 +14,7 @@ public struct Messenger { public var start: MessengerStart public var isConnected: MessengerIsConnected public var connect: MessengerConnect + public var isListeningForMessages: MessengerIsListeningForMessages public var listenForMessages: MessengerListenForMessages public var isRegistered: MessengerIsRegistered public var register: MessengerRegister @@ -46,6 +47,7 @@ extension Messenger { start: .live(env), isConnected: .live(env), connect: .live(env), + isListeningForMessages: .live(env), listenForMessages: .live(env), isRegistered: .live(env), register: .live(env), @@ -79,6 +81,7 @@ extension Messenger { start: .unimplemented, isConnected: .unimplemented, connect: .unimplemented, + isListeningForMessages: .unimplemented, listenForMessages: .unimplemented, isRegistered: .unimplemented, register: .unimplemented, diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift index 00ab6338b1731987b1f27b8c2c17da3bef8ed695..641a8062d3f9ae136192af38b2814fe14cafccb9 100644 --- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift +++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift @@ -12,6 +12,7 @@ public struct MessengerEnvironment { public var getCMixParams: GetCMixParams public var getE2EParams: GetE2EParams public var getSingleUseParams: GetSingleUseParams + public var isListeningForMessages: Stored<Bool> public var isRegisteredWithUD: IsRegisteredWithUD public var loadCMix: LoadCMix public var login: Login @@ -52,6 +53,7 @@ extension MessengerEnvironment { getCMixParams: .liveDefault, getE2EParams: .liveDefault, getSingleUseParams: .liveDefault, + isListeningForMessages: .inMemory(false), isRegisteredWithUD: .live, loadCMix: .live, login: .live, @@ -87,6 +89,7 @@ extension MessengerEnvironment { getCMixParams: .unimplemented, getE2EParams: .unimplemented, getSingleUseParams: .unimplemented, + isListeningForMessages: .unimplemented(placeholder: false), isRegisteredWithUD: .unimplemented, loadCMix: .unimplemented, login: .unimplemented, diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift index 1f69797f10465a6c4d4ddd027d368cdc7dc69c7a..e17d6028ed3fd2eb59577f2b94df31338a60b1af 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift @@ -17,12 +17,14 @@ final class MessengerConnectTests: XCTestCase { var didLogInWithAuthCallbacks: [AuthCallbacks?] = [] var didSetE2E: [E2E?] = [] var didHandleAuthCallbacks: [AuthCallbacks.Callback] = [] + var didSetIsListeningForMessages: [Bool] = [] let cMixId = 1234 let receptionId = ReceptionIdentity.stub let e2eParams = "e2e-params".data(using: .utf8)! var env: MessengerEnvironment = .unimplemented + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } env.cMix.get = { var cMix: CMix = .unimplemented cMix.getId.run = { cMixId } @@ -62,6 +64,7 @@ final class MessengerConnectTests: XCTestCase { e2eParamsJSON: e2eParams ) ]) + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) XCTAssertEqual(didLogInWithAuthCallbacks.compactMap { $0 }.count, 1) XCTAssertEqual(didSetE2E.compactMap { $0 }.count, 1) diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift index 36745d028934142b59912d341649e1519b435e1e..ccf999e77e6771724d17e27b6b43ce6a811fb8ae 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift @@ -14,6 +14,7 @@ final class MessengerDestroyTests: XCTestCase { var didSetE2E: [E2E?] = [] var didSetCMix: [CMix?] = [] var didRemovePassword = 0 + var didSetIsListeningForMessages: [Bool] = [] var env: MessengerEnvironment = .unimplemented env.cMix.get = { @@ -28,6 +29,7 @@ final class MessengerDestroyTests: XCTestCase { env.ud.set = { didSetUD.append($0) } env.e2e.set = { didSetE2E.append($0) } env.cMix.set = { didSetCMix.append($0) } + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } env.fileManager.removeDirectory = { didRemoveDirectory.append($0) } env.passwordStorage.remove = { didRemovePassword += 1 } let destroy: MessengerDestroy = .live(env) @@ -39,6 +41,7 @@ final class MessengerDestroyTests: XCTestCase { XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) XCTAssertNoDifference(didRemoveDirectory, [storageDir]) XCTAssertNoDifference(didRemovePassword, 1) } @@ -67,12 +70,14 @@ final class MessengerDestroyTests: XCTestCase { var didSetUD: [UserDiscovery?] = [] var didSetE2E: [E2E?] = [] var didSetCMix: [CMix?] = [] + var didSetIsListeningForMessages: [Bool] = [] var env: MessengerEnvironment = .unimplemented env.cMix.get = { nil } env.ud.set = { didSetUD.append($0) } env.e2e.set = { didSetE2E.append($0) } env.cMix.set = { didSetCMix.append($0) } + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } env.fileManager.removeDirectory = { _ in throw error } let destroy: MessengerDestroy = .live(env) @@ -82,6 +87,7 @@ final class MessengerDestroyTests: XCTestCase { XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) } func testRemovePasswordFailure() { @@ -92,12 +98,14 @@ final class MessengerDestroyTests: XCTestCase { var didSetUD: [UserDiscovery?] = [] var didSetE2E: [E2E?] = [] var didSetCMix: [CMix?] = [] + var didSetIsListeningForMessages: [Bool] = [] var env: MessengerEnvironment = .unimplemented env.cMix.get = { nil } env.ud.set = { didSetUD.append($0) } env.e2e.set = { didSetE2E.append($0) } env.cMix.set = { didSetCMix.append($0) } + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } env.storageDir = storageDir env.fileManager.removeDirectory = { didRemoveDirectory.append($0) } env.passwordStorage.remove = { throw error } @@ -109,6 +117,7 @@ final class MessengerDestroyTests: XCTestCase { XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) XCTAssertNoDifference(didRemoveDirectory, [storageDir]) } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..bda5200bd315d498f9af8085aeb0571bfedfb290 --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift @@ -0,0 +1,20 @@ +import XCTest +@testable import XXMessengerClient + +final class MessengerIsListeningForMessagesTests: XCTestCase { + func testListening() { + var env: MessengerEnvironment = .unimplemented + env.isListeningForMessages.get = { true } + let isListening: MessengerIsListeningForMessages = .live(env) + + XCTAssertTrue(isListening()) + } + + func testNotListening() { + var env: MessengerEnvironment = .unimplemented + env.isListeningForMessages.get = { false } + let isListening: MessengerIsListeningForMessages = .live(env) + + XCTAssertFalse(isListening()) + } +} diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift index 948ee33e3d668fdb0eff4a4cfad72f82b908c395..1f78a60a959ffb64d1bfbff41e59cb624ab36eb3 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift @@ -12,6 +12,7 @@ final class MessengerListenForMessagesTests: XCTestCase { var didRegisterListenerWithParams: [RegisterListenerParams] = [] var didRegisterListenerWithCallback: [Listener] = [] var didHandleMessage: [Message] = [] + var didSetIsListeningForMessages: [Bool] = [] var env: MessengerEnvironment = .unimplemented env.e2e.get = { @@ -25,6 +26,9 @@ final class MessengerListenForMessagesTests: XCTestCase { env.messageListeners.registered = { Listener { message in didHandleMessage.append(message) } } + env.isListeningForMessages.set = { + didSetIsListeningForMessages.append($0) + } let listen: MessengerListenForMessages = .live(env) try listen() @@ -32,6 +36,7 @@ final class MessengerListenForMessagesTests: XCTestCase { XCTAssertNoDifference(didRegisterListenerWithParams, [ .init(senderId: nil, messageType: 2) ]) + XCTAssertNoDifference(didSetIsListeningForMessages, [true]) let message = Message.stub(123) didRegisterListenerWithCallback.first?.handle(message) @@ -40,19 +45,26 @@ final class MessengerListenForMessagesTests: XCTestCase { } func testListenWhenNotLoggedIn() { + var didSetIsListeningForMessages: [Bool] = [] + var env: MessengerEnvironment = .unimplemented env.e2e.get = { nil } + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } let listen: MessengerListenForMessages = .live(env) XCTAssertThrowsError(try listen()) { error in XCTAssertNoDifference(error as? MessengerListenForMessages.Error, .notConnected) } + + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) } func testListenFailure() { struct Failure: Error, Equatable {} let error = Failure() + var didSetIsListeningForMessages: [Bool] = [] + var env: MessengerEnvironment = .unimplemented env.e2e.get = { var e2e: E2E = .unimplemented @@ -60,10 +72,13 @@ final class MessengerListenForMessagesTests: XCTestCase { return e2e } env.messageListeners.registered = { Listener.unimplemented } + env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) } let listen: MessengerListenForMessages = .live(env) XCTAssertThrowsError(try listen()) { err in XCTAssertNoDifference(err as? Failure, error) } + + XCTAssertNoDifference(didSetIsListeningForMessages, [false]) } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift index 21194303b1ee245150ff1764bfc8968f38569855..fb8fe7da315df608763b572a273ec67ef2c8366c 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift @@ -100,6 +100,9 @@ final class MessengerRestoreBackupTests: XCTestCase { env.cMix.set = { _ in caughtActions.append(.didSetCMix) } env.e2e.set = { _ in caughtActions.append(.didSetE2E) } env.ud.set = { _ in caughtActions.append(.didSetUD) } + env.isListeningForMessages.set = { + caughtActions.append(.didSetIsListeningForMessages(isListening: $0)) + } let restore: MessengerRestoreBackup = .live(env) @@ -157,6 +160,9 @@ final class MessengerRestoreBackupTests: XCTestCase { .didSetCMix, .didSetE2E, .didSetUD, + .didSetIsListeningForMessages( + isListening: false + ), ]) XCTAssertNoDifference(result, MessengerRestoreBackup.Result( @@ -228,4 +234,7 @@ private enum CaughtAction: Equatable { case didSetCMix case didSetE2E case didSetUD + case didSetIsListeningForMessages( + isListening: Bool + ) }