diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift index 9669cac5f4c7fd1ec18924cf22a20ea04046b2ad..818807c8229fed9d17ccd90c94711046dc651d37 100644 --- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift +++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift @@ -1,4 +1,5 @@ import AppCore +import Combine import ComposableArchitecture import Foundation import XCTestDynamicOverlay @@ -111,7 +112,24 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact return .none case .loadFactsTapped: - return .none + return Effect.run { subscriber in + do { + let contactId = try env.messenger.e2e.tryGet().getContact().getId() + if var dbContact = try env.db().fetchContacts(.init(id: [contactId])).first { + let facts = try env.messenger.ud.tryGet().getFacts() + dbContact.email = facts.get(.email)?.value + dbContact.phone = facts.get(.phone)?.value + try env.db().saveContact(dbContact) + } + } catch { + subscriber.send(.didFail(error.localizedDescription)) + } + subscriber.send(completion: .finished) + return AnyCancellable {} + } + .subscribe(on: env.bgQueue) + .receive(on: env.mainQueue) + .eraseToEffect() case .didFail(let failure): state.alert = .error(failure) diff --git a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift index 169450c8f0ecb7a6e57d17f1bae82ee856ee1f54..62e7fcd9959e5583e55bce9c5a2a6cb413999c32 100644 --- a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift +++ b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift @@ -111,13 +111,61 @@ final class MyContactFeatureTests: XCTestCase { } func testLoadFactsFromClient() { + let contactId = "contact-id".data(using: .utf8)! + let dbContact = XXModels.Contact(id: contactId) + let email = "test@email.com" + let phone = "123456789" + + var didFetchContacts: [XXModels.Contact.Query] = [] + var didSaveContact: [XXModels.Contact] = [] + let store = TestStore( initialState: MyContactState(), reducer: myContactReducer, environment: .unimplemented ) + store.environment.mainQueue = .immediate + store.environment.bgQueue = .immediate + 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.messenger.ud.get = { + var ud: UserDiscovery = .unimplemented + ud.getFacts.run = { + [ + Fact(type: .email, value: email), + Fact(type: .phone, value: phone), + ] + } + return ud + } + store.environment.db.run = { + var db: Database = .failing + db.fetchContacts.run = { query in + didFetchContacts.append(query) + return [dbContact] + } + db.saveContact.run = { contact in + didSaveContact.append(contact) + return contact + } + return db + } + store.send(.loadFactsTapped) + + XCTAssertNoDifference(didFetchContacts, [.init(id: [contactId])]) + var expectedSavedContact = dbContact + expectedSavedContact.email = email + expectedSavedContact.phone = phone + XCTAssertNoDifference(didSaveContact, [expectedSavedContact]) } func testErrorAlert() {