SessionDelegateTests.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. //
  2. // SessionDelegateTests.swift
  3. //
  4. // Copyright (c) 2014-2020 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. @testable import Alamofire
  25. import Foundation
  26. import XCTest
  27. final class SessionDelegateTestCase: BaseTestCase {
  28. // MARK: - Tests - Redirects
  29. func testThatRequestWillPerformHTTPRedirectionByDefault() {
  30. // Given
  31. let session = Session(configuration: .ephemeral)
  32. let redirectURLString = Endpoint().url.absoluteString
  33. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  34. var response: DataResponse<Data?, AFError>?
  35. // When
  36. session.request(.redirectTo(redirectURLString))
  37. .response { resp in
  38. response = resp
  39. expectation.fulfill()
  40. }
  41. waitForExpectations(timeout: timeout)
  42. // Then
  43. XCTAssertNotNil(response?.request)
  44. XCTAssertNotNil(response?.response)
  45. XCTAssertNotNil(response?.data)
  46. XCTAssertNil(response?.error)
  47. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  48. XCTAssertEqual(response?.response?.statusCode, 200)
  49. }
  50. func testThatRequestWillPerformRedirectionMultipleTimesByDefault() {
  51. // Given
  52. let session = Session(configuration: .ephemeral)
  53. let expectation = self.expectation(description: "Request should redirect")
  54. var response: DataResponse<Data?, AFError>?
  55. // When
  56. session.request(.redirect(5))
  57. .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. XCTAssertNotNil(response?.data)
  66. XCTAssertNil(response?.error)
  67. XCTAssertEqual(response?.response?.statusCode, 200)
  68. }
  69. func testThatRequestWillPerformRedirectionFor307Response() {
  70. // Given
  71. let session = Session(configuration: .ephemeral)
  72. let redirectURLString = Endpoint().url.absoluteString
  73. let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)")
  74. var response: DataResponse<Data?, AFError>?
  75. // When
  76. session.request(.redirectTo(redirectURLString, code: 307))
  77. .response { resp in
  78. response = resp
  79. expectation.fulfill()
  80. }
  81. waitForExpectations(timeout: timeout)
  82. // Then
  83. XCTAssertNotNil(response?.request)
  84. XCTAssertNotNil(response?.response)
  85. XCTAssertNotNil(response?.data)
  86. XCTAssertNil(response?.error)
  87. XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString)
  88. XCTAssertEqual(response?.response?.statusCode, 200)
  89. }
  90. // MARK: - Tests - Notification
  91. func testThatAppropriateNotificationsAreCalledWithRequestForDataRequest() {
  92. // Given
  93. let session = Session(startRequestsImmediately: false)
  94. var resumedRequest: Request?
  95. var resumedTaskRequest: Request?
  96. var completedTaskRequest: Request?
  97. var completedRequest: Request?
  98. var requestResponse: DataResponse<Data?, AFError>?
  99. let expect = expectation(description: "request should complete")
  100. // When
  101. let request = session.request(.default).response { response in
  102. requestResponse = response
  103. expect.fulfill()
  104. }
  105. expectation(forNotification: Request.didResumeNotification, object: nil) { notification in
  106. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  107. resumedRequest = notification.request
  108. return true
  109. }
  110. expectation(forNotification: Request.didResumeTaskNotification, object: nil) { notification in
  111. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  112. resumedTaskRequest = notification.request
  113. return true
  114. }
  115. expectation(forNotification: Request.didCompleteTaskNotification, object: nil) { notification in
  116. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  117. completedTaskRequest = notification.request
  118. return true
  119. }
  120. expectation(forNotification: Request.didFinishNotification, object: nil) { notification in
  121. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  122. completedRequest = notification.request
  123. return true
  124. }
  125. request.resume()
  126. waitForExpectations(timeout: timeout)
  127. // Then
  128. XCTAssertNotNil(resumedRequest)
  129. XCTAssertNotNil(resumedTaskRequest)
  130. XCTAssertNotNil(completedTaskRequest)
  131. XCTAssertNotNil(completedRequest)
  132. XCTAssertEqual(resumedRequest, completedRequest)
  133. XCTAssertEqual(resumedTaskRequest, completedTaskRequest)
  134. XCTAssertEqual(requestResponse?.response?.statusCode, 200)
  135. }
  136. func testThatDidCompleteNotificationIsCalledWithRequestForDownloadRequests() {
  137. // Given
  138. let session = Session(startRequestsImmediately: false)
  139. var resumedRequest: Request?
  140. var resumedTaskRequest: Request?
  141. var completedTaskRequest: Request?
  142. var completedRequest: Request?
  143. var requestResponse: DownloadResponse<URL?, AFError>?
  144. let expect = expectation(description: "request should complete")
  145. // When
  146. let request = session.download(.default).response { response in
  147. requestResponse = response
  148. expect.fulfill()
  149. }
  150. expectation(forNotification: Request.didResumeNotification, object: nil) { notification in
  151. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  152. resumedRequest = notification.request
  153. return true
  154. }
  155. expectation(forNotification: Request.didResumeTaskNotification, object: nil) { notification in
  156. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  157. resumedTaskRequest = notification.request
  158. return true
  159. }
  160. expectation(forNotification: Request.didCompleteTaskNotification, object: nil) { notification in
  161. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  162. completedTaskRequest = notification.request
  163. return true
  164. }
  165. expectation(forNotification: Request.didFinishNotification, object: nil) { notification in
  166. guard let receivedRequest = notification.request, receivedRequest == request else { return false }
  167. completedRequest = notification.request
  168. return true
  169. }
  170. request.resume()
  171. waitForExpectations(timeout: timeout)
  172. // Then
  173. XCTAssertNotNil(resumedRequest)
  174. XCTAssertNotNil(resumedTaskRequest)
  175. XCTAssertNotNil(completedTaskRequest)
  176. XCTAssertNotNil(completedRequest)
  177. XCTAssertEqual(resumedRequest, completedRequest)
  178. XCTAssertEqual(resumedTaskRequest, completedTaskRequest)
  179. XCTAssertEqual(requestResponse?.response?.statusCode, 200)
  180. }
  181. }