1+ import Combine
12import XCTest
23import Fakes
34
@@ -6,12 +7,18 @@ import Fakes
67
78/// Remote UnitTests
89///
9- class RemoteTests : XCTestCase {
10+ final class RemoteTests : XCTestCase {
1011
1112 /// Sample Request
1213 ///
1314 private let request = JetpackRequest ( wooApiVersion: . mark3, method: . post, siteID: 123 , path: " something " , parameters: [ : ] )
1415
16+ private var cancellables = Set < AnyCancellable > ( )
17+
18+ override func setUp( ) {
19+ super. setUp ( )
20+ cancellables = [ ]
21+ }
1522
1623 /// Verifies that `enqueue:mapper:` properly wraps up the received request within an AuthenticatedRequest, with
1724 /// the remote credentials.
@@ -68,6 +75,36 @@ class RemoteTests: XCTestCase {
6875 XCTAssertEqual ( receivedRequest. path, request. path)
6976 }
7077
78+ /// Verifies that `enqueuePublisher:` properly wraps up the received request within an AuthenticatedRequest, with
79+ /// the remote credentials.
80+ ///
81+ func test_enqueuePublisher_wraps_up_request_into_authenticated_request_with_credentials( ) throws {
82+ // Given
83+ let network = MockNetwork ( )
84+ let mapper = DummyMapper ( )
85+ let remote = Remote ( network: network)
86+
87+ // When
88+ let result = waitFor { promise in
89+ remote. enqueue ( self . request, mapper: mapper) . sink { result in
90+ promise ( result)
91+ } . store ( in: & self . cancellables)
92+ }
93+
94+ // Then
95+ let error = try XCTUnwrap ( result. failure)
96+ guard case NetworkError . notFound = error,
97+ let receivedRequest = network. requestsForResponseData. first as? JetpackRequest
98+ else {
99+ XCTFail ( )
100+ return
101+ }
102+
103+ XCTAssertEqual ( network. requestsForResponseData. count, 1 )
104+ XCTAssertEqual ( receivedRequest. method, request. method)
105+ XCTAssertEqual ( receivedRequest. path, request. path)
106+ }
107+
71108 /// Verifies that `enqueue:mapper:` relays any received payload over to the Mapper.
72109 ///
73110 func testEnqueueWithMapperProperlyRelaysReceivedPayloadToMapper( ) {
@@ -110,6 +147,28 @@ class RemoteTests: XCTestCase {
110147 XCTAssertNotNil ( mapper. input)
111148 }
112149
150+ /// Verifies that `enqueuePublisher` relays any received payload over to the Mapper.
151+ ///
152+ func test_enqueuePublisher_relays_received_payload_to_mapper( ) {
153+ // Given
154+ let network = MockNetwork ( )
155+ let mapper = DummyMapper ( )
156+ let remote = Remote ( network: network)
157+
158+ network. simulateResponse ( requestUrlSuffix: " something " , filename: " order " )
159+
160+ // When
161+ waitForExpectation { expectation in
162+ remote. enqueue ( request, mapper: mapper) . sink { _ in
163+ expectation. fulfill ( )
164+ } . store ( in: & cancellables)
165+ }
166+
167+ // Then
168+ XCTAssertEqual ( mapper. input, Loader . contentsOf ( " order " ) )
169+ XCTAssertNotNil ( mapper. input)
170+ }
171+
113172 /// Verifies that `enqueue:` posts a `RemoteDidReceiveJetpackTimeoutError` Notification whenever the backend returns a
114173 /// Request Timeout error.
115174 ///
@@ -180,6 +239,30 @@ class RemoteTests: XCTestCase {
180239 XCTAssertTrue ( try XCTUnwrap ( result) . isFailure)
181240 XCTAssertTrue ( try XCTUnwrap ( result? . failure) is DotcomError )
182241 }
242+
243+ /// Verifies that `enqueuePublisher` posts a `RemoteDidReceiveJetpackTimeoutError` Notification whenever the backend returns a Request Timeout error.
244+ ///
245+ func test_enqueuePublisher_posts_Jetpack_timeout_notification_when_the_response_contains_timeout_error( ) throws {
246+ // Given
247+ let network = MockNetwork ( )
248+ let mapper = DummyMapper ( )
249+ let remote = Remote ( network: network)
250+
251+ network. simulateResponse ( requestUrlSuffix: " something " , filename: " timeout_error " )
252+
253+ // When
254+ let expectationForNotification = expectation ( forNotification: . RemoteDidReceiveJetpackTimeoutError, object: nil , handler: nil )
255+ let result : Result < Any , Error > = waitFor { promise in
256+ remote. enqueue ( self . request, mapper: mapper) . sink { result in
257+ promise ( result)
258+ } . store ( in: & self . cancellables)
259+ }
260+ wait ( for: [ expectationForNotification] , timeout: Constants . expectationTimeout)
261+
262+ // Then
263+ XCTAssertTrue ( result. isFailure)
264+ XCTAssertEqual ( result. failure as? DotcomError , DotcomError . requestFailed)
265+ }
183266}
184267
185268
0 commit comments