ManagerTests.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. //
  2. // ManagerTests.swift
  3. //
  4. // Copyright (c) 2014-2016 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. class ManagerTestCase: BaseTestCase {
  28. // MARK: Initialization Tests
  29. func testInitializerWithDefaultArguments() {
  30. // Given, When
  31. let manager = Manager()
  32. // Then
  33. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  34. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  35. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  36. }
  37. func testInitializerWithSpecifiedArguments() {
  38. // Given
  39. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  40. let delegate = Manager.SessionDelegate()
  41. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  42. // When
  43. let manager = Manager(
  44. configuration: configuration,
  45. delegate: delegate,
  46. serverTrustPolicyManager: serverTrustPolicyManager
  47. )
  48. // Then
  49. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  50. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  51. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  52. }
  53. func testThatFailableInitializerSucceedsWithDefaultArguments() {
  54. // Given
  55. let delegate = Manager.SessionDelegate()
  56. let session: NSURLSession = {
  57. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  58. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  59. }()
  60. // When
  61. let manager = Manager(session: session, delegate: delegate)
  62. // Then
  63. if let manager = manager {
  64. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  65. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  66. } else {
  67. XCTFail("manager should not be nil")
  68. }
  69. }
  70. func testThatFailableInitializerSucceedsWithSpecifiedArguments() {
  71. // Given
  72. let delegate = Manager.SessionDelegate()
  73. let session: NSURLSession = {
  74. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  75. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  76. }()
  77. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  78. // When
  79. let manager = Manager(session: session, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
  80. // Then
  81. if let manager = manager {
  82. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  83. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  84. } else {
  85. XCTFail("manager should not be nil")
  86. }
  87. }
  88. func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() {
  89. // Given
  90. let delegate = Manager.SessionDelegate()
  91. let session: NSURLSession = {
  92. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  93. return NSURLSession(configuration: configuration, delegate: Manager.SessionDelegate(), delegateQueue: nil)
  94. }()
  95. // When
  96. let manager = Manager(session: session, delegate: delegate)
  97. // Then
  98. XCTAssertNil(manager, "manager should be nil")
  99. }
  100. func testThatFailableInitializerFailsWhenSessionDelegateIsNil() {
  101. // Given
  102. let delegate = Manager.SessionDelegate()
  103. let session: NSURLSession = {
  104. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  105. return NSURLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  106. }()
  107. // When
  108. let manager = Manager(session: session, delegate: delegate)
  109. // Then
  110. XCTAssertNil(manager, "manager should be nil")
  111. }
  112. // MARK: Start Requests Immediately Tests
  113. func testSetStartRequestsImmediatelyToFalseAndResumeRequest() {
  114. // Given
  115. let manager = Alamofire.Manager()
  116. manager.startRequestsImmediately = false
  117. let URL = NSURL(string: "https://httpbin.org/get")!
  118. let URLRequest = NSURLRequest(URL: URL)
  119. let expectation = expectationWithDescription("\(URL)")
  120. var response: NSHTTPURLResponse?
  121. // When
  122. manager.request(URLRequest)
  123. .response { _, responseResponse, _, _ in
  124. response = responseResponse
  125. expectation.fulfill()
  126. }
  127. .resume()
  128. waitForExpectationsWithTimeout(timeout, handler: nil)
  129. // Then
  130. XCTAssertNotNil(response, "response should not be nil")
  131. XCTAssertTrue(response?.statusCode == 200, "response status code should be 200")
  132. }
  133. // MARK: Deinitialization Tests
  134. func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() {
  135. // Given
  136. var manager: Manager? = Alamofire.Manager()
  137. manager?.startRequestsImmediately = false
  138. let URL = NSURL(string: "https://httpbin.org/get")!
  139. let URLRequest = NSURLRequest(URL: URL)
  140. // When
  141. let request = manager?.request(URLRequest)
  142. manager = nil
  143. // Then
  144. XCTAssertTrue(request?.task.state == .Suspended, "request task state should be '.Suspended'")
  145. XCTAssertNil(manager, "manager should be nil")
  146. }
  147. func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() {
  148. // Given
  149. var manager: Manager? = Alamofire.Manager()
  150. manager!.startRequestsImmediately = false
  151. let URL = NSURL(string: "https://httpbin.org/get")!
  152. let URLRequest = NSURLRequest(URL: URL)
  153. // When
  154. let request = manager!.request(URLRequest)
  155. request.cancel()
  156. manager = nil
  157. // Then
  158. let state = request.task.state
  159. XCTAssertTrue(state == .Canceling || state == .Completed, "state should be .Canceling or .Completed")
  160. XCTAssertNil(manager, "manager should be nil")
  161. }
  162. }
  163. // MARK: -
  164. class ManagerConfigurationHeadersTestCase: BaseTestCase {
  165. enum ConfigurationType {
  166. case Default, Ephemeral, Background
  167. }
  168. func testThatDefaultConfigurationHeadersAreSentWithRequest() {
  169. // Given, When, Then
  170. executeAuthorizationHeaderTestForConfigurationType(.Default)
  171. }
  172. func testThatEphemeralConfigurationHeadersAreSentWithRequest() {
  173. // Given, When, Then
  174. executeAuthorizationHeaderTestForConfigurationType(.Ephemeral)
  175. }
  176. func testThatBackgroundConfigurationHeadersAreSentWithRequest() {
  177. // Given, When, Then
  178. executeAuthorizationHeaderTestForConfigurationType(.Background)
  179. }
  180. private func executeAuthorizationHeaderTestForConfigurationType(type: ConfigurationType) {
  181. // Given
  182. let manager: Manager = {
  183. let configuration: NSURLSessionConfiguration = {
  184. let configuration: NSURLSessionConfiguration
  185. switch type {
  186. case .Default:
  187. configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  188. case .Ephemeral:
  189. configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
  190. case .Background:
  191. let identifier = "com.alamofire.test.manager-configuration-tests"
  192. configuration = NSURLSessionConfiguration.backgroundSessionConfigurationForAllPlatformsWithIdentifier(identifier)
  193. }
  194. var headers = Alamofire.Manager.defaultHTTPHeaders
  195. headers["Authorization"] = "Bearer 123456"
  196. configuration.HTTPAdditionalHeaders = headers
  197. return configuration
  198. }()
  199. return Manager(configuration: configuration)
  200. }()
  201. let expectation = expectationWithDescription("request should complete successfully")
  202. var response: Response<AnyObject, NSError>?
  203. // When
  204. manager.request(.GET, "https://httpbin.org/headers")
  205. .responseJSON { closureResponse in
  206. response = closureResponse
  207. expectation.fulfill()
  208. }
  209. waitForExpectationsWithTimeout(timeout, handler: nil)
  210. // Then
  211. if let response = response {
  212. XCTAssertNotNil(response.request, "request should not be nil")
  213. XCTAssertNotNil(response.response, "response should not be nil")
  214. XCTAssertNotNil(response.data, "data should not be nil")
  215. XCTAssertTrue(response.result.isSuccess, "result should be a success")
  216. if let
  217. headers = response.result.value?["headers" as NSString] as? [String: String],
  218. authorization = headers["Authorization"]
  219. {
  220. XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match")
  221. } else {
  222. XCTFail("failed to extract authorization header value")
  223. }
  224. } else {
  225. XCTFail("response should not be nil")
  226. }
  227. }
  228. }