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

Use MessengerMyContact in BackupFeature

parent d6d7d10f
No related branches found
No related tags found
2 merge requests!112Restore contacts from backup,!102Release 1.0.0
This commit is part of merge request !112. Comments created here will be created in the context of that merge request.
......@@ -119,10 +119,8 @@ let package = Package(
.target(
name: "BackupFeature",
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
),
......
......@@ -164,7 +164,6 @@ extension AppEnvironment {
backup: {
BackupEnvironment(
messenger: messenger,
db: dbManager.getDB,
backupStorage: backupStorage,
mainQueue: mainQueue,
bgQueue: bgQueue
......
import AppCore
import Combine
import ComposableArchitecture
import Foundation
import XXClient
import XXMessengerClient
import XXModels
public struct BackupState: Equatable {
public enum Field: String, Hashable {
......@@ -12,8 +10,7 @@ public struct BackupState: Equatable {
}
public enum Error: String, Swift.Error, Equatable {
case dbContactNotFound
case dbContactUsernameMissing
case contactUsernameMissing
}
public init(
......@@ -71,20 +68,17 @@ public enum BackupAction: Equatable, BindableAction {
public struct BackupEnvironment {
public init(
messenger: Messenger,
db: DBManagerGetDB,
backupStorage: BackupStorage,
mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue>
) {
self.messenger = messenger
self.db = db
self.backupStorage = backupStorage
self.mainQueue = mainQueue
self.bgQueue = bgQueue
}
public var messenger: Messenger
public var db: DBManagerGetDB
public var backupStorage: BackupStorage
public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue>
......@@ -94,7 +88,6 @@ public struct BackupEnvironment {
extension BackupEnvironment {
public static let unimplemented = BackupEnvironment(
messenger: .unimplemented,
db: .unimplemented,
backupStorage: .unimplemented,
mainQueue: .unimplemented,
bgQueue: .unimplemented
......@@ -129,15 +122,9 @@ public let backupReducer = Reducer<BackupState, BackupAction, BackupEnvironment>
state.focusedField = nil
return Effect.run { [state] subscriber in
do {
let e2e: E2E = try env.messenger.e2e.tryGet()
let contactID = try e2e.getContact().getId()
let db = try env.db()
let query = XXModels.Contact.Query(id: [contactID])
guard let contact = try db.fetchContacts(query).first else {
throw BackupState.Error.dbContactNotFound
}
guard let username = contact.username else {
throw BackupState.Error.dbContactUsernameMissing
let contact = try env.messenger.myContact(includeFacts: .types([.username]))
guard let username = try contact.getFact(.username)?.value else {
throw BackupState.Error.contactUsernameMissing
}
try env.messenger.startBackup(
password: state.passphrase,
......
......@@ -2,7 +2,6 @@ import ComposableArchitecture
import XCTest
import XXClient
import XXMessengerClient
import XXModels
@testable import BackupFeature
final class BackupFeatureTests: XCTestCase {
......@@ -65,11 +64,7 @@ final class BackupFeatureTests: XCTestCase {
func testStartBackup() {
var actions: [Action]!
var isBackupRunning: [Bool] = [true]
let contactID = "contact-id".data(using: .utf8)!
let dbContact = XXModels.Contact(
id: contactID,
username: "db-contact-username"
)
let username = "test-username"
let passphrase = "backup-password"
let store = TestStore(
......@@ -79,26 +74,18 @@ final class BackupFeatureTests: XCTestCase {
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.myContact.run = { includeFacts in
actions.append(.didGetMyContact(includingFacts: includeFacts))
var contact = Contact.unimplemented("contact-data".data(using: .utf8)!)
contact.getFactsFromContact.run = { _ in [Fact(type: .username, value: username)] }
return contact
}
store.environment.messenger.startBackup.run = { passphrase, params in
actions.append(.didStartBackup(passphrase: passphrase, params: params))
}
store.environment.messenger.isBackupRunning.run = {
isBackupRunning.removeFirst()
}
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.fetchContacts.run = { _ in return [dbContact] }
return db
}
actions = []
store.send(.set(\.$focusedField, .passphrase)) {
......@@ -117,9 +104,12 @@ final class BackupFeatureTests: XCTestCase {
}
XCTAssertNoDifference(actions, [
.didGetMyContact(
includingFacts: .types([.username])
),
.didStartBackup(
passphrase: passphrase,
params: .init(username: dbContact.username!)
params: .init(username: username)
)
])
......@@ -130,9 +120,8 @@ final class BackupFeatureTests: XCTestCase {
}
}
func testStartBackupWithoutDbContact() {
func testStartBackupWithoutContactUsername() {
var isBackupRunning: [Bool] = [false]
let contactID = "contact-id".data(using: .utf8)!
let store = TestStore(
initialState: BackupState(
......@@ -143,29 +132,20 @@ final class BackupFeatureTests: XCTestCase {
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.myContact.run = { _ in
var contact = Contact.unimplemented("contact-data".data(using: .utf8)!)
contact.getFactsFromContact.run = { _ in [] }
return contact
}
store.environment.messenger.isBackupRunning.run = {
isBackupRunning.removeFirst()
}
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.fetchContacts.run = { _ in [] }
return db
}
store.send(.startTapped) {
$0.isStarting = true
}
let failure = BackupState.Error.dbContactNotFound
let failure = BackupState.Error.contactUsernameMissing
store.receive(.didStart(failure: failure as NSError)) {
$0.isRunning = false
$0.isStarting = false
......@@ -173,13 +153,10 @@ final class BackupFeatureTests: XCTestCase {
}
}
func testStartBackupWithoutDbContactUsername() {
func testStartBackupMyContactFailure() {
struct Failure: Error {}
let failure = Failure()
var isBackupRunning: [Bool] = [false]
let contactID = "contact-id".data(using: .utf8)!
let dbContact = XXModels.Contact(
id: contactID,
username: nil
)
let store = TestStore(
initialState: BackupState(
......@@ -190,29 +167,15 @@ final class BackupFeatureTests: XCTestCase {
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.myContact.run = { _ in throw failure }
store.environment.messenger.isBackupRunning.run = {
isBackupRunning.removeFirst()
}
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.fetchContacts.run = { _ in [dbContact] }
return db
}
store.send(.startTapped) {
$0.isStarting = true
}
let failure = BackupState.Error.dbContactUsernameMissing
store.receive(.didStart(failure: failure as NSError)) {
$0.isRunning = false
$0.isStarting = false
......@@ -220,15 +183,10 @@ final class BackupFeatureTests: XCTestCase {
}
}
func testStartBackupFailure() {
func testStartBackupStartFailure() {
struct Failure: Error {}
let failure = Failure()
var isBackupRunning: [Bool] = [false]
let contactID = "contact-id".data(using: .utf8)!
let dbContact = XXModels.Contact(
id: contactID,
username: "db-contact-username"
)
let store = TestStore(
initialState: BackupState(
......@@ -239,26 +197,17 @@ final class BackupFeatureTests: XCTestCase {
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.myContact.run = { _ in
var contact = Contact.unimplemented("data".data(using: .utf8)!)
contact.getFactsFromContact.run = { _ in [Fact(type: .username, value: "username")] }
return contact
}
store.environment.messenger.startBackup.run = { _, _ in
throw failure
}
store.environment.messenger.isBackupRunning.run = {
isBackupRunning.removeFirst()
}
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.fetchContacts.run = { _ in return [dbContact] }
return db
}
store.send(.startTapped) {
$0.isStarting = true
......@@ -463,5 +412,5 @@ private enum Action: Equatable {
case didResumeBackup
case didStopBackup
case didRemoveBackup
case didFetchContacts(XXModels.Contact.Query)
case didGetMyContact(includingFacts: MessengerMyContact.IncludeFacts?)
}
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