diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift index 9f0d591b44e0820c6f2f6af6611055c72f74be06..e32e6324cb1eeebc7dce54b8cc3769d830f4d43e 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift @@ -30,58 +30,53 @@ extension MessengerRestoreBackup { public static func live(_ env: MessengerEnvironment) -> MessengerRestoreBackup { MessengerRestoreBackup { backupData, backupPassphrase in let storageDir = env.storageDir - do { - let ndfData = try env.downloadNDF(env.ndfEnvironment) - let password = env.generateSecret() - try env.passwordStorage.save(password) - try env.fileManager.removeDirectory(storageDir) - try env.fileManager.createDirectory(storageDir) - let report = try env.newCMixFromBackup( - ndfJSON: String(data: ndfData, encoding: .utf8)!, - storageDir: storageDir, - backupPassphrase: backupPassphrase, - sessionPassword: password, - backupFileContents: backupData - ) - let cMix = try env.loadCMix( - storageDir: storageDir, - password: password, - cMixParamsJSON: env.getCMixParams() - ) - try cMix.startNetworkFollower(timeoutMS: 30_000) - let e2e = try env.login( - cMixId: cMix.getId(), - authCallbacks: env.authCallbacks.registered(), - identity: try cMix.makeReceptionIdentity(legacy: true), - e2eParamsJSON: env.getE2EParams() - ) - let decoder = JSONDecoder() - let paramsData = report.params.data(using: .utf8)! - let params = try decoder.decode(BackupParams.self, from: paramsData) - let ud = try env.newUdManagerFromBackup( - params: NewUdManagerFromBackup.Params( - e2eId: e2e.getId(), - username: Fact(type: .username, value: params.username), - email: params.email.map { Fact(type: .email, value: $0) }, - phone: params.phone.map { Fact(type: .phone, value: $0) }, - cert: env.udCert ?? e2e.getUdCertFromNdf(), - contact: env.udContact ?? (try e2e.getUdContactFromNdf()), - address: env.udAddress ?? e2e.getUdAddressFromNdf() - ), - follower: UdNetworkStatus { cMix.networkFollowerStatus() } - ) - env.cMix.set(cMix) - env.e2e.set(e2e) - env.ud.set(ud) - env.isListeningForMessages.set(false) - return Result( - restoredParams: params, - restoredContacts: report.restoredContacts - ) - } catch { - try? env.fileManager.removeDirectory(storageDir) - throw error - } + let ndfData = try env.downloadNDF(env.ndfEnvironment) + let password = env.generateSecret() + try env.passwordStorage.save(password) + try env.fileManager.removeDirectory(storageDir) + try env.fileManager.createDirectory(storageDir) + let report = try env.newCMixFromBackup( + ndfJSON: String(data: ndfData, encoding: .utf8)!, + storageDir: storageDir, + backupPassphrase: backupPassphrase, + sessionPassword: password, + backupFileContents: backupData + ) + let cMix = try env.loadCMix( + storageDir: storageDir, + password: password, + cMixParamsJSON: env.getCMixParams() + ) + env.cMix.set(cMix) + try cMix.startNetworkFollower(timeoutMS: 30_000) + let e2e = try env.login( + cMixId: cMix.getId(), + authCallbacks: env.authCallbacks.registered(), + identity: try cMix.makeReceptionIdentity(legacy: true), + e2eParamsJSON: env.getE2EParams() + ) + env.e2e.set(e2e) + env.isListeningForMessages.set(false) + let decoder = JSONDecoder() + let paramsData = report.params.data(using: .utf8)! + let params = try decoder.decode(BackupParams.self, from: paramsData) + let ud = try env.newUdManagerFromBackup( + params: NewUdManagerFromBackup.Params( + e2eId: e2e.getId(), + username: Fact(type: .username, value: params.username), + email: params.email.map { Fact(type: .email, value: $0) }, + phone: params.phone.map { Fact(type: .phone, value: $0) }, + cert: env.udCert ?? e2e.getUdCertFromNdf(), + contact: env.udContact ?? (try e2e.getUdContactFromNdf()), + address: env.udAddress ?? e2e.getUdAddressFromNdf() + ), + follower: UdNetworkStatus { cMix.networkFollowerStatus() } + ) + env.ud.set(ud) + return Result( + restoredParams: params, + restoredContacts: report.restoredContacts + ) } } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift index fb8fe7da315df608763b572a273ec67ef2c8366c..3e2dc1f2b8ea333fd1155a06b2010d7f3faeee13 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift @@ -136,6 +136,7 @@ final class MessengerRestoreBackupTests: XCTestCase { password: password, cMixParams: cMixParams ), + .didSetCMix, .cMixDidStartNetworkFollower( timeoutMS: 30_000 ), @@ -148,6 +149,10 @@ final class MessengerRestoreBackupTests: XCTestCase { identity: receptionIdentity, e2eParamsJSON: e2eParams ), + .didSetE2E, + .didSetIsListeningForMessages( + isListening: false + ), .didNewUdManagerFromBackup(params: .init( e2eId: e2eId, username: Fact(type: .username, value: backupParams.username), @@ -157,12 +162,7 @@ final class MessengerRestoreBackupTests: XCTestCase { contact: udContactFromNdf, address: udAddressFromNdf )), - .didSetCMix, - .didSetE2E, .didSetUD, - .didSetIsListeningForMessages( - isListening: false - ), ]) XCTAssertNoDifference(result, MessengerRestoreBackup.Result( @@ -175,19 +175,13 @@ final class MessengerRestoreBackupTests: XCTestCase { struct Failure: Error, Equatable {} let failure = Failure() - var actions: [CaughtAction] = [] - var env: MessengerEnvironment = .unimplemented env.downloadNDF.run = { _ in throw failure } - env.fileManager.removeDirectory = { actions.append(.didRemoveDirectory(path: $0)) } let restore: MessengerRestoreBackup = .live(env) XCTAssertThrowsError(try restore(backupData: Data(), backupPassphrase: "")) { error in XCTAssertNoDifference(error as? Failure, failure) } - XCTAssertNoDifference(actions, [ - .didRemoveDirectory(path: env.storageDir) - ]) } }