RedirectHandlerTests.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 redirectURLString: String { return "https://www.apple.com/" }
  30. private var urlString: String { return "https://httpbin.org/redirect-to?url=\(redirectURLString)" }
  31. // MARK: - Tests - Per Request
  32. func testThatRequestRedirectHandlerCanFollowRedirects() {
  33. // Given
  34. let session = Session()
  35. var response: DataResponse<Data?>?
  36. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  37. // When
  38. session.request(urlString).redirect(using: Redirector.follow).response { resp in
  39. response = resp
  40. expectation.fulfill()
  41. }
  42. waitForExpectations(timeout: timeout, handler: nil)
  43. // Then
  44. XCTAssertNotNil(response?.request)
  45. XCTAssertNotNil(response?.response)
  46. XCTAssertNotNil(response?.data)
  47. XCTAssertNil(response?.error)
  48. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  49. XCTAssertEqual(response?.response?.statusCode, 200)
  50. }
  51. func testThatRequestRedirectHandlerCanNotFollowRedirects() {
  52. // Given
  53. let session = Session()
  54. var response: DataResponse<Data?>?
  55. let expectation = self.expectation(description: "Request should NOT redirect to \(redirectURLString)")
  56. // When
  57. session.request(urlString).redirect(using: Redirector.doNotFollow).response { resp in
  58. response = resp
  59. expectation.fulfill()
  60. }
  61. waitForExpectations(timeout: timeout, handler: nil)
  62. // Then
  63. XCTAssertNotNil(response?.request)
  64. XCTAssertNotNil(response?.response)
  65. XCTAssertNil(response?.data)
  66. XCTAssertNil(response?.error)
  67. XCTAssertEqual(response?.response?.url?.absoluteString, urlString)
  68. XCTAssertEqual(response?.response?.statusCode, 302)
  69. }
  70. func testThatRequestRedirectHandlerCanModifyRedirects() {
  71. // Given
  72. let session = Session()
  73. let redirectURLString = "https://www.nike.com"
  74. let redirectURLRequest = URLRequest(url: URL(string: redirectURLString)!)
  75. var response: DataResponse<Data?>?
  76. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  77. // When
  78. let redirector = Redirector(behavior: .modify { _, _, _ in redirectURLRequest })
  79. session.request(urlString).redirect(using: redirector).response { resp in
  80. response = resp
  81. expectation.fulfill()
  82. }
  83. waitForExpectations(timeout: timeout, handler: nil)
  84. // Then
  85. XCTAssertNotNil(response?.request)
  86. XCTAssertNotNil(response?.response)
  87. XCTAssertNotNil(response?.data)
  88. XCTAssertNil(response?.error)
  89. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  90. XCTAssertEqual(response?.response?.statusCode, 200)
  91. }
  92. // MARK: - Tests - Per Session
  93. func testThatSessionRedirectHandlerCanFollowRedirects() {
  94. // Given
  95. let session = Session(redirectHandler: Redirector.follow)
  96. var response: DataResponse<Data?>?
  97. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  98. // When
  99. session.request(urlString).response { resp in
  100. response = resp
  101. expectation.fulfill()
  102. }
  103. waitForExpectations(timeout: timeout, handler: nil)
  104. // Then
  105. XCTAssertNotNil(response?.request)
  106. XCTAssertNotNil(response?.response)
  107. XCTAssertNotNil(response?.data)
  108. XCTAssertNil(response?.error)
  109. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  110. XCTAssertEqual(response?.response?.statusCode, 200)
  111. }
  112. func testThatSessionRedirectHandlerCanNotFollowRedirects() {
  113. // Given
  114. let session = Session(redirectHandler: Redirector.doNotFollow)
  115. var response: DataResponse<Data?>?
  116. let expectation = self.expectation(description: "Request should NOT redirect to \(redirectURLString)")
  117. // When
  118. session.request(urlString).response { resp in
  119. response = resp
  120. expectation.fulfill()
  121. }
  122. waitForExpectations(timeout: timeout, handler: nil)
  123. // Then
  124. XCTAssertNotNil(response?.request)
  125. XCTAssertNotNil(response?.response)
  126. XCTAssertNil(response?.data)
  127. XCTAssertNil(response?.error)
  128. XCTAssertEqual(response?.response?.url?.absoluteString, urlString)
  129. XCTAssertEqual(response?.response?.statusCode, 302)
  130. }
  131. func testThatSessionRedirectHandlerCanModifyRedirects() {
  132. // Given
  133. let redirectURLString = "https://www.nike.com"
  134. let redirectURLRequest = URLRequest(url: URL(string: redirectURLString)!)
  135. let redirector = Redirector(behavior: .modify { _, _, _ in redirectURLRequest })
  136. let session = Session(redirectHandler: redirector)
  137. var response: DataResponse<Data?>?
  138. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  139. // When
  140. session.request(urlString).response { resp in
  141. response = resp
  142. expectation.fulfill()
  143. }
  144. waitForExpectations(timeout: timeout, handler: nil)
  145. // Then
  146. XCTAssertNotNil(response?.request)
  147. XCTAssertNotNil(response?.response)
  148. XCTAssertNotNil(response?.data)
  149. XCTAssertNil(response?.error)
  150. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  151. XCTAssertEqual(response?.response?.statusCode, 200)
  152. }
  153. // MARK: - Tests - Per Request Prioritization
  154. func testThatRequestRedirectHandlerIsPrioritizedOverSessionRedirectHandler() {
  155. // Given
  156. let session = Session(redirectHandler: Redirector.doNotFollow)
  157. var response: DataResponse<Data?>?
  158. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  159. // When
  160. session.request(urlString).redirect(using: Redirector.follow).response { resp in
  161. response = resp
  162. expectation.fulfill()
  163. }
  164. waitForExpectations(timeout: timeout, handler: nil)
  165. // Then
  166. XCTAssertNotNil(response?.request)
  167. XCTAssertNotNil(response?.response)
  168. XCTAssertNotNil(response?.data)
  169. XCTAssertNil(response?.error)
  170. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  171. XCTAssertEqual(response?.response?.statusCode, 200)
  172. }
  173. }