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

Remove DB before creating new messenger

parent d70c0920
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!100Messenger - restore from backup
...@@ -344,6 +344,7 @@ let package = Package( ...@@ -344,6 +344,7 @@ let package = Package(
.target( .target(
name: "WelcomeFeature", name: "WelcomeFeature",
dependencies: [ dependencies: [
.target(name: "AppCore"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
], ],
......
...@@ -90,6 +90,7 @@ extension AppEnvironment { ...@@ -90,6 +90,7 @@ extension AppEnvironment {
welcome: { welcome: {
WelcomeEnvironment( WelcomeEnvironment(
messenger: messenger, messenger: messenger,
dbManager: dbManager,
mainQueue: mainQueue, mainQueue: mainQueue,
bgQueue: bgQueue bgQueue: bgQueue
) )
......
import AppCore
import ComposableArchitecture import ComposableArchitecture
import SwiftUI import SwiftUI
import XXMessengerClient import XXMessengerClient
public struct WelcomeState: Equatable { public struct WelcomeState: Equatable {
public init( public init(
isCreatingCMix: Bool = false isCreatingCMix: Bool = false,
failure: String? = nil
) { ) {
self.isCreatingAccount = isCreatingCMix self.isCreatingAccount = isCreatingCMix
self.failure = failure
} }
public var isCreatingAccount: Bool public var isCreatingAccount: Bool
public var failure: String?
} }
public enum WelcomeAction: Equatable { public enum WelcomeAction: Equatable {
...@@ -22,15 +26,18 @@ public enum WelcomeAction: Equatable { ...@@ -22,15 +26,18 @@ public enum WelcomeAction: Equatable {
public struct WelcomeEnvironment { public struct WelcomeEnvironment {
public init( public init(
messenger: Messenger, messenger: Messenger,
dbManager: DBManager,
mainQueue: AnySchedulerOf<DispatchQueue>, mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue> bgQueue: AnySchedulerOf<DispatchQueue>
) { ) {
self.messenger = messenger self.messenger = messenger
self.dbManager = dbManager
self.mainQueue = mainQueue self.mainQueue = mainQueue
self.bgQueue = bgQueue self.bgQueue = bgQueue
} }
public var messenger: Messenger public var messenger: Messenger
public var dbManager: DBManager
public var mainQueue: AnySchedulerOf<DispatchQueue> public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue>
} }
...@@ -38,6 +45,7 @@ public struct WelcomeEnvironment { ...@@ -38,6 +45,7 @@ public struct WelcomeEnvironment {
extension WelcomeEnvironment { extension WelcomeEnvironment {
public static let unimplemented = WelcomeEnvironment( public static let unimplemented = WelcomeEnvironment(
messenger: .unimplemented, messenger: .unimplemented,
dbManager: .unimplemented,
mainQueue: .unimplemented, mainQueue: .unimplemented,
bgQueue: .unimplemented bgQueue: .unimplemented
) )
...@@ -48,8 +56,10 @@ public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironm ...@@ -48,8 +56,10 @@ public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironm
switch action { switch action {
case .newAccountTapped: case .newAccountTapped:
state.isCreatingAccount = true state.isCreatingAccount = true
state.failure = nil
return .future { fulfill in return .future { fulfill in
do { do {
try env.dbManager.removeDB()
try env.messenger.create() try env.messenger.create()
fulfill(.success(.finished)) fulfill(.success(.finished))
} }
...@@ -66,10 +76,12 @@ public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironm ...@@ -66,10 +76,12 @@ public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironm
case .finished: case .finished:
state.isCreatingAccount = false state.isCreatingAccount = false
state.failure = nil
return .none return .none
case .failed(_): case .failed(let failure):
state.isCreatingAccount = false state.isCreatingAccount = false
state.failure = failure
return .none return .none
} }
} }
...@@ -11,9 +11,11 @@ public struct WelcomeView: View { ...@@ -11,9 +11,11 @@ public struct WelcomeView: View {
struct ViewState: Equatable { struct ViewState: Equatable {
init(_ state: WelcomeState) { init(_ state: WelcomeState) {
isCreatingAccount = state.isCreatingAccount isCreatingAccount = state.isCreatingAccount
failure = state.failure
} }
var isCreatingAccount: Bool var isCreatingAccount: Bool
var failure: String?
} }
public var body: some View { public var body: some View {
...@@ -24,6 +26,14 @@ public struct WelcomeView: View { ...@@ -24,6 +26,14 @@ public struct WelcomeView: View {
Text("xx messenger") Text("xx messenger")
} }
if let failure = viewStore.failure {
Section {
Text(failure)
} header: {
Text("Error")
}
}
Section { Section {
Button { Button {
viewStore.send(.newAccountTapped) viewStore.send(.newAccountTapped)
......
...@@ -13,52 +13,97 @@ final class WelcomeFeatureTests: XCTestCase { ...@@ -13,52 +13,97 @@ final class WelcomeFeatureTests: XCTestCase {
let mainQueue = DispatchQueue.test let mainQueue = DispatchQueue.test
let bgQueue = DispatchQueue.test let bgQueue = DispatchQueue.test
var messengerDidCreate = false
enum Action: Equatable {
case didCreateMessenger
case didRemoveDB
}
var actions: [Action] = []
store.environment.mainQueue = mainQueue.eraseToAnyScheduler() store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
store.environment.bgQueue = bgQueue.eraseToAnyScheduler() store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
store.environment.messenger.create.run = { messengerDidCreate = true } store.environment.messenger.create.run = { actions.append(.didCreateMessenger) }
store.environment.dbManager.removeDB.run = { actions.append(.didRemoveDB) }
store.send(.newAccountTapped) { store.send(.newAccountTapped) {
$0.isCreatingAccount = true $0.isCreatingAccount = true
$0.failure = nil
} }
bgQueue.advance() bgQueue.advance()
XCTAssertTrue(messengerDidCreate) XCTAssertNoDifference(actions, [
.didRemoveDB,
.didCreateMessenger
])
mainQueue.advance() mainQueue.advance()
store.receive(.finished) { store.receive(.finished) {
$0.isCreatingAccount = false $0.isCreatingAccount = false
$0.failure = nil
} }
} }
func testNewAccountTappedMessengerCreateFailure() { func testNewAccountTappedMessengerCreateFailure() {
struct Failure: Error {}
let failure = Failure()
let mainQueue = DispatchQueue.test
let bgQueue = DispatchQueue.test
let store = TestStore( let store = TestStore(
initialState: WelcomeState(), initialState: WelcomeState(),
reducer: welcomeReducer, reducer: welcomeReducer,
environment: .unimplemented environment: .unimplemented
) )
store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
store.environment.messenger.create.run = { throw failure }
store.environment.dbManager.removeDB.run = {}
store.send(.newAccountTapped) {
$0.isCreatingAccount = true
$0.failure = nil
}
bgQueue.advance()
mainQueue.advance()
store.receive(.failed(failure.localizedDescription)) {
$0.isCreatingAccount = false
$0.failure = failure.localizedDescription
}
}
func testNewAccountTappedRemoveDBFailure() {
struct Failure: Error, Equatable {}
let failure = Failure()
let mainQueue = DispatchQueue.test let mainQueue = DispatchQueue.test
let bgQueue = DispatchQueue.test let bgQueue = DispatchQueue.test
struct Error: Swift.Error, Equatable {}
let error = Error() let store = TestStore(
initialState: WelcomeState(),
reducer: welcomeReducer,
environment: .unimplemented
)
store.environment.mainQueue = mainQueue.eraseToAnyScheduler() store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
store.environment.bgQueue = bgQueue.eraseToAnyScheduler() store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
store.environment.messenger.create.run = { throw error } store.environment.messenger.create.run = {}
store.environment.dbManager.removeDB.run = { throw failure }
store.send(.newAccountTapped) { store.send(.newAccountTapped) {
$0.isCreatingAccount = true $0.isCreatingAccount = true
$0.failure = nil
} }
bgQueue.advance() bgQueue.advance()
mainQueue.advance() mainQueue.advance()
store.receive(.failed(error.localizedDescription)) { store.receive(.failed(failure.localizedDescription)) {
$0.isCreatingAccount = false $0.isCreatingAccount = false
$0.failure = failure.localizedDescription
} }
} }
......
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