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

Improve send request feature

Use client to retrieve my facts, instead of database
parent 5eda3f48
No related branches found
No related tags found
2 merge requests!112Restore contacts from backup,!102Release 1.0.0
import AppCore
import Combine
import ComposableArchitecture
import Foundation
import XCTestDynamicOverlay
......@@ -40,7 +41,8 @@ public enum SendRequestAction: Equatable, BindableAction {
case sendSucceeded
case sendFailed(String)
case binding(BindingAction<SendRequestState>)
case myContactFetched(XXClient.Contact?)
case myContactFetched(XXClient.Contact)
case myContactFetchFailed(NSError)
}
public struct SendRequestEnvironment {
......@@ -75,25 +77,32 @@ extension SendRequestEnvironment {
public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, SendRequestEnvironment>
{ state, action, env in
enum DBFetchEffectID {}
switch action {
case .start:
return Effect
.catching { try env.messenger.e2e.tryGet().getContact().getId() }
.tryMap { try env.db().fetchContactsPublisher(.init(id: [$0])) }
.flatMap { $0 }
.assertNoFailure()
.map(\.first)
.map { $0?.marshaled.map { XXClient.Contact.live($0) } }
.map(SendRequestAction.myContactFetched)
.subscribe(on: env.bgQueue)
return Effect.run { subscriber in
do {
var contact = try env.messenger.e2e.tryGet().getContact()
let facts = try env.messenger.ud.tryGet().getFacts()
try contact.setFacts(facts)
subscriber.send(.myContactFetched(contact))
} catch {
subscriber.send(.myContactFetchFailed(error as NSError))
}
subscriber.send(completion: .finished)
return AnyCancellable {}
}
.receive(on: env.mainQueue)
.subscribe(on: env.bgQueue)
.eraseToEffect()
.cancellable(id: DBFetchEffectID.self, cancelInFlight: true)
case .myContactFetched(let contact):
state.myContact = contact
state.failure = nil
return .none
case .myContactFetchFailed(let failure):
state.myContact = nil
state.failure = failure.localizedDescription
return .none
case .sendTapped:
......
......@@ -8,6 +8,22 @@ import XXModels
final class SendRequestFeatureTests: XCTestCase {
func testStart() {
var didSetFactsOnE2EContact: [[Fact]] = []
let e2eContactData = "e2e-contact-data".data(using: .utf8)!
let e2eContactDataWithFacts = "e2e-contact-data-with-facts".data(using: .utf8)!
let e2eContact: XXClient.Contact = {
var contact = XXClient.Contact.unimplemented(e2eContactData)
contact.setFactsOnContact.run = { data, facts in
didSetFactsOnE2EContact.append(facts)
return e2eContactDataWithFacts
}
return contact
}()
let udFacts = [
Fact(type: .username, value: "ud-username"),
Fact(type: .email, value: "ud-email"),
Fact(type: .phone, value: "ud-phone"),
]
let store = TestStore(
initialState: SendRequestState(
contact: .unimplemented("contact-data".data(using: .utf8)!)
......@@ -15,47 +31,56 @@ final class SendRequestFeatureTests: XCTestCase {
reducer: sendRequestReducer,
environment: .unimplemented
)
var dbDidFetchContacts: [XXModels.Contact.Query] = []
let dbContactsPublisher = PassthroughSubject<[XXModels.Contact], Error>()
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("my-contact-data".data(using: .utf8)!)
contact.getIdFromContact.run = { _ in "my-contact-id".data(using: .utf8)! }
return contact
}
e2e.getContact.run = { e2eContact }
return e2e
}
store.environment.db.run = {
var db: Database = .unimplemented
db.fetchContactsPublisher.run = { query in
dbDidFetchContacts.append(query)
return dbContactsPublisher.eraseToAnyPublisher()
}
return db
store.environment.messenger.ud.get = {
var ud: UserDiscovery = .unimplemented
ud.getFacts.run = { udFacts }
return ud
}
store.send(.start)
XCTAssertNoDifference(dbDidFetchContacts, [.init(id: ["my-contact-id".data(using: .utf8)!])])
store.receive(.myContactFetched(.unimplemented(e2eContactDataWithFacts))) {
$0.myContact = .unimplemented(e2eContactDataWithFacts)
}
}
dbContactsPublisher.send([])
func testMyContactFailure() {
struct Failure: Error {}
let failure = Failure()
store.receive(.myContactFetched(nil))
let store = TestStore(
initialState: SendRequestState(
contact: .unimplemented("contact-data".data(using: .utf8)!)
),
reducer: sendRequestReducer,
environment: .unimplemented
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.getContact.run = { .unimplemented(Data()) }
return e2e
}
store.environment.messenger.ud.get = {
var ud: UserDiscovery = .unimplemented
ud.getFacts.run = { throw failure }
return ud
}
var myDbContact = XXModels.Contact(id: "my-contact-id".data(using: .utf8)!)
myDbContact.marshaled = "my-contact-data".data(using: .utf8)!
dbContactsPublisher.send([myDbContact])
store.send(.start)
store.receive(.myContactFetched(.live("my-contact-data".data(using: .utf8)!))) {
$0.myContact = .live("my-contact-data".data(using: .utf8)!)
store.receive(.myContactFetchFailed(failure as NSError)) {
$0.myContact = nil
$0.failure = failure.localizedDescription
}
dbContactsPublisher.send(completion: .finished)
}
func testSendRequest() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment