diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 9c44e4411327a01b3bd6b336b5a2216acedaf825..2736c69c437e636e8eabcc3eefda2a96b9f238fc 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -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( diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index fa3774e877a4e353dd66e13102da636af4bebd25..906e9992a9391461f0ff5410d196727996d7c892 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -47,6 +47,7 @@ extension AppEnvironment { verifyContact: { VerifyContactEnvironment( messenger: messenger, + db: dbManager.getDB, mainQueue: mainQueue, bgQueue: bgQueue ) diff --git a/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift b/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift index 4a38f3ade560742fef925667c5d158b64894a1cf..8a69a072f8d2fa98fdd5426b9c91f970c42bd9bb 100644 --- a/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift +++ b/Examples/xx-messenger/Sources/VerifyContactFeature/VerifyContactFeature.swift @@ -1,8 +1,10 @@ +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))) diff --git a/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift b/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift index 3721bc46e99c93747fd3a5b3341e8a53770996e9..6ca82b1edec51dce43f8386867fc5fcbd7c9ebb4 100644 --- a/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift +++ b/Examples/xx-messenger/Tests/VerifyContactFeatureTests/VerifyContactFeatureTests.swift @@ -1,19 +1,27 @@ 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)