Skip to content
Snippets Groups Projects
Commit fa71cb6e authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add MessengerStartBackup function

parent 5a258fcd
No related branches found
No related tags found
2 merge requests!107Messenger - backup,!102Release 1.0.0
import XCTestDynamicOverlay
import XXClient
public struct MessengerStartBackup {
public enum Error: Swift.Error, Equatable {
case isRunning
case notConnected
case notLoggedIn
}
public var run: (String) throws -> Void
public func callAsFunction(password: String) throws {
try run(password)
}
}
extension MessengerStartBackup {
public static func live(_ env: MessengerEnvironment) -> MessengerStartBackup {
MessengerStartBackup { password in
guard env.backup()?.isRunning() != true else {
throw Error.isRunning
}
guard let e2e = env.e2e() else {
throw Error.notConnected
}
guard let ud = env.ud() else {
throw Error.notLoggedIn
}
let backup = try env.initializeBackup(
e2eId: e2e.getId(),
udId: ud.getId(),
password: password,
callback: env.backupCallbacks.registered()
)
env.backup.set(backup)
}
}
}
extension MessengerStartBackup {
public static let unimplemented = MessengerStartBackup(
run: XCTUnimplemented("\(Self.self)")
)
}
......@@ -31,6 +31,7 @@ public struct Messenger {
public var sendMessage: MessengerSendMessage
public var registerBackupCallback: MessengerRegisterBackupCallback
public var isBackupRunning: MessengerIsBackupRunning
public var startBackup: MessengerStartBackup
public var stopBackup: MessengerStopBackup
}
......@@ -67,6 +68,7 @@ extension Messenger {
sendMessage: .live(env),
registerBackupCallback: .live(env),
isBackupRunning: .live(env),
startBackup: .live(env),
stopBackup: .live(env)
)
}
......@@ -104,6 +106,7 @@ extension Messenger {
sendMessage: .unimplemented,
registerBackupCallback: .unimplemented,
isBackupRunning: .unimplemented,
startBackup: .unimplemented,
stopBackup: .unimplemented
)
}
......@@ -14,6 +14,7 @@ public struct MessengerEnvironment {
public var getCMixParams: GetCMixParams
public var getE2EParams: GetE2EParams
public var getSingleUseParams: GetSingleUseParams
public var initializeBackup: InitializeBackup
public var isListeningForMessages: Stored<Bool>
public var isRegisteredWithUD: IsRegisteredWithUD
public var loadCMix: LoadCMix
......@@ -57,6 +58,7 @@ extension MessengerEnvironment {
getCMixParams: .liveDefault,
getE2EParams: .liveDefault,
getSingleUseParams: .liveDefault,
initializeBackup: .live,
isListeningForMessages: .inMemory(false),
isRegisteredWithUD: .live,
loadCMix: .live,
......@@ -95,6 +97,7 @@ extension MessengerEnvironment {
getCMixParams: .unimplemented,
getE2EParams: .unimplemented,
getSingleUseParams: .unimplemented,
initializeBackup: .unimplemented,
isListeningForMessages: .unimplemented(placeholder: false),
isRegisteredWithUD: .unimplemented,
loadCMix: .unimplemented,
......
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient
final class MessengerStartBackupTests: XCTestCase {
func testStart() throws {
struct InitBackupParams: Equatable {
var e2eId: Int
var udId: Int
var password: String
}
var didInitializeBackup: [InitBackupParams] = []
var backupCallbacks: [UpdateBackupFunc] = []
var didHandleCallback: [Data] = []
var didSetBackup: [Backup?] = []
let password = "test-password"
let e2eId = 123
let udId = 321
let data = "test-data".data(using: .utf8)!
var env: MessengerEnvironment = .unimplemented
env.backup.get = { nil }
env.backup.set = { didSetBackup.append($0) }
env.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getId.run = { e2eId }
return e2e
}
env.ud.get = {
var ud: UserDiscovery = .unimplemented
ud.getId.run = { udId }
return ud
}
env.backupCallbacks.registered = {
UpdateBackupFunc { didHandleCallback.append($0) }
}
env.initializeBackup.run = { e2eId, udId, password, callback in
didInitializeBackup.append(.init(e2eId: e2eId, udId: udId, password: password))
backupCallbacks.append(callback)
return .unimplemented
}
let start: MessengerStartBackup = .live(env)
try start(password: password)
XCTAssertNoDifference(didInitializeBackup, [
.init(e2eId: e2eId, udId: udId, password: password)
])
XCTAssertNoDifference(didSetBackup.map { $0 != nil }, [true])
backupCallbacks.forEach { $0.handle(data) }
XCTAssertNoDifference(didHandleCallback, [data])
}
func testStartWhenRunning() {
var env: MessengerEnvironment = .unimplemented
env.backup.get = {
var backup: Backup = .unimplemented
backup.isRunning.run = { true }
return backup
}
let start: MessengerStartBackup = .live(env)
XCTAssertThrowsError(try start(password: "")) { error in
XCTAssertNoDifference(
error as NSError,
MessengerStartBackup.Error.isRunning as NSError
)
}
}
func testStartWhenNotConnected() {
var env: MessengerEnvironment = .unimplemented
env.backup.get = { nil }
env.e2e.get = { nil }
let start: MessengerStartBackup = .live(env)
XCTAssertThrowsError(try start(password: "")) { error in
XCTAssertNoDifference(
error as NSError,
MessengerStartBackup.Error.notConnected as NSError
)
}
}
func testStartWhenNotLoggedIn() {
var env: MessengerEnvironment = .unimplemented
env.backup.get = { nil }
env.e2e.get = { .unimplemented }
env.ud.get = { nil }
let start: MessengerStartBackup = .live(env)
XCTAssertThrowsError(try start(password: "")) { error in
XCTAssertNoDifference(
error as NSError,
MessengerStartBackup.Error.notLoggedIn as NSError
)
}
}
func testStartFailure() {
struct Failure: Error, Equatable {}
let failure = Failure()
var env: MessengerEnvironment = .unimplemented
env.backup.get = { nil }
env.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getId.run = { 123 }
return e2e
}
env.ud.get = {
var ud: UserDiscovery = .unimplemented
ud.getId.run = { 321 }
return ud
}
env.backupCallbacks.registered = { UpdateBackupFunc { _ in } }
env.initializeBackup.run = { _, _, _, _ in throw failure }
let start: MessengerStartBackup = .live(env)
XCTAssertThrowsError(try start(password: "abcd")) { error in
XCTAssertNoDifference(error as NSError, failure as NSError)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment