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

Update db contact after verification

parent d7a73908
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!81Messenger example - contact authorization improvements
......@@ -248,9 +248,11 @@ let package = Package(
.target(
name: "VerifyContactFeature",
dependencies: [
.target(name: "AppCore"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "XXClient", package: "elixxir-dapps-sdk-swift"),
.product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
.product(name: "XXModels", package: "client-ios-db"),
]
),
.testTarget(
......
......@@ -47,6 +47,7 @@ extension AppEnvironment {
verifyContact: {
VerifyContactEnvironment(
messenger: messenger,
db: dbManager.getDB,
mainQueue: mainQueue,
bgQueue: bgQueue
)
......
import AppCore
import ComposableArchitecture
import Foundation
import XCTestDynamicOverlay
import XXClient
import XXMessengerClient
import XXModels
public struct VerifyContactState: Equatable {
public enum Result: Equatable {
......@@ -11,7 +13,7 @@ public struct VerifyContactState: Equatable {
}
public init(
contact: Contact,
contact: XXClient.Contact,
isVerifying: Bool = false,
result: Result? = nil
) {
......@@ -20,7 +22,7 @@ public struct VerifyContactState: Equatable {
self.result = result
}
public var contact: Contact
public var contact: XXClient.Contact
public var isVerifying: Bool
public var result: Result?
}
......@@ -33,15 +35,18 @@ public enum VerifyContactAction: Equatable {
public struct VerifyContactEnvironment {
public init(
messenger: Messenger,
db: DBManagerGetDB,
mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue>
) {
self.messenger = messenger
self.db = db
self.mainQueue = mainQueue
self.bgQueue = bgQueue
}
public var messenger: Messenger
public var db: DBManagerGetDB
public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue>
}
......@@ -50,6 +55,7 @@ public struct VerifyContactEnvironment {
extension VerifyContactEnvironment {
public static let unimplemented = VerifyContactEnvironment(
messenger: .unimplemented,
db: .unimplemented,
mainQueue: .unimplemented,
bgQueue: .unimplemented
)
......@@ -65,6 +71,11 @@ public let verifyContactReducer = Reducer<VerifyContactState, VerifyContactActio
return Effect.result { [state] in
do {
let result = try env.messenger.verifyContact(state.contact)
let contactId = try state.contact.getId()
try env.db().bulkUpdateContacts.callAsFunction(
.init(id: [contactId]),
.init(authStatus: result ? .verified : .verificationFailed)
)
return .success(.didVerify(.success(result)))
} catch {
return .success(.didVerify(.failure(error.localizedDescription)))
......
import ComposableArchitecture
import CustomDump
import XCTest
import XXClient
import XXModels
@testable import VerifyContactFeature
final class VerifyContactFeatureTests: XCTestCase {
func testVerify() {
var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!)
let contactId = "contact-id".data(using: .utf8)!
contact.getIdFromContact.run = { _ in contactId }
let store = TestStore(
initialState: VerifyContactState(
contact: .unimplemented("contact-data".data(using: .utf8)!)
contact: contact
),
reducer: verifyContactReducer,
environment: .unimplemented
)
var didVerifyContact: [Contact] = []
var didVerifyContact: [XXClient.Contact] = []
var didBulkUpdateContactsWithQuery: [XXModels.Contact.Query] = []
var didBulkUpdateContactsWithAssignments: [XXModels.Contact.Assignments] = []
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
......@@ -21,12 +29,25 @@ final class VerifyContactFeatureTests: XCTestCase {
didVerifyContact.append(contact)
return true
}
store.environment.db.run = {
var db: Database = .failing
db.bulkUpdateContacts.run = { query, assignments in
didBulkUpdateContactsWithQuery.append(query)
didBulkUpdateContactsWithAssignments.append(assignments)
return 0
}
return db
}
store.send(.verifyTapped) {
$0.isVerifying = true
$0.result = nil
}
XCTAssertNoDifference(didVerifyContact, [contact])
XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])])
XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .verified)])
store.receive(.didVerify(.success(true))) {
$0.isVerifying = false
$0.result = .success(true)
......@@ -34,23 +55,47 @@ final class VerifyContactFeatureTests: XCTestCase {
}
func testVerifyNotVerified() {
var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!)
let contactId = "contact-id".data(using: .utf8)!
contact.getIdFromContact.run = { _ in contactId }
let store = TestStore(
initialState: VerifyContactState(
contact: .unimplemented("contact-data".data(using: .utf8)!)
contact: contact
),
reducer: verifyContactReducer,
environment: .unimplemented
)
var didVerifyContact: [XXClient.Contact] = []
var didBulkUpdateContactsWithQuery: [XXModels.Contact.Query] = []
var didBulkUpdateContactsWithAssignments: [XXModels.Contact.Assignments] = []
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.verifyContact.run = { _ in false }
store.environment.messenger.verifyContact.run = { contact in
didVerifyContact.append(contact)
return false
}
store.environment.db.run = {
var db: Database = .failing
db.bulkUpdateContacts.run = { query, assignments in
didBulkUpdateContactsWithQuery.append(query)
didBulkUpdateContactsWithAssignments.append(assignments)
return 0
}
return db
}
store.send(.verifyTapped) {
$0.isVerifying = true
$0.result = nil
}
XCTAssertNoDifference(didVerifyContact, [contact])
XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])])
XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .verificationFailed)])
store.receive(.didVerify(.success(false))) {
$0.isVerifying = false
$0.result = .success(false)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment