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

Register backup callback and update storage

parent cfafee09
No related branches found
No related tags found
2 merge requests!110Backup improvements & example,!102Release 1.0.0
...@@ -28,6 +28,7 @@ extension AppEnvironment { ...@@ -28,6 +28,7 @@ extension AppEnvironment {
handleConfirm: .live(db: dbManager.getDB), handleConfirm: .live(db: dbManager.getDB),
handleReset: .live(db: dbManager.getDB) handleReset: .live(db: dbManager.getDB)
) )
let backupStorage = BackupStorage.live(now: Date.init)
let mainQueue = DispatchQueue.main.eraseToAnyScheduler() let mainQueue = DispatchQueue.main.eraseToAnyScheduler()
let bgQueue = DispatchQueue.global(qos: .background).eraseToAnyScheduler() let bgQueue = DispatchQueue.global(qos: .background).eraseToAnyScheduler()
...@@ -91,6 +92,7 @@ extension AppEnvironment { ...@@ -91,6 +92,7 @@ extension AppEnvironment {
messenger: messenger, messenger: messenger,
db: dbManager.getDB db: dbManager.getDB
), ),
backupStorage: backupStorage,
log: .live(), log: .live(),
mainQueue: mainQueue, mainQueue: mainQueue,
bgQueue: bgQueue, bgQueue: bgQueue,
......
...@@ -50,6 +50,7 @@ struct AppEnvironment { ...@@ -50,6 +50,7 @@ struct AppEnvironment {
var messenger: Messenger var messenger: Messenger
var authHandler: AuthCallbackHandler var authHandler: AuthCallbackHandler
var messageListener: MessageListenerHandler var messageListener: MessageListenerHandler
var backupStorage: BackupStorage
var log: Logger var log: Logger
var mainQueue: AnySchedulerOf<DispatchQueue> var mainQueue: AnySchedulerOf<DispatchQueue>
var bgQueue: AnySchedulerOf<DispatchQueue> var bgQueue: AnySchedulerOf<DispatchQueue>
...@@ -64,6 +65,7 @@ extension AppEnvironment { ...@@ -64,6 +65,7 @@ extension AppEnvironment {
messenger: .unimplemented, messenger: .unimplemented,
authHandler: .unimplemented, authHandler: .unimplemented,
messageListener: .unimplemented, messageListener: .unimplemented,
backupStorage: .unimplemented,
log: .unimplemented, log: .unimplemented,
mainQueue: .unimplemented, mainQueue: .unimplemented,
bgQueue: .unimplemented, bgQueue: .unimplemented,
...@@ -94,6 +96,9 @@ let appReducer = Reducer<AppState, AppAction, AppEnvironment> ...@@ -94,6 +96,9 @@ let appReducer = Reducer<AppState, AppAction, AppEnvironment>
cancellables.append(env.messageListener(onError: { error in cancellables.append(env.messageListener(onError: { error in
env.log(.error(error as NSError)) env.log(.error(error as NSError))
})) }))
cancellables.append(env.messenger.registerBackupCallback(.init { data in
env.backupStorage.store(data)
}))
let isLoaded = env.messenger.isLoaded() let isLoaded = env.messenger.isLoaded()
let isCreated = env.messenger.isCreated() let isCreated = env.messenger.isCreated()
......
...@@ -10,7 +10,7 @@ import XXClient ...@@ -10,7 +10,7 @@ import XXClient
final class AppFeatureTests: XCTestCase { final class AppFeatureTests: XCTestCase {
func testStartWithoutMessengerCreated() { func testStartWithoutMessengerCreated() {
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState(), initialState: AppState(),
...@@ -34,24 +34,29 @@ final class AppFeatureTests: XCTestCase { ...@@ -34,24 +34,29 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.start) store.send(.start)
store.receive(.set(\.$screen, .welcome(WelcomeState()))) { store.receive(.set(\.$screen, .welcome(WelcomeState()))) {
$0.screen = .welcome(WelcomeState()) $0.screen = .welcome(WelcomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didMakeDB, .didMakeDB,
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
]) ])
store.send(.stop) store.send(.stop)
} }
func testStartWithMessengerCreated() { func testStartWithMessengerCreated() {
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState(), initialState: AppState(),
...@@ -78,17 +83,22 @@ final class AppFeatureTests: XCTestCase { ...@@ -78,17 +83,22 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.start) store.send(.start)
store.receive(.set(\.$screen, .home(HomeState()))) { store.receive(.set(\.$screen, .home(HomeState()))) {
$0.screen = .home(HomeState()) $0.screen = .home(HomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didMakeDB, .didMakeDB,
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
.didLoadMessenger, .didLoadMessenger,
]) ])
...@@ -96,7 +106,7 @@ final class AppFeatureTests: XCTestCase { ...@@ -96,7 +106,7 @@ final class AppFeatureTests: XCTestCase {
} }
func testWelcomeFinished() { func testWelcomeFinished() {
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState( initialState: AppState(
...@@ -122,7 +132,12 @@ final class AppFeatureTests: XCTestCase { ...@@ -122,7 +132,12 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.welcome(.finished)) { store.send(.welcome(.finished)) {
$0.screen = .loading $0.screen = .loading
} }
...@@ -130,10 +145,10 @@ final class AppFeatureTests: XCTestCase { ...@@ -130,10 +145,10 @@ final class AppFeatureTests: XCTestCase {
store.receive(.set(\.$screen, .home(HomeState()))) { store.receive(.set(\.$screen, .home(HomeState()))) {
$0.screen = .home(HomeState()) $0.screen = .home(HomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
.didLoadMessenger, .didLoadMessenger,
]) ])
...@@ -141,7 +156,7 @@ final class AppFeatureTests: XCTestCase { ...@@ -141,7 +156,7 @@ final class AppFeatureTests: XCTestCase {
} }
func testRestoreFinished() { func testRestoreFinished() {
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState( initialState: AppState(
...@@ -167,7 +182,12 @@ final class AppFeatureTests: XCTestCase { ...@@ -167,7 +182,12 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.restore(.finished)) { store.send(.restore(.finished)) {
$0.screen = .loading $0.screen = .loading
} }
...@@ -175,10 +195,10 @@ final class AppFeatureTests: XCTestCase { ...@@ -175,10 +195,10 @@ final class AppFeatureTests: XCTestCase {
store.receive(.set(\.$screen, .home(HomeState()))) { store.receive(.set(\.$screen, .home(HomeState()))) {
$0.screen = .home(HomeState()) $0.screen = .home(HomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
.didLoadMessenger, .didLoadMessenger,
]) ])
...@@ -186,7 +206,7 @@ final class AppFeatureTests: XCTestCase { ...@@ -186,7 +206,7 @@ final class AppFeatureTests: XCTestCase {
} }
func testHomeDidDeleteAccount() { func testHomeDidDeleteAccount() {
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState( initialState: AppState(
...@@ -209,7 +229,12 @@ final class AppFeatureTests: XCTestCase { ...@@ -209,7 +229,12 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.home(.deleteAccount(.success))) { store.send(.home(.deleteAccount(.success))) {
$0.screen = .loading $0.screen = .loading
} }
...@@ -217,10 +242,10 @@ final class AppFeatureTests: XCTestCase { ...@@ -217,10 +242,10 @@ final class AppFeatureTests: XCTestCase {
store.receive(.set(\.$screen, .welcome(WelcomeState()))) { store.receive(.set(\.$screen, .welcome(WelcomeState()))) {
$0.screen = .welcome(WelcomeState()) $0.screen = .welcome(WelcomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
]) ])
store.send(.stop) store.send(.stop)
...@@ -284,7 +309,7 @@ final class AppFeatureTests: XCTestCase { ...@@ -284,7 +309,7 @@ final class AppFeatureTests: XCTestCase {
struct Failure: Error {} struct Failure: Error {}
let error = Failure() let error = Failure()
var actions: [Action] = [] var actions: [Action]!
let store = TestStore( let store = TestStore(
initialState: AppState(), initialState: AppState(),
...@@ -306,7 +331,12 @@ final class AppFeatureTests: XCTestCase { ...@@ -306,7 +331,12 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didStartMessageListener) actions.append(.didStartMessageListener)
return Cancellable {} return Cancellable {}
} }
store.environment.messenger.registerBackupCallback.run = { _ in
actions.append(.didRegisterBackupCallback)
return Cancellable {}
}
actions = []
store.send(.start) store.send(.start)
store.receive(.set(\.$screen, .failure(error.localizedDescription))) { store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
...@@ -316,15 +346,17 @@ final class AppFeatureTests: XCTestCase { ...@@ -316,15 +346,17 @@ final class AppFeatureTests: XCTestCase {
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
]) ])
store.send(.stop) store.send(.stop)
} }
func testStartHandlersAndListeners() { func testStartHandlersAndListeners() {
var actions: [Action] = [] var actions: [Action]!
var authHandlerOnError: [AuthCallbackHandler.OnError] = [] var authHandlerOnError: [AuthCallbackHandler.OnError] = []
var messageListenerOnError: [MessageListenerHandler.OnError] = [] var messageListenerOnError: [MessageListenerHandler.OnError] = []
var backupCallback: [UpdateBackupFunc] = []
let store = TestStore( let store = TestStore(
initialState: AppState(), initialState: AppState(),
...@@ -351,22 +383,33 @@ final class AppFeatureTests: XCTestCase { ...@@ -351,22 +383,33 @@ final class AppFeatureTests: XCTestCase {
actions.append(.didCancelMessageListener) actions.append(.didCancelMessageListener)
} }
} }
store.environment.messenger.registerBackupCallback.run = { callback in
backupCallback.append(callback)
actions.append(.didRegisterBackupCallback)
return Cancellable {
actions.append(.didCancelBackupCallback)
}
}
store.environment.log.run = { msg, _, _, _ in store.environment.log.run = { msg, _, _, _ in
actions.append(.didLog(msg)) actions.append(.didLog(msg))
} }
store.environment.backupStorage.store = { data in
actions.append(.didStoreBackup(data))
}
actions = []
store.send(.start) store.send(.start)
store.receive(.set(\.$screen, .home(HomeState()))) { store.receive(.set(\.$screen, .home(HomeState()))) {
$0.screen = .home(HomeState()) $0.screen = .home(HomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
]) ])
actions = []
actions = []
store.send(.start) { store.send(.start) {
$0.screen = .loading $0.screen = .loading
} }
...@@ -374,15 +417,16 @@ final class AppFeatureTests: XCTestCase { ...@@ -374,15 +417,16 @@ final class AppFeatureTests: XCTestCase {
store.receive(.set(\.$screen, .home(HomeState()))) { store.receive(.set(\.$screen, .home(HomeState()))) {
$0.screen = .home(HomeState()) $0.screen = .home(HomeState())
} }
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didCancelAuthHandler, .didCancelAuthHandler,
.didCancelMessageListener, .didCancelMessageListener,
.didCancelBackupCallback,
.didStartAuthHandler, .didStartAuthHandler,
.didStartMessageListener, .didStartMessageListener,
.didRegisterBackupCallback,
]) ])
actions = []
actions = []
struct AuthError: Error {} struct AuthError: Error {}
let authError = AuthError() let authError = AuthError()
authHandlerOnError.first?(authError) authHandlerOnError.first?(authError)
...@@ -390,8 +434,8 @@ final class AppFeatureTests: XCTestCase { ...@@ -390,8 +434,8 @@ final class AppFeatureTests: XCTestCase {
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didLog(.error(authError as NSError)) .didLog(.error(authError as NSError))
]) ])
actions = []
actions = []
struct MessageError: Error {} struct MessageError: Error {}
let messageError = MessageError() let messageError = MessageError()
messageListenerOnError.first?(messageError) messageListenerOnError.first?(messageError)
...@@ -399,13 +443,22 @@ final class AppFeatureTests: XCTestCase { ...@@ -399,13 +443,22 @@ final class AppFeatureTests: XCTestCase {
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didLog(.error(messageError as NSError)) .didLog(.error(messageError as NSError))
]) ])
actions = [] actions = []
let backupData = "backup".data(using: .utf8)!
backupCallback.first?.handle(backupData)
XCTAssertNoDifference(actions, [
.didStoreBackup(backupData),
])
actions = []
store.send(.stop) store.send(.stop)
XCTAssertNoDifference(actions, [ XCTAssertNoDifference(actions, [
.didCancelAuthHandler, .didCancelAuthHandler,
.didCancelMessageListener, .didCancelMessageListener,
.didCancelBackupCallback,
]) ])
} }
} }
...@@ -414,8 +467,11 @@ private enum Action: Equatable { ...@@ -414,8 +467,11 @@ private enum Action: Equatable {
case didMakeDB case didMakeDB
case didStartAuthHandler case didStartAuthHandler
case didStartMessageListener case didStartMessageListener
case didRegisterBackupCallback
case didLoadMessenger case didLoadMessenger
case didCancelAuthHandler case didCancelAuthHandler
case didCancelMessageListener case didCancelMessageListener
case didCancelBackupCallback
case didLog(Logger.Message) case didLog(Logger.Message)
case didStoreBackup(Data)
} }
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