import Alamofire
import XCTest
final class RequestModifierTests: BaseTestCase {
@MainActor
func testThatDataRequestsCanHaveCustomTimeoutValueSet() {
let session = stored(Session())
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified")
var response: AFDataResponse<Data?>?
session.request(.delay(1)) { $0.timeoutInterval = 0.001; modified.fulfill() }
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
}
@MainActor
func testThatDataRequestsCallRequestModifiersOnRetry() {
let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0))
let session = Session(interceptor: inspector)
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified twice")
modified.expectedFulfillmentCount = 2
var response: AFDataResponse<Data?>?
session.request(.delay(1)) { $0.timeoutInterval = 0.001; modified.fulfill() }
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
XCTAssertEqual(inspector.retryCalledCount, 2)
}
@MainActor
func testThatUploadRequestsCanHaveCustomTimeoutValueSet() {
let session = stored(Session())
let endpoint = Endpoint.delay(1).modifying(\.method, to: .post)
let data = Data("data".utf8)
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified")
var response: AFDataResponse<Data?>?
session.upload(data, to: endpoint) { $0.timeoutInterval = 0.001; modified.fulfill() }
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
}
@MainActor
func testThatUploadRequestsCallRequestModifiersOnRetry() {
let endpoint = Endpoint.delay(1).modifying(\.method, to: .post)
let data = Data("data".utf8)
let policy = RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0, retryableHTTPMethods: [.post])
let inspector = InspectorInterceptor(policy)
let session = Session(interceptor: inspector)
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified twice")
modified.expectedFulfillmentCount = 2
var response: AFDataResponse<Data?>?
session.upload(data, to: endpoint) { $0.timeoutInterval = 0.001; modified.fulfill() }
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
XCTAssertEqual(inspector.retryCalledCount, 2)
}
@MainActor
func testThatDownloadRequestsCanHaveCustomTimeoutValueSet() {
let session = stored(Session())
let url = Endpoint.delay(1).url
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified")
var response: AFDownloadResponse<URL?>?
session.download(url, requestModifier: { $0.timeoutInterval = 0.001; modified.fulfill() })
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
}
@MainActor
func testThatDownloadRequestsCallRequestModifiersOnRetry() {
let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0))
let session = Session(interceptor: inspector)
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified twice")
modified.expectedFulfillmentCount = 2
var response: AFDownloadResponse<URL?>?
session.download(.delay(1), requestModifier: { $0.timeoutInterval = 0.001; modified.fulfill() })
.response { response = $0; completed.fulfill() }
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
XCTAssertEqual(inspector.retryCalledCount, 2)
}
@MainActor
func testThatDataStreamRequestsCanHaveCustomTimeoutValueSet() {
let session = stored(Session())
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified")
var response: DataStreamRequest.Completion?
session.streamRequest(.delay(1)) { $0.timeoutInterval = 0.001; modified.fulfill() }
.responseStream { stream in
guard case let .complete(completion) = stream.event else { return }
response = completion
completed.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
}
@MainActor
func testThatDataStreamRequestsCallRequestModifiersOnRetry() {
let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0))
let session = Session(interceptor: inspector)
let completed = expectation(description: "request completed")
let modified = expectation(description: "request should be modified twice")
modified.expectedFulfillmentCount = 2
var response: DataStreamRequest.Completion?
session.streamRequest(.delay(1)) { $0.timeoutInterval = 0.001; modified.fulfill() }
.responseStream { stream in
guard case let .complete(completion) = stream.event else { return }
response = completion
completed.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut)
XCTAssertEqual(inspector.retryCalledCount, 2)
}
}