import Alamofire
import Foundation
import XCTest
final class RedirectHandlerTestCase: BaseTestCase {
private var redirectEndpoint: Endpoint { .get }
private var endpoint: Endpoint { .redirectTo(redirectEndpoint) }
@MainActor
func testThatRequestRedirectHandlerCanFollowRedirects() {
let session = Session()
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should redirect to /get")
session.request(endpoint).redirect(using: Redirector.follow).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNotNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
XCTAssertEqual(response?.response?.statusCode, 200)
}
@MainActor
func testThatRequestRedirectHandlerCanNotFollowRedirects() {
let session = Session()
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should NOT redirect to /get")
session.request(endpoint).redirect(using: Redirector.doNotFollow).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, endpoint.url)
XCTAssertEqual(response?.response?.statusCode, 302)
}
@MainActor
func testThatRequestRedirectHandlerCanModifyRedirects() {
let session = Session()
let customRedirectEndpoint = Endpoint.method(.patch)
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should redirect to /patch")
let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest })
session.request(endpoint).redirect(using: redirector).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNotNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url)
XCTAssertEqual(response?.response?.statusCode, 200)
}
@MainActor
func testThatSessionRedirectHandlerCanFollowRedirects() {
let session = Session(redirectHandler: Redirector.follow)
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should redirect to /get")
session.request(endpoint).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNotNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
XCTAssertEqual(response?.response?.statusCode, 200)
}
@MainActor
func testThatSessionRedirectHandlerCanNotFollowRedirects() {
let session = Session(redirectHandler: Redirector.doNotFollow)
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should NOT redirect to /get")
session.request(endpoint).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, endpoint.url)
XCTAssertEqual(response?.response?.statusCode, 302)
}
@MainActor
func testThatSessionRedirectHandlerCanModifyRedirects() {
let customRedirectEndpoint = Endpoint.method(.patch)
let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest })
let session = Session(redirectHandler: redirector)
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should redirect to /patch")
session.request(endpoint).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNotNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url)
XCTAssertEqual(response?.response?.statusCode, 200)
}
@MainActor
func testThatRequestRedirectHandlerIsPrioritizedOverSessionRedirectHandler() {
let session = Session(redirectHandler: Redirector.doNotFollow)
var response: DataResponse<Data?, AFError>?
let expectation = expectation(description: "Request should redirect to /get")
session.request(endpoint).redirect(using: Redirector.follow).response { resp in
response = resp
expectation.fulfill()
}
waitForExpectations(timeout: timeout)
XCTAssertNotNil(response?.request)
XCTAssertNotNil(response?.response)
XCTAssertNotNil(response?.data)
XCTAssertNil(response?.error)
XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
XCTAssertEqual(response?.response?.statusCode, 200)
}
}
final class StaticRedirectHandlerTests: BaseTestCase {
func takeRedirectHandler(_ handler: any RedirectHandler) {
_ = handler
}
func testThatFollowRedirectorCanBeCreatedStaticallyFromProtocol() {
takeRedirectHandler(.follow)
}
func testThatDoNotFollowRedirectorCanBeCreatedStaticallyFromProtocol() {
takeRedirectHandler(.doNotFollow)
}
func testThatModifyRedirectorCanBeCreatedStaticallyFromProtocol() {
takeRedirectHandler(.modify { _, _, _ in nil })
}
}