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