diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 4cf167f95221db4aa4230d79f1cba10952f7a19f..b310549f615363a0f38348b5c79f2d158d00c0e2 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -274,8 +274,10 @@ let package = Package( .target( name: "RestoreFeature", dependencies: [ + .target(name: "AppCore"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + .product(name: "XXModels", package: "client-ios-db"), ], swiftSettings: swiftSettings ), diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index c79d5b935e7f12255b852278256742608695734e..24e5bd8910a267354a1a608579e5ddb31d1f4cc0 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -103,7 +103,9 @@ extension AppEnvironment { restore: { RestoreEnvironment( messenger: messenger, + db: dbManager.getDB, loadData: .live, + now: Date.init, mainQueue: mainQueue, bgQueue: bgQueue ) diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift index 5339c89bbd3dba39edaf2cc8f0181e673b396f4b..c941a8f9c6087f2533309f7223b42f5ac487e7b0 100644 --- a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift +++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift @@ -1,8 +1,10 @@ +import AppCore import Combine import ComposableArchitecture import Foundation import XCTestDynamicOverlay import XXMessengerClient +import XXModels public struct RestoreState: Equatable { public enum Field: String, Hashable { @@ -58,18 +60,24 @@ public enum RestoreAction: Equatable, BindableAction { public struct RestoreEnvironment { public init( messenger: Messenger, + db: DBManagerGetDB, loadData: URLDataLoader, + now: @escaping () -> Date, mainQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue> ) { self.messenger = messenger + self.db = db self.loadData = loadData + self.now = now self.mainQueue = mainQueue self.bgQueue = bgQueue } public var messenger: Messenger + public var db: DBManagerGetDB public var loadData: URLDataLoader + public var now: () -> Date public var mainQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue> } @@ -77,7 +85,9 @@ public struct RestoreEnvironment { extension RestoreEnvironment { public static let unimplemented = RestoreEnvironment( messenger: .unimplemented, + db: .unimplemented, loadData: .unimplemented, + now: XCTUnimplemented("\(Self.self).now"), mainQueue: .unimplemented, bgQueue: .unimplemented ) @@ -118,10 +128,17 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm state.restoreFailure = nil return Effect.result { do { - _ = try env.messenger.restoreBackup( + let result = try env.messenger.restoreBackup( backupData: backupData, backupPassphrase: backupPassphrase ) + try env.db().saveContact(Contact( + id: try env.messenger.e2e.tryGet().getContact().getId(), + username: result.restoredParams.username, + email: result.restoredParams.email, + phone: result.restoredParams.phone, + createdAt: env.now() + )) return .success(.finished) } catch { return .success(.failed(error as NSError)) diff --git a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift index 9a3cde3227357eb11d878c8c8f7fd7cc76f00fb5..88bf551f47b1b30257c6d35c4374a8a2bf66d75d 100644 --- a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift +++ b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift @@ -1,8 +1,10 @@ -import CustomDump import ComposableArchitecture +import CustomDump import XCTest -@testable import RestoreFeature +import XXClient import XXMessengerClient +import XXModels +@testable import RestoreFeature final class RestoreFeatureTests: XCTestCase { func testFileImport() { @@ -79,15 +81,18 @@ final class RestoreFeatureTests: XCTestCase { let backupPassphrase = "backup-passphrase" let restoreResult = MessengerRestoreBackup.Result( restoredParams: BackupParams.init( - username: "", - email: nil, - phone: nil + username: "restored-username", + email: "restored-email", + phone: "restored-phone" ), restoredContacts: [] ) + let now = Date() + let contactId = "contact-id".data(using: .utf8)! var didRestoreWithData: [Data] = [] var didRestoreWithPassphrase: [String] = [] + var didSaveContact: [XXModels.Contact] = [] let store = TestStore( initialState: RestoreState( @@ -99,11 +104,29 @@ final class RestoreFeatureTests: XCTestCase { store.environment.bgQueue = .immediate store.environment.mainQueue = .immediate + store.environment.now = { now } store.environment.messenger.restoreBackup.run = { data, passphrase in didRestoreWithData.append(data) didRestoreWithPassphrase.append(passphrase) return restoreResult } + store.environment.messenger.e2e.get = { + var e2e: E2E = .unimplemented + e2e.getContact.run = { + var contact: XXClient.Contact = .unimplemented(Data()) + contact.getIdFromContact.run = { _ in contactId } + return contact + } + return e2e + } + store.environment.db.run = { + var db: Database = .unimplemented + db.saveContact.run = { contact in + didSaveContact.append(contact) + return contact + } + return db + } store.send(.set(\.$passphrase, backupPassphrase)) { $0.passphrase = backupPassphrase @@ -115,6 +138,13 @@ final class RestoreFeatureTests: XCTestCase { XCTAssertNoDifference(didRestoreWithData, [backupData]) XCTAssertNoDifference(didRestoreWithPassphrase, [backupPassphrase]) + XCTAssertNoDifference(didSaveContact, [Contact( + id: contactId, + username: restoreResult.restoredParams.username, + email: restoreResult.restoredParams.email, + phone: restoreResult.restoredParams.phone, + createdAt: now + )]) store.receive(.finished) { $0.isRestoring = false