ResponseTests.swift 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. //
  2. // ResponseTests.swift
  3. //
  4. // Copyright (c) 2014-2017 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. class ResponseTestCase: BaseTestCase {
  28. func testThatResponseReturnsSuccessResultWithValidData() {
  29. // Given
  30. let urlString = "https://httpbin.org/get"
  31. let expectation = self.expectation(description: "request should succeed")
  32. var response: DefaultDataResponse?
  33. // When
  34. Alamofire.request(urlString, parameters: ["foo": "bar"]).response { resp in
  35. response = resp
  36. expectation.fulfill()
  37. }
  38. waitForExpectations(timeout: timeout, handler: nil)
  39. // Then
  40. XCTAssertNotNil(response?.request)
  41. XCTAssertNotNil(response?.response)
  42. XCTAssertNotNil(response?.data)
  43. XCTAssertNil(response?.error)
  44. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  45. XCTAssertNotNil(response?.metrics)
  46. }
  47. }
  48. func testThatResponseReturnsFailureResultWithOptionalDataAndError() {
  49. // Given
  50. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  51. let expectation = self.expectation(description: "request should fail with 404")
  52. var response: DefaultDataResponse?
  53. // When
  54. Alamofire.request(urlString, parameters: ["foo": "bar"]).response { resp in
  55. response = resp
  56. expectation.fulfill()
  57. }
  58. waitForExpectations(timeout: timeout, handler: nil)
  59. // Then
  60. XCTAssertNotNil(response?.request)
  61. XCTAssertNil(response?.response)
  62. XCTAssertNotNil(response?.data)
  63. XCTAssertNotNil(response?.error)
  64. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  65. XCTAssertNotNil(response?.metrics)
  66. }
  67. }
  68. }
  69. // MARK: -
  70. class ResponseDataTestCase: BaseTestCase {
  71. func testThatResponseDataReturnsSuccessResultWithValidData() {
  72. // Given
  73. let urlString = "https://httpbin.org/get"
  74. let expectation = self.expectation(description: "request should succeed")
  75. var response: DataResponse<Data>?
  76. // When
  77. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseData { resp in
  78. response = resp
  79. expectation.fulfill()
  80. }
  81. waitForExpectations(timeout: timeout, handler: nil)
  82. // Then
  83. XCTAssertNotNil(response?.request)
  84. XCTAssertNotNil(response?.response)
  85. XCTAssertNotNil(response?.data)
  86. XCTAssertNotNil(response?.data)
  87. XCTAssertEqual(response?.result.isSuccess, true)
  88. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  89. XCTAssertNotNil(response?.metrics)
  90. }
  91. }
  92. func testThatResponseDataReturnsFailureResultWithOptionalDataAndError() {
  93. // Given
  94. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  95. let expectation = self.expectation(description: "request should fail with 404")
  96. var response: DataResponse<Data>?
  97. // When
  98. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseData { resp in
  99. response = resp
  100. expectation.fulfill()
  101. }
  102. waitForExpectations(timeout: timeout, handler: nil)
  103. // Then
  104. XCTAssertNotNil(response?.request)
  105. XCTAssertNil(response?.response)
  106. XCTAssertNotNil(response?.data)
  107. XCTAssertEqual(response?.result.isFailure, true)
  108. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  109. XCTAssertNotNil(response?.metrics)
  110. }
  111. }
  112. }
  113. // MARK: -
  114. class ResponseStringTestCase: BaseTestCase {
  115. func testThatResponseStringReturnsSuccessResultWithValidString() {
  116. // Given
  117. let urlString = "https://httpbin.org/get"
  118. let expectation = self.expectation(description: "request should succeed")
  119. var response: DataResponse<String>?
  120. // When
  121. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseString { resp in
  122. response = resp
  123. expectation.fulfill()
  124. }
  125. waitForExpectations(timeout: timeout, handler: nil)
  126. // Then
  127. XCTAssertNotNil(response?.request)
  128. XCTAssertNotNil(response?.response)
  129. XCTAssertNotNil(response?.data)
  130. XCTAssertNotNil(response?.data)
  131. XCTAssertEqual(response?.result.isSuccess, true)
  132. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  133. XCTAssertNotNil(response?.metrics)
  134. }
  135. }
  136. func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() {
  137. // Given
  138. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  139. let expectation = self.expectation(description: "request should fail with 404")
  140. var response: DataResponse<String>?
  141. // When
  142. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseString { resp in
  143. response = resp
  144. expectation.fulfill()
  145. }
  146. waitForExpectations(timeout: timeout, handler: nil)
  147. // Then
  148. XCTAssertNotNil(response?.request)
  149. XCTAssertNil(response?.response)
  150. XCTAssertNotNil(response?.data)
  151. XCTAssertEqual(response?.result.isFailure, true)
  152. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  153. XCTAssertNotNil(response?.metrics)
  154. }
  155. }
  156. }
  157. // MARK: -
  158. class ResponseJSONTestCase: BaseTestCase {
  159. func testThatResponseJSONReturnsSuccessResultWithValidJSON() {
  160. // Given
  161. let urlString = "https://httpbin.org/get"
  162. let expectation = self.expectation(description: "request should succeed")
  163. var response: DataResponse<Any>?
  164. // When
  165. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in
  166. response = resp
  167. expectation.fulfill()
  168. }
  169. waitForExpectations(timeout: timeout, handler: nil)
  170. // Then
  171. XCTAssertNotNil(response?.request)
  172. XCTAssertNotNil(response?.response)
  173. XCTAssertNotNil(response?.data)
  174. XCTAssertNotNil(response?.data)
  175. XCTAssertEqual(response?.result.isSuccess, true)
  176. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  177. XCTAssertNotNil(response?.metrics)
  178. }
  179. }
  180. func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() {
  181. // Given
  182. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  183. let expectation = self.expectation(description: "request should fail")
  184. var response: DataResponse<Any>?
  185. // When
  186. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in
  187. response = resp
  188. expectation.fulfill()
  189. }
  190. waitForExpectations(timeout: timeout, handler: nil)
  191. // Then
  192. XCTAssertNotNil(response?.request)
  193. XCTAssertNil(response?.response)
  194. XCTAssertNotNil(response?.data)
  195. XCTAssertEqual(response?.result.isFailure, true)
  196. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  197. XCTAssertNotNil(response?.metrics)
  198. }
  199. }
  200. func testThatResponseJSONReturnsSuccessResultForGETRequest() {
  201. // Given
  202. let urlString = "https://httpbin.org/get"
  203. let expectation = self.expectation(description: "request should succeed")
  204. var response: DataResponse<Any>?
  205. // When
  206. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in
  207. response = resp
  208. expectation.fulfill()
  209. }
  210. waitForExpectations(timeout: timeout, handler: nil)
  211. // Then
  212. XCTAssertNotNil(response?.request)
  213. XCTAssertNotNil(response?.response)
  214. XCTAssertNotNil(response?.data)
  215. XCTAssertNotNil(response?.data)
  216. XCTAssertEqual(response?.result.isSuccess, true)
  217. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *) {
  218. XCTAssertNotNil(response?.metrics)
  219. }
  220. if
  221. let responseDictionary = response?.result.value as? [String: Any],
  222. let args = responseDictionary["args"] as? [String: String]
  223. {
  224. XCTAssertEqual(args, ["foo": "bar"], "args should match parameters")
  225. } else {
  226. XCTFail("args should not be nil")
  227. }
  228. }
  229. func testThatResponseJSONReturnsSuccessResultForPOSTRequest() {
  230. // Given
  231. let urlString = "https://httpbin.org/post"
  232. let expectation = self.expectation(description: "request should succeed")
  233. var response: DataResponse<Any>?
  234. // When
  235. Alamofire.request(urlString, method: .post, parameters: ["foo": "bar"]).responseJSON { resp in
  236. response = resp
  237. expectation.fulfill()
  238. }
  239. waitForExpectations(timeout: timeout, handler: nil)
  240. // Then
  241. XCTAssertNotNil(response?.request)
  242. XCTAssertNotNil(response?.response)
  243. XCTAssertNotNil(response?.data)
  244. XCTAssertNotNil(response?.data)
  245. XCTAssertEqual(response?.result.isSuccess, true)
  246. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  247. XCTAssertNotNil(response?.metrics)
  248. }
  249. if
  250. let responseDictionary = response?.result.value as? [String: Any],
  251. let form = responseDictionary["form"] as? [String: String]
  252. {
  253. XCTAssertEqual(form, ["foo": "bar"], "form should match parameters")
  254. } else {
  255. XCTFail("form should not be nil")
  256. }
  257. }
  258. }
  259. class ResponseJSONDecodableTestCase: BaseTestCase {
  260. struct HTTPBinResponse: Decodable {
  261. let headers: [String: String]
  262. let origin: String
  263. let url: String
  264. }
  265. func testThatResponseJSONReturnsSuccessResultWithValidJSON() {
  266. // Given
  267. let urlString = "https://httpbin.org/get"
  268. let expectation = self.expectation(description: "request should succeed")
  269. var response: DataResponse<HTTPBinResponse>?
  270. // When
  271. Alamofire.request(urlString, parameters: [:]).responseJSONDecodable { (resp: DataResponse<HTTPBinResponse>) in
  272. response = resp
  273. expectation.fulfill()
  274. }
  275. waitForExpectations(timeout: timeout, handler: nil)
  276. // Then
  277. XCTAssertNotNil(response?.request)
  278. XCTAssertNotNil(response?.response)
  279. XCTAssertNotNil(response?.data)
  280. XCTAssertEqual(response?.result.isSuccess, true)
  281. XCTAssertEqual(response?.result.value?.url, "https://httpbin.org/get")
  282. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  283. XCTAssertNotNil(response?.metrics)
  284. }
  285. }
  286. func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() {
  287. // Given
  288. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  289. let expectation = self.expectation(description: "request should fail")
  290. var response: DataResponse<HTTPBinResponse>?
  291. // When
  292. Alamofire.request(urlString, parameters: [:]).responseJSONDecodable { (resp: DataResponse<HTTPBinResponse>) in
  293. response = resp
  294. expectation.fulfill()
  295. }
  296. waitForExpectations(timeout: timeout, handler: nil)
  297. // Then
  298. XCTAssertNotNil(response?.request)
  299. XCTAssertNil(response?.response)
  300. XCTAssertNotNil(response?.data)
  301. XCTAssertEqual(response?.result.isFailure, true)
  302. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  303. XCTAssertNotNil(response?.metrics)
  304. }
  305. }
  306. }
  307. // MARK: -
  308. class ResponseMapTestCase: BaseTestCase {
  309. func testThatMapTransformsSuccessValue() {
  310. // Given
  311. let urlString = "https://httpbin.org/get"
  312. let expectation = self.expectation(description: "request should succeed")
  313. var response: DataResponse<String>?
  314. // When
  315. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in
  316. response = resp.map { json in
  317. // json["args"]["foo"] is "bar": use this invariant to test the map function
  318. return ((json as? [String: Any])?["args"] as? [String: Any])?["foo"] as? String ?? "invalid"
  319. }
  320. expectation.fulfill()
  321. }
  322. waitForExpectations(timeout: timeout, handler: nil)
  323. // Then
  324. XCTAssertNotNil(response?.request)
  325. XCTAssertNotNil(response?.response)
  326. XCTAssertNotNil(response?.data)
  327. XCTAssertEqual(response?.result.isSuccess, true)
  328. XCTAssertEqual(response?.result.value, "bar")
  329. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  330. XCTAssertNotNil(response?.metrics)
  331. }
  332. }
  333. func testThatMapPreservesFailureError() {
  334. // Given
  335. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  336. let expectation = self.expectation(description: "request should fail with 404")
  337. var response: DataResponse<String>?
  338. // When
  339. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseData { resp in
  340. response = resp.map { _ in "ignored" }
  341. expectation.fulfill()
  342. }
  343. waitForExpectations(timeout: timeout, handler: nil)
  344. // Then
  345. XCTAssertNotNil(response?.request)
  346. XCTAssertNil(response?.response)
  347. XCTAssertNotNil(response?.data)
  348. XCTAssertEqual(response?.result.isFailure, true)
  349. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  350. XCTAssertNotNil(response?.metrics)
  351. }
  352. }
  353. }
  354. // MARK: -
  355. class ResponseFlatMapTestCase: BaseTestCase {
  356. func testThatFlatMapTransformsSuccessValue() {
  357. // Given
  358. let urlString = "https://httpbin.org/get"
  359. let expectation = self.expectation(description: "request should succeed")
  360. var response: DataResponse<String>?
  361. // When
  362. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in
  363. response = resp.flatMap { json in
  364. // json["args"]["foo"] is "bar": use this invariant to test the flatMap function
  365. return ((json as? [String: Any])?["args"] as? [String: Any])?["foo"] as? String ?? "invalid"
  366. }
  367. expectation.fulfill()
  368. }
  369. waitForExpectations(timeout: timeout, handler: nil)
  370. // Then
  371. XCTAssertNotNil(response?.request)
  372. XCTAssertNotNil(response?.response)
  373. XCTAssertNotNil(response?.data)
  374. XCTAssertEqual(response?.result.isSuccess, true)
  375. XCTAssertEqual(response?.result.value, "bar")
  376. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  377. XCTAssertNotNil(response?.metrics)
  378. }
  379. }
  380. func testThatFlatMapCatchesTransformationError() {
  381. // Given
  382. struct TransformError: Error {}
  383. let urlString = "https://httpbin.org/get"
  384. let expectation = self.expectation(description: "request should succeed")
  385. var response: DataResponse<String>?
  386. // When
  387. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseData { resp in
  388. response = resp.flatMap { json in
  389. throw TransformError()
  390. }
  391. expectation.fulfill()
  392. }
  393. waitForExpectations(timeout: timeout, handler: nil)
  394. // Then
  395. XCTAssertNotNil(response?.request)
  396. XCTAssertNotNil(response?.response)
  397. XCTAssertNotNil(response?.data)
  398. XCTAssertEqual(response?.result.isFailure, true)
  399. if let error = response?.result.error {
  400. XCTAssertTrue(error is TransformError)
  401. } else {
  402. XCTFail("flatMap should catch the transformation error")
  403. }
  404. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  405. XCTAssertNotNil(response?.metrics)
  406. }
  407. }
  408. func testThatFlatMapPreservesFailureError() {
  409. // Given
  410. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  411. let expectation = self.expectation(description: "request should fail with 404")
  412. var response: DataResponse<String>?
  413. // When
  414. Alamofire.request(urlString, parameters: ["foo": "bar"]).responseData { resp in
  415. response = resp.flatMap { _ in "ignored" }
  416. expectation.fulfill()
  417. }
  418. waitForExpectations(timeout: timeout, handler: nil)
  419. // Then
  420. XCTAssertNotNil(response?.request)
  421. XCTAssertNil(response?.response)
  422. XCTAssertNotNil(response?.data)
  423. XCTAssertEqual(response?.result.isFailure, true)
  424. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  425. XCTAssertNotNil(response?.metrics)
  426. }
  427. }
  428. }
  429. // MARK: -
  430. enum TestError: Error {
  431. case error(error: Error)
  432. }
  433. enum TransformationError: Error {
  434. case error
  435. func alwaysFails() throws -> TestError {
  436. throw TransformationError.error
  437. }
  438. }
  439. class ResponseMapErrorTestCase: BaseTestCase {
  440. func testThatMapErrorTransformsFailureValue() {
  441. // Given
  442. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  443. let expectation = self.expectation(description: "request should not succeed")
  444. var response: DataResponse<Any>?
  445. // When
  446. Alamofire.request(urlString).responseJSON { resp in
  447. response = resp.mapError { error in
  448. return TestError.error(error: error)
  449. }
  450. expectation.fulfill()
  451. }
  452. waitForExpectations(timeout: timeout, handler: nil)
  453. // Then
  454. XCTAssertNotNil(response?.request)
  455. XCTAssertNil(response?.response)
  456. XCTAssertNotNil(response?.data)
  457. XCTAssertEqual(response?.result.isFailure, true)
  458. guard let error = response?.error as? TestError, case .error = error else { XCTFail(); return }
  459. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  460. XCTAssertNotNil(response?.metrics)
  461. }
  462. }
  463. func testThatMapErrorPreservesSuccessValue() {
  464. // Given
  465. let urlString = "https://httpbin.org/get"
  466. let expectation = self.expectation(description: "request should succeed")
  467. var response: DataResponse<Data>?
  468. // When
  469. Alamofire.request(urlString).responseData { resp in
  470. response = resp.mapError { TestError.error(error: $0) }
  471. expectation.fulfill()
  472. }
  473. waitForExpectations(timeout: timeout, handler: nil)
  474. // Then
  475. XCTAssertNotNil(response?.request)
  476. XCTAssertNotNil(response?.response)
  477. XCTAssertNotNil(response?.data)
  478. XCTAssertEqual(response?.result.isSuccess, true)
  479. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  480. XCTAssertNotNil(response?.metrics)
  481. }
  482. }
  483. }
  484. // MARK: -
  485. class ResponseFlatMapErrorTestCase: BaseTestCase {
  486. func testThatFlatMapErrorPreservesSuccessValue() {
  487. // Given
  488. let urlString = "https://httpbin.org/get"
  489. let expectation = self.expectation(description: "request should succeed")
  490. var response: DataResponse<Data>?
  491. // When
  492. Alamofire.request(urlString).responseData { resp in
  493. response = resp.flatMapError { TestError.error(error: $0) }
  494. expectation.fulfill()
  495. }
  496. waitForExpectations(timeout: timeout, handler: nil)
  497. // Then
  498. XCTAssertNotNil(response?.request)
  499. XCTAssertNotNil(response?.response)
  500. XCTAssertNotNil(response?.data)
  501. XCTAssertEqual(response?.result.isSuccess, true)
  502. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  503. XCTAssertNotNil(response?.metrics)
  504. }
  505. }
  506. func testThatFlatMapErrorCatchesTransformationError() {
  507. // Given
  508. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  509. let expectation = self.expectation(description: "request should fail")
  510. var response: DataResponse<Data>?
  511. // When
  512. Alamofire.request(urlString).responseData { resp in
  513. response = resp.flatMapError { _ in try TransformationError.error.alwaysFails() }
  514. expectation.fulfill()
  515. }
  516. waitForExpectations(timeout: timeout, handler: nil)
  517. // Then
  518. XCTAssertNotNil(response?.request)
  519. XCTAssertNil(response?.response)
  520. XCTAssertNotNil(response?.data)
  521. XCTAssertEqual(response?.result.isFailure, true)
  522. if let error = response?.result.error {
  523. XCTAssertTrue(error is TransformationError)
  524. } else {
  525. XCTFail("flatMapError should catch the transformation error")
  526. }
  527. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  528. XCTAssertNotNil(response?.metrics)
  529. }
  530. }
  531. func testThatFlatMapErrorTransformsError() {
  532. // Given
  533. let urlString = "https://invalid-url-here.org/this/does/not/exist"
  534. let expectation = self.expectation(description: "request should fail")
  535. var response: DataResponse<Data>?
  536. // When
  537. Alamofire.request(urlString).responseData { resp in
  538. response = resp.flatMapError { TestError.error(error: $0) }
  539. expectation.fulfill()
  540. }
  541. waitForExpectations(timeout: timeout, handler: nil)
  542. // Then
  543. XCTAssertNotNil(response?.request)
  544. XCTAssertNil(response?.response)
  545. XCTAssertNotNil(response?.data)
  546. XCTAssertEqual(response?.result.isFailure, true)
  547. guard let error = response?.error as? TestError, case .error = error else { XCTFail(); return }
  548. if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) {
  549. XCTAssertNotNil(response?.metrics)
  550. }
  551. }
  552. }