diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStopBackup.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStopBackup.swift new file mode 100644 index 0000000000000000000000000000000000000000..f5471166652f0d03488f70c74bf3a21aed8df6f8 --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStopBackup.swift @@ -0,0 +1,26 @@ +import Bindings +import XCTestDynamicOverlay + +public struct MessengerStopBackup { + public var run: () throws -> Void + + public func callAsFunction() throws { + try run() + } +} + +extension MessengerStopBackup { + public static func live(_ env: MessengerEnvironment) -> MessengerStopBackup { + MessengerStopBackup { + guard let backup = env.backup() else { return } + try backup.stop() + env.backup.set(nil) + } + } +} + +extension MessengerStopBackup { + public static let unimplemented = MessengerStopBackup( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 9e373e0b4bd95df7ec212ab957799dfbb945589a..bc1c8bde822c34c6b9142aca85b066e3cd329060 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -31,6 +31,7 @@ public struct Messenger { public var sendMessage: MessengerSendMessage public var registerBackupCallback: MessengerRegisterBackupCallback public var isBackupRunning: MessengerIsBackupRunning + public var stopBackup: MessengerStopBackup } extension Messenger { @@ -65,7 +66,8 @@ extension Messenger { verifyContact: .live(env), sendMessage: .live(env), registerBackupCallback: .live(env), - isBackupRunning: .live(env) + isBackupRunning: .live(env), + stopBackup: .live(env) ) } } @@ -101,6 +103,7 @@ extension Messenger { verifyContact: .unimplemented, sendMessage: .unimplemented, registerBackupCallback: .unimplemented, - isBackupRunning: .unimplemented + isBackupRunning: .unimplemented, + stopBackup: .unimplemented ) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStopBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStopBackupTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..306b6c2d1d6b6507cd0bd83071d54ad99fd2e8f7 --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStopBackupTests.swift @@ -0,0 +1,53 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerStopBackupTests: XCTestCase { + func testStop() throws { + var didStopBackup = 0 + var didSetBackup: [Backup?] = [] + + var env: MessengerEnvironment = .unimplemented + env.backup.get = { + var backup: Backup = .unimplemented + backup.stop.run = { didStopBackup += 1 } + return backup + } + env.backup.set = { backup in + didSetBackup.append(backup) + } + let stop: MessengerStopBackup = .live(env) + + try stop() + + XCTAssertEqual(didStopBackup, 1) + XCTAssertEqual(didSetBackup.count, 1) + XCTAssertNil(didSetBackup.first as? Backup) + } + + func testStopFailure() { + struct Failure: Error, Equatable {} + let failure = Failure() + + var env: MessengerEnvironment = .unimplemented + env.backup.get = { + var backup: Backup = .unimplemented + backup.stop.run = { throw failure } + return backup + } + let stop: MessengerStopBackup = .live(env) + + XCTAssertThrowsError(try stop()) { error in + XCTAssertNoDifference(error as NSError, failure as NSError) + } + } + + func testStopWithoutBackup() throws { + var env: MessengerEnvironment = .unimplemented + env.backup.get = { nil } + let stop: MessengerStopBackup = .live(env) + + try stop() + } +}