diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerDestroy.swift new file mode 100644 index 0000000000000000000000000000000000000000..e584cf1ac3476cd1e6e7b0bdde49a84c0e96e918 --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerDestroy.swift @@ -0,0 +1,26 @@ +import XCTestDynamicOverlay + +public struct MessengerDestroy { + public var run: () throws -> Void + + public func callAsFunction() throws -> Void { + try run() + } +} + +extension MessengerDestroy { + public static func live(_ env: MessengerEnvironment) -> MessengerDestroy { + MessengerDestroy { + try env.fileManager.removeDirectory(env.storageDir) + env.ud.set(nil) + env.e2e.set(nil) + env.cMix.set(nil) + } + } +} + +extension MessengerDestroy { + public static let unimplemented = MessengerDestroy( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index c9563fe8a4db09ab0e7c9e8e1c6dfcfcdb7ab3be..652eda396d5d619e7e98892274c88a7f851ba4a9 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -18,6 +18,7 @@ public struct Messenger { public var logIn: MessengerLogIn public var waitForNetwork: MessengerWaitForNetwork public var waitForNodes: MessengerWaitForNodes + public var destroy: MessengerDestroy } extension Messenger { @@ -39,7 +40,8 @@ extension Messenger { isLoggedIn: .live(env), logIn: .live(env), waitForNetwork: .live(env), - waitForNodes: .live(env) + waitForNodes: .live(env), + destroy: .live(env) ) } } @@ -62,6 +64,7 @@ extension Messenger { isLoggedIn: .unimplemented, logIn: .unimplemented, waitForNetwork: .unimplemented, - waitForNodes: .unimplemented + waitForNodes: .unimplemented, + destroy: .unimplemented ) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerDestroyTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..810214ca651e11048c92a6584389cb697326198e --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerDestroyTests.swift @@ -0,0 +1,42 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerDestroyTests: XCTestCase { + func testDestroy() throws { + let storageDir = "test-storage-dir" + var didRemoveDirectory: [String] = [] + var didSetUD: [UserDiscovery?] = [] + var didSetE2E: [E2E?] = [] + var didSetCMix: [CMix?] = [] + + var env: MessengerEnvironment = .unimplemented + env.storageDir = storageDir + env.fileManager.removeDirectory = { didRemoveDirectory.append($0) } + env.ud.set = { didSetUD.append($0) } + env.e2e.set = { didSetE2E.append($0) } + env.cMix.set = { didSetCMix.append($0) } + let destroy: MessengerDestroy = .live(env) + + try destroy() + + XCTAssertNoDifference(didRemoveDirectory, [storageDir]) + XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) + } + + func testRemoveDirectoryFailure() { + struct Error: Swift.Error, Equatable {} + let error = Error() + + var env: MessengerEnvironment = .unimplemented + env.fileManager.removeDirectory = { _ in throw error } + let destroy: MessengerDestroy = .live(env) + + XCTAssertThrowsError(try destroy()) { err in + XCTAssertEqual(err as? Error, error) + } + } +}