RedirectHandlerTests.swift 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. //
  2. // RedirectHandlerTests.swift
  3. //
  4. // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import Foundation
  26. import XCTest
  27. final class RedirectHandlerTestCase: BaseTestCase {
  28. // MARK: - Properties
  29. private var redirectEndpoint: Endpoint { .get }
  30. private var endpoint: Endpoint { .redirectTo(redirectEndpoint) }
  31. // MARK: - Tests - Per Request
  32. func testThatRequestRedirectHandlerCanFollowRedirects() {
  33. // Given
  34. let session = Session()
  35. var response: DataResponse<Data?, AFError>?
  36. let expectation = self.expectation(description: "Request should redirect to /get")
  37. // When
  38. session.request(endpoint).redirect(using: Redirector.follow).response { resp in
  39. response = resp
  40. expectation.fulfill()
  41. }
  42. waitForExpectations(timeout: timeout)
  43. // Then
  44. XCTAssertNotNil(response?.request)
  45. XCTAssertNotNil(response?.response)
  46. XCTAssertNotNil(response?.data)
  47. XCTAssertNil(response?.error)
  48. XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
  49. XCTAssertEqual(response?.response?.statusCode, 200)
  50. }
  51. func testThatRequestRedirectHandlerCanNotFollowRedirects() {
  52. // Given
  53. let session = Session()
  54. var response: DataResponse<Data?, AFError>?
  55. let expectation = self.expectation(description: "Request should NOT redirect to /get")
  56. // When
  57. session.request(endpoint).redirect(using: Redirector.doNotFollow).response { resp in
  58. response = resp
  59. expectation.fulfill()
  60. }
  61. waitForExpectations(timeout: timeout)
  62. // Then
  63. XCTAssertNotNil(response?.request)
  64. XCTAssertNotNil(response?.response)
  65. XCTAssertNil(response?.data)
  66. XCTAssertNil(response?.error)
  67. XCTAssertEqual(response?.response?.url, endpoint.url)
  68. XCTAssertEqual(response?.response?.statusCode, 302)
  69. }
  70. func testThatRequestRedirectHandlerCanModifyRedirects() {
  71. // Given
  72. let session = Session()
  73. let customRedirectEndpoint = Endpoint.method(.patch)
  74. var response: DataResponse<Data?, AFError>?
  75. let expectation = self.expectation(description: "Request should redirect to /patch")
  76. // When
  77. let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest })
  78. session.request(endpoint).redirect(using: redirector).response { resp in
  79. response = resp
  80. expectation.fulfill()
  81. }
  82. waitForExpectations(timeout: timeout)
  83. // Then
  84. XCTAssertNotNil(response?.request)
  85. XCTAssertNotNil(response?.response)
  86. XCTAssertNotNil(response?.data)
  87. XCTAssertNil(response?.error)
  88. XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url)
  89. XCTAssertEqual(response?.response?.statusCode, 200)
  90. }
  91. // MARK: - Tests - Per Session
  92. func testThatSessionRedirectHandlerCanFollowRedirects() {
  93. // Given
  94. let session = Session(redirectHandler: Redirector.follow)
  95. var response: DataResponse<Data?, AFError>?
  96. let expectation = self.expectation(description: "Request should redirect to /get")
  97. // When
  98. session.request(endpoint).response { resp in
  99. response = resp
  100. expectation.fulfill()
  101. }
  102. waitForExpectations(timeout: timeout)
  103. // Then
  104. XCTAssertNotNil(response?.request)
  105. XCTAssertNotNil(response?.response)
  106. XCTAssertNotNil(response?.data)
  107. XCTAssertNil(response?.error)
  108. XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
  109. XCTAssertEqual(response?.response?.statusCode, 200)
  110. }
  111. func testThatSessionRedirectHandlerCanNotFollowRedirects() {
  112. // Given
  113. let session = Session(redirectHandler: Redirector.doNotFollow)
  114. var response: DataResponse<Data?, AFError>?
  115. let expectation = self.expectation(description: "Request should NOT redirect to /get")
  116. // When
  117. session.request(endpoint).response { resp in
  118. response = resp
  119. expectation.fulfill()
  120. }
  121. waitForExpectations(timeout: timeout)
  122. // Then
  123. XCTAssertNotNil(response?.request)
  124. XCTAssertNotNil(response?.response)
  125. XCTAssertNil(response?.data)
  126. XCTAssertNil(response?.error)
  127. XCTAssertEqual(response?.response?.url, endpoint.url)
  128. XCTAssertEqual(response?.response?.statusCode, 302)
  129. }
  130. func testThatSessionRedirectHandlerCanModifyRedirects() {
  131. // Given
  132. let customRedirectEndpoint = Endpoint.method(.patch)
  133. let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest })
  134. let session = Session(redirectHandler: redirector)
  135. var response: DataResponse<Data?, AFError>?
  136. let expectation = self.expectation(description: "Request should redirect to /patch")
  137. // When
  138. session.request(endpoint).response { resp in
  139. response = resp
  140. expectation.fulfill()
  141. }
  142. waitForExpectations(timeout: timeout)
  143. // Then
  144. XCTAssertNotNil(response?.request)
  145. XCTAssertNotNil(response?.response)
  146. XCTAssertNotNil(response?.data)
  147. XCTAssertNil(response?.error)
  148. XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url)
  149. XCTAssertEqual(response?.response?.statusCode, 200)
  150. }
  151. // MARK: - Tests - Per Request Prioritization
  152. func testThatRequestRedirectHandlerIsPrioritizedOverSessionRedirectHandler() {
  153. // Given
  154. let session = Session(redirectHandler: Redirector.doNotFollow)
  155. var response: DataResponse<Data?, AFError>?
  156. let expectation = self.expectation(description: "Request should redirect to /get")
  157. // When
  158. session.request(endpoint).redirect(using: Redirector.follow).response { resp in
  159. response = resp
  160. expectation.fulfill()
  161. }
  162. waitForExpectations(timeout: timeout)
  163. // Then
  164. XCTAssertNotNil(response?.request)
  165. XCTAssertNotNil(response?.response)
  166. XCTAssertNotNil(response?.data)
  167. XCTAssertNil(response?.error)
  168. XCTAssertEqual(response?.response?.url, redirectEndpoint.url)
  169. XCTAssertEqual(response?.response?.statusCode, 200)
  170. }
  171. }
  172. #if swift(>=5.5)
  173. final class StaticRedirectHandlerTests: BaseTestCase {
  174. func takeRedirectHandler(_ handler: RedirectHandler) {
  175. _ = handler
  176. }
  177. func testThatFollowRedirectorCanBeCreatedStaticallyFromProtocol() {
  178. // Given, When, Then
  179. takeRedirectHandler(.follow)
  180. }
  181. func testThatDoNotFollowRedirectorCanBeCreatedStaticallyFromProtocol() {
  182. // Given, When, Then
  183. takeRedirectHandler(.doNotFollow)
  184. }
  185. func testThatModifyRedirectorCanBeCreatedStaticallyFromProtocol() {
  186. // Given, When, Then
  187. takeRedirectHandler(.modify { _, _, _ in nil })
  188. }
  189. }
  190. #endif