diff --git a/Docs/XXMessengerClient.md b/Docs/XXMessengerClient.md index 17699f7a3670f9bc47d23e7ad52d0f6acddbe0f9..6b599f7f5024833d8c43fa0cc49c7e6933167f40 100644 --- a/Docs/XXMessengerClient.md +++ b/Docs/XXMessengerClient.md @@ -117,11 +117,15 @@ if messenger.isBackupRunning() == false { try messenger.resumeBackup() } catch { // try to start a new backup: - try messenger.startBackup(password: "backup-passphrase") + let params: BackupParams = ... + try messenger.startBackup( + password: "backup-passphrase", + params: params + ) } } -// add backup params to the backup: +// update params in the backup: let params: BackupParams = ... try messenger.backupParams(params) @@ -132,6 +136,8 @@ try messenger.stopBackup() cancellable.cancel() ``` +When starting a new backup you must provide `BackupParams` to prevent creating backups that does not contain it. + The registered backup callback can be reused later when a new backup is started. There is no need to cancel it and register a new callback in such a case. Restore from backup: diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartBackup.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartBackup.swift index 366d87fc487cda297ddc8d5c74469340ce25b5af..254bc6b9268f03c9c01d6ed8086d2c1e55c1fd89 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartBackup.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartBackup.swift @@ -8,16 +8,19 @@ public struct MessengerStartBackup { case notLoggedIn } - public var run: (String) throws -> Void + public var run: (String, BackupParams) throws -> Void - public func callAsFunction(password: String) throws { - try run(password) + public func callAsFunction( + password: String, + params: BackupParams + ) throws { + try run(password, params) } } extension MessengerStartBackup { public static func live(_ env: MessengerEnvironment) -> MessengerStartBackup { - MessengerStartBackup { password in + MessengerStartBackup { password, params in guard env.backup()?.isRunning() != true else { throw Error.isRunning } @@ -27,11 +30,25 @@ extension MessengerStartBackup { guard let ud = env.ud() else { throw Error.notLoggedIn } + let paramsData = try params.encode() + let paramsString = String(data: paramsData, encoding: .utf8)! + var didAddParams = false + func addParams() { + guard let backup = env.backup() else { return } + backup.addJSON(paramsString) + didAddParams = true + } let backup = try env.initializeBackup( e2eId: e2e.getId(), udId: ud.getId(), password: password, - callback: env.backupCallbacks.registered() + callback: .init { data in + if !didAddParams { + addParams() + } else { + env.backupCallbacks.registered().handle(data) + } + } ) env.backup.set(backup) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartBackupTests.swift index c1e703a6d44931191ec9a8d8a3ea623f3e50c4bd..b92bd1ee38948737453e973a8e4b4cd874797b84 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartBackupTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartBackupTests.swift @@ -14,14 +14,16 @@ final class MessengerStartBackupTests: XCTestCase { var backupCallbacks: [UpdateBackupFunc] = [] var didHandleCallback: [Data] = [] var didSetBackup: [Backup?] = [] + var didAddJSON: [String] = [] let password = "test-password" let e2eId = 123 let udId = 321 - let data = "test-data".data(using: .utf8)! + let dataWithoutParams = "backup-without-params".data(using: .utf8)! + let dataWithParams = "backup-with-params".data(using: .utf8)! var env: MessengerEnvironment = .unimplemented - env.backup.get = { nil } + env.backup.get = { didSetBackup.last as? Backup } env.backup.set = { didSetBackup.append($0) } env.e2e.get = { var e2e: E2E = .unimplemented @@ -39,20 +41,37 @@ final class MessengerStartBackupTests: XCTestCase { env.initializeBackup.run = { e2eId, udId, password, callback in didInitializeBackup.append(.init(e2eId: e2eId, udId: udId, password: password)) backupCallbacks.append(callback) - return .unimplemented + var backup: Backup = .unimplemented + backup.addJSON.run = { string in + didAddJSON.append(string) + } + return backup } let start: MessengerStartBackup = .live(env) - try start(password: password) + try start(password: password, params: .stub) XCTAssertNoDifference(didInitializeBackup, [ .init(e2eId: e2eId, udId: udId, password: password) ]) XCTAssertNoDifference(didSetBackup.map { $0 != nil }, [true]) - backupCallbacks.forEach { $0.handle(data) } + backupCallbacks.forEach { $0.handle(dataWithoutParams) } + + XCTAssertNoDifference( + didHandleCallback.map(StringData.init), + [].map(StringData.init) + ) + XCTAssertNoDifference(didAddJSON, [ + String(data: try BackupParams.stub.encode(), encoding: .utf8)! + ]) + + backupCallbacks.forEach { $0.handle(dataWithParams) } - XCTAssertNoDifference(didHandleCallback, [data]) + XCTAssertNoDifference( + didHandleCallback.map(StringData.init), + [dataWithParams].map(StringData.init) + ) } func testStartWhenRunning() { @@ -64,7 +83,7 @@ final class MessengerStartBackupTests: XCTestCase { } let start: MessengerStartBackup = .live(env) - XCTAssertThrowsError(try start(password: "")) { error in + XCTAssertThrowsError(try start(password: "", params: .stub)) { error in XCTAssertNoDifference( error as NSError, MessengerStartBackup.Error.isRunning as NSError @@ -78,7 +97,7 @@ final class MessengerStartBackupTests: XCTestCase { env.e2e.get = { nil } let start: MessengerStartBackup = .live(env) - XCTAssertThrowsError(try start(password: "")) { error in + XCTAssertThrowsError(try start(password: "", params: .stub)) { error in XCTAssertNoDifference( error as NSError, MessengerStartBackup.Error.notConnected as NSError @@ -93,7 +112,7 @@ final class MessengerStartBackupTests: XCTestCase { env.ud.get = { nil } let start: MessengerStartBackup = .live(env) - XCTAssertThrowsError(try start(password: "")) { error in + XCTAssertThrowsError(try start(password: "", params: .stub)) { error in XCTAssertNoDifference( error as NSError, MessengerStartBackup.Error.notLoggedIn as NSError @@ -121,7 +140,7 @@ final class MessengerStartBackupTests: XCTestCase { env.initializeBackup.run = { _, _, _, _ in throw failure } let start: MessengerStartBackup = .live(env) - XCTAssertThrowsError(try start(password: "abcd")) { error in + XCTAssertThrowsError(try start(password: "", params: .stub)) { error in XCTAssertNoDifference(error as NSError, failure as NSError) } } diff --git a/Tests/XXMessengerClientTests/TestHelpers/StringData.swift b/Tests/XXMessengerClientTests/TestHelpers/StringData.swift new file mode 100644 index 0000000000000000000000000000000000000000..6987a4ea385989f6823e701b0e00002b036f0f00 --- /dev/null +++ b/Tests/XXMessengerClientTests/TestHelpers/StringData.swift @@ -0,0 +1,14 @@ +import CustomDump +import Foundation + +struct StringData: Equatable, CustomDumpStringConvertible { + var data: Data + + var customDumpDescription: String { + if let string = String(data: data, encoding: .utf8) { + return #"Data(string: "\#(string)", encoding: .utf8)"# + } else { + return data.customDumpDescription + } + } +} diff --git a/Tests/XXMessengerClientTests/TestHelpers/Message+stubs.swift b/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift similarity index 74% rename from Tests/XXMessengerClientTests/TestHelpers/Message+stubs.swift rename to Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift index e10bea4a6298544c2e4c4d01ba267a00d2dcc167..4d57e29363d3f22bdbb836622d7bfa92b014b683 100644 --- a/Tests/XXMessengerClientTests/TestHelpers/Message+stubs.swift +++ b/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift @@ -1,4 +1,5 @@ import XXClient +import XXMessengerClient extension Message { static func stub(_ stubId: Int) -> Message { @@ -16,3 +17,11 @@ extension Message { ) } } + +extension BackupParams { + static let stub = BackupParams( + username: "stub-username", + email: "stub-email", + phone: "stub-phone" + ) +}