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

Fetch my facts in SendRequestFeature

parent 557dadbc
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!68Messenger example - send auth request
...@@ -63,7 +63,12 @@ extension AppEnvironment { ...@@ -63,7 +63,12 @@ extension AppEnvironment {
mainQueue: mainQueue, mainQueue: mainQueue,
bgQueue: bgQueue, bgQueue: bgQueue,
sendRequest: { sendRequest: {
SendRequestEnvironment() SendRequestEnvironment(
messenger: messenger,
db: dbManager.getDB,
mainQueue: mainQueue,
bgQueue: bgQueue
)
} }
) )
} }
......
import AppCore
import ComposableArchitecture import ComposableArchitecture
import Foundation
import XCTestDynamicOverlay import XCTestDynamicOverlay
import XXClient import XXClient
import XXMessengerClient
import XXModels import XXModels
public struct SendRequestState: Equatable { public struct SendRequestState: Equatable {
...@@ -35,22 +38,60 @@ public enum SendRequestAction: Equatable, BindableAction { ...@@ -35,22 +38,60 @@ public enum SendRequestAction: Equatable, BindableAction {
case start case start
case sendTapped case sendTapped
case binding(BindingAction<SendRequestState>) case binding(BindingAction<SendRequestState>)
case myContactFetched(XXClient.Contact?)
} }
public struct SendRequestEnvironment { public struct SendRequestEnvironment {
public init() {} 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>
} }
#if DEBUG #if DEBUG
extension SendRequestEnvironment { extension SendRequestEnvironment {
public static let unimplemented = SendRequestEnvironment() public static let unimplemented = SendRequestEnvironment(
messenger: .unimplemented,
db: .unimplemented,
mainQueue: .unimplemented,
bgQueue: .unimplemented
)
} }
#endif #endif
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
.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)
.receive(on: env.mainQueue)
.eraseToEffect()
.cancellable(id: DBFetchEffectID.self, cancelInFlight: true)
case .myContactFetched(let contact):
state.myContact = contact
return .none return .none
case .sendTapped: case .sendTapped:
...@@ -60,3 +101,4 @@ public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, Sen ...@@ -60,3 +101,4 @@ public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, Sen
return .none return .none
} }
} }
.binding()
import Combine
import ComposableArchitecture import ComposableArchitecture
import XCTest import XCTest
import XXClient
import XXModels
@testable import SendRequestFeature @testable import SendRequestFeature
final class SendRequestFeatureTests: XCTestCase { final class SendRequestFeatureTests: XCTestCase {
...@@ -12,6 +15,71 @@ final class SendRequestFeatureTests: XCTestCase { ...@@ -12,6 +15,71 @@ final class SendRequestFeatureTests: XCTestCase {
environment: .unimplemented 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
}
return e2e
}
store.environment.db.run = {
var db: Database = .failing
db.fetchContactsPublisher.run = { query in
dbDidFetchContacts.append(query)
return dbContactsPublisher.eraseToAnyPublisher()
}
return db
}
store.send(.start) store.send(.start)
XCTAssertNoDifference(dbDidFetchContacts, [.init(id: ["my-contact-id".data(using: .utf8)!])])
dbContactsPublisher.send([])
store.receive(.myContactFetched(nil))
var myDbContact = XXModels.Contact(id: "my-contact-id".data(using: .utf8)!)
myDbContact.marshaled = "my-contact-data".data(using: .utf8)!
dbContactsPublisher.send([myDbContact])
store.receive(.myContactFetched(.live("my-contact-data".data(using: .utf8)!))) {
$0.myContact = .live("my-contact-data".data(using: .utf8)!)
}
dbContactsPublisher.send(completion: .finished)
}
func testSendRequest() {
var myContact: XXClient.Contact = .unimplemented("my-contact-data".data(using: .utf8)!)
myContact.getFactsFromContact.run = { _ in
[
Fact(fact: "my-username", type: 0),
Fact(fact: "my-email", type: 1),
Fact(fact: "my-phone", type: 2),
]
}
let store = TestStore(
initialState: SendRequestState(
contact: .unimplemented("contact-data".data(using: .utf8)!),
myContact: myContact
),
reducer: sendRequestReducer,
environment: .unimplemented
)
store.send(.set(\.$sendPhone, false)) {
$0.sendPhone = false
}
store.send(.sendTapped)
} }
} }
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