diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index c2da9978d6ac07644d78a4161d741f5e22e85929..9c44e4411327a01b3bd6b336b5a2216acedaf825 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -102,6 +102,7 @@ let package = Package( .target( name: "CheckContactAuthFeature", 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"), diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index ae1da8b967a2db31994c641acea8b310dba25d6a..fa3774e877a4e353dd66e13102da636af4bebd25 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -54,6 +54,7 @@ extension AppEnvironment { checkAuth: { CheckContactAuthEnvironment( messenger: messenger, + db: dbManager.getDB, mainQueue: mainQueue, bgQueue: bgQueue ) diff --git a/Examples/xx-messenger/Sources/CheckContactAuthFeature/CheckContactAuthFeature.swift b/Examples/xx-messenger/Sources/CheckContactAuthFeature/CheckContactAuthFeature.swift index 119ff27a2f2a73a772c0e9cf1c97cf7d983e285a..1f768be8d1cba4f20c1f2db65253788358a66023 100644 --- a/Examples/xx-messenger/Sources/CheckContactAuthFeature/CheckContactAuthFeature.swift +++ b/Examples/xx-messenger/Sources/CheckContactAuthFeature/CheckContactAuthFeature.swift @@ -1,8 +1,10 @@ +import AppCore import ComposableArchitecture import Foundation import XCTestDynamicOverlay import XXClient import XXMessengerClient +import XXModels public struct CheckContactAuthState: Equatable { public enum Result: Equatable { @@ -11,7 +13,7 @@ public struct CheckContactAuthState: Equatable { } public init( - contact: Contact, + contact: XXClient.Contact, isChecking: Bool = false, result: Result? = nil ) { @@ -20,7 +22,7 @@ public struct CheckContactAuthState: Equatable { self.result = result } - public var contact: Contact + public var contact: XXClient.Contact public var isChecking: Bool public var result: Result? } @@ -33,15 +35,18 @@ public enum CheckContactAuthAction: Equatable { public struct CheckContactAuthEnvironment { 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 CheckContactAuthEnvironment { extension CheckContactAuthEnvironment { public static let unimplemented = CheckContactAuthEnvironment( messenger: .unimplemented, + db: .unimplemented, mainQueue: .unimplemented, bgQueue: .unimplemented ) @@ -67,6 +73,10 @@ public let checkContactAuthReducer = Reducer<CheckContactAuthState, CheckContact let e2e = try env.messenger.e2e.tryGet() let contactId = try state.contact.getId() let result = try e2e.hasAuthenticatedChannel(partnerId: contactId) + try env.db().bulkUpdateContacts.callAsFunction( + .init(id: [contactId]), + .init(authStatus: result ? .friend : .stranger) + ) return .success(.didCheck(.success(result))) } catch { return .success(.didCheck(.failure(error.localizedDescription))) diff --git a/Examples/xx-messenger/Tests/CheckContactAuthFeatureTests/CheckContactAuthFeatureTests.swift b/Examples/xx-messenger/Tests/CheckContactAuthFeatureTests/CheckContactAuthFeatureTests.swift index 1c36e33e9d43509b986c0bce4d9bd4304ef9cd6e..95f5a80773838e9b72d4f8c6e380e0f7ce8799fd 100644 --- a/Examples/xx-messenger/Tests/CheckContactAuthFeatureTests/CheckContactAuthFeatureTests.swift +++ b/Examples/xx-messenger/Tests/CheckContactAuthFeatureTests/CheckContactAuthFeatureTests.swift @@ -1,11 +1,13 @@ import ComposableArchitecture +import CustomDump import XCTest import XXClient +import XXModels @testable import CheckContactAuthFeature final class CheckContactAuthFeatureTests: XCTestCase { func testCheck() { - var contact = Contact.unimplemented("contact-data".data(using: .utf8)!) + var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!) let contactId = "contact-id".data(using: .utf8)! contact.getIdFromContact.run = { _ in contactId } @@ -18,6 +20,8 @@ final class CheckContactAuthFeatureTests: XCTestCase { ) var didCheckPartnerId: [Data] = [] + var didBulkUpdateContactsWithQuery: [XXModels.Contact.Query] = [] + var didBulkUpdateContactsWithAssignments: [XXModels.Contact.Assignments] = [] store.environment.mainQueue = .immediate store.environment.bgQueue = .immediate @@ -29,12 +33,25 @@ final class CheckContactAuthFeatureTests: XCTestCase { } return e2e } + 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(.checkTapped) { $0.isChecking = true $0.result = nil } + XCTAssertNoDifference(didCheckPartnerId, [contactId]) + XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])]) + XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .friend)]) + store.receive(.didCheck(.success(true))) { $0.isChecking = false $0.result = .success(true) @@ -42,7 +59,7 @@ final class CheckContactAuthFeatureTests: XCTestCase { } func testCheckNoConnection() { - var contact = Contact.unimplemented("contact-data".data(using: .utf8)!) + var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!) let contactId = "contact-id".data(using: .utf8)! contact.getIdFromContact.run = { _ in contactId } @@ -54,19 +71,39 @@ final class CheckContactAuthFeatureTests: XCTestCase { environment: .unimplemented ) + var didCheckPartnerId: [Data] = [] + var didBulkUpdateContactsWithQuery: [XXModels.Contact.Query] = [] + var didBulkUpdateContactsWithAssignments: [XXModels.Contact.Assignments] = [] + store.environment.mainQueue = .immediate store.environment.bgQueue = .immediate store.environment.messenger.e2e.get = { var e2e: E2E = .unimplemented - e2e.hasAuthenticatedChannel.run = { _ in false } + e2e.hasAuthenticatedChannel.run = { partnerId in + didCheckPartnerId.append(partnerId) + return false + } return e2e } + 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(.checkTapped) { $0.isChecking = true $0.result = nil } + XCTAssertNoDifference(didCheckPartnerId, [contactId]) + XCTAssertNoDifference(didBulkUpdateContactsWithQuery, [.init(id: [contactId])]) + XCTAssertNoDifference(didBulkUpdateContactsWithAssignments, [.init(authStatus: .stranger)]) + store.receive(.didCheck(.success(false))) { $0.isChecking = false $0.result = .success(false) @@ -74,7 +111,7 @@ final class CheckContactAuthFeatureTests: XCTestCase { } func testCheckFailure() { - var contact = Contact.unimplemented("contact-data".data(using: .utf8)!) + var contact = XXClient.Contact.unimplemented("contact-data".data(using: .utf8)!) let contactId = "contact-id".data(using: .utf8)! contact.getIdFromContact.run = { _ in contactId }