ResponseSerializationTests.swift 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014-2018 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 DataResponseSerializationTestCase: BaseTestCase {
  28. // MARK: Properties
  29. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  30. // MARK: DataResponseSerializer
  31. func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
  32. // Given
  33. let serializer = DataResponseSerializer()
  34. let data = Data("data".utf8)
  35. // When
  36. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  37. // Then
  38. XCTAssertTrue(result.isSuccess)
  39. XCTAssertNotNil(result.value)
  40. XCTAssertNil(result.error)
  41. }
  42. func testThatDataResponseSerializerFailsWhenDataIsNil() {
  43. // Given
  44. let serializer = DataResponseSerializer()
  45. // When
  46. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  47. // Then
  48. XCTAssertTrue(result.isFailure)
  49. XCTAssertNil(result.value)
  50. XCTAssertNotNil(result.error)
  51. if let error = result.error?.asAFError {
  52. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  53. } else {
  54. XCTFail("error should not be nil")
  55. }
  56. }
  57. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  58. // Given
  59. let serializer = DataResponseSerializer()
  60. // When
  61. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  62. // Then
  63. XCTAssertTrue(result.isFailure)
  64. XCTAssertNil(result.value)
  65. XCTAssertNotNil(result.error)
  66. if let error = result.error?.asAFError {
  67. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  68. } else {
  69. XCTFail("error should not be nil")
  70. }
  71. }
  72. func testThatDataResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  73. // Given
  74. let serializer = DataResponseSerializer()
  75. let response = HTTPURLResponse(statusCode: 200)
  76. // When
  77. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  78. // Then
  79. XCTAssertTrue(result.isFailure, "result is failure should be true")
  80. XCTAssertNil(result.value, "result value should be nil")
  81. XCTAssertNotNil(result.error, "result error should not be nil")
  82. if let error = result.error?.asAFError {
  83. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  84. } else {
  85. XCTFail("error should not be nil")
  86. }
  87. }
  88. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  89. // Given
  90. let serializer = DataResponseSerializer()
  91. let response = HTTPURLResponse(statusCode: 204)
  92. // When
  93. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  94. // Then
  95. XCTAssertTrue(result.isSuccess)
  96. XCTAssertNotNil(result.value)
  97. XCTAssertNil(result.error)
  98. if let data = result.value {
  99. XCTAssertEqual(data.count, 0)
  100. }
  101. }
  102. // MARK: StringResponseSerializer
  103. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  104. // Given
  105. let serializer = DataResponseSerializer()
  106. // When
  107. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  108. // Then
  109. XCTAssertTrue(result.isFailure)
  110. XCTAssertNil(result.value)
  111. XCTAssertNotNil(result.error)
  112. if let error = result.error?.asAFError {
  113. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  114. } else {
  115. XCTFail("error should not be nil")
  116. }
  117. }
  118. func testThatStringResponseSerializerFailsWhenDataIsEmpty() {
  119. // Given
  120. let serializer = StringResponseSerializer()
  121. // When
  122. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  123. // Then
  124. XCTAssertTrue(result.isFailure)
  125. XCTAssertNil(result.value)
  126. XCTAssertNotNil(result.error)
  127. if let error = result.error?.asAFError {
  128. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  129. } else {
  130. XCTFail("error should not be nil")
  131. }
  132. }
  133. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  134. let serializer = StringResponseSerializer()
  135. let data = Data("data".utf8)
  136. // When
  137. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  138. // Then
  139. XCTAssertTrue(result.isSuccess)
  140. XCTAssertNotNil(result.value)
  141. XCTAssertNil(result.error)
  142. }
  143. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  144. let serializer = StringResponseSerializer(encoding: .utf8)
  145. let data = Data("data".utf8)
  146. // When
  147. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  148. // Then
  149. XCTAssertTrue(result.isSuccess)
  150. XCTAssertNotNil(result.value)
  151. XCTAssertNil(result.error)
  152. }
  153. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  154. let serializer = StringResponseSerializer()
  155. let data = Data("data".utf8)
  156. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  157. // When
  158. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  159. // Then
  160. XCTAssertTrue(result.isSuccess)
  161. XCTAssertNotNil(result.value)
  162. XCTAssertNil(result.error)
  163. }
  164. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  165. // Given
  166. let serializer = StringResponseSerializer(encoding: .utf8)
  167. let data = "random data".data(using: .utf32)!
  168. // When
  169. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  170. // Then
  171. XCTAssertTrue(result.isFailure)
  172. XCTAssertNil(result.value)
  173. XCTAssertNotNil(result.error)
  174. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  175. XCTAssertTrue(error.isStringSerializationFailed)
  176. XCTAssertEqual(failedEncoding, .utf8)
  177. } else {
  178. XCTFail("error should not be nil")
  179. }
  180. }
  181. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  182. // Given
  183. let serializer = StringResponseSerializer()
  184. let data = "random data".data(using: .utf32)!
  185. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  186. // When
  187. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  188. // Then
  189. XCTAssertTrue(result.isFailure)
  190. XCTAssertNil(result.value)
  191. XCTAssertNotNil(result.error)
  192. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  193. XCTAssertTrue(error.isStringSerializationFailed)
  194. XCTAssertEqual(failedEncoding, .utf8)
  195. } else {
  196. XCTFail("error should not be nil")
  197. }
  198. }
  199. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  200. // Given
  201. let serializer = StringResponseSerializer()
  202. // When
  203. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  204. // Then
  205. XCTAssertTrue(result.isFailure)
  206. XCTAssertNil(result.value)
  207. XCTAssertNotNil(result.error)
  208. if let error = result.error?.asAFError {
  209. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  210. } else {
  211. XCTFail("error should not be nil")
  212. }
  213. }
  214. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  215. // Given
  216. let serializer = StringResponseSerializer()
  217. let response = HTTPURLResponse(statusCode: 200)
  218. // When
  219. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  220. // Then
  221. XCTAssertTrue(result.isFailure)
  222. XCTAssertNil(result.value)
  223. XCTAssertNotNil(result.error)
  224. if let error = result.error?.asAFError {
  225. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  226. } else {
  227. XCTFail("error should not be nil")
  228. }
  229. }
  230. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  231. // Given
  232. let serializer = StringResponseSerializer()
  233. let response = HTTPURLResponse(statusCode: 205)
  234. // When
  235. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  236. // Then
  237. XCTAssertTrue(result.isSuccess)
  238. XCTAssertNotNil(result.value)
  239. XCTAssertNil(result.error)
  240. if let string = result.value {
  241. XCTAssertEqual(string, "")
  242. }
  243. }
  244. // MARK: JSONResponseSerializer
  245. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  246. // Given
  247. let serializer = JSONResponseSerializer()
  248. // When
  249. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  250. // Then
  251. XCTAssertTrue(result.isFailure)
  252. XCTAssertNil(result.value)
  253. XCTAssertNotNil(result.error)
  254. if let error = result.error?.asAFError {
  255. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  256. } else {
  257. XCTFail("error should not be nil")
  258. }
  259. }
  260. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  261. // Given
  262. let serializer = JSONResponseSerializer()
  263. // When
  264. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  265. // Then
  266. XCTAssertTrue(result.isFailure)
  267. XCTAssertNil(result.value)
  268. XCTAssertNotNil(result.error)
  269. if let error = result.error?.asAFError {
  270. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  271. } else {
  272. XCTFail("error should not be nil")
  273. }
  274. }
  275. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  276. // Given
  277. let serializer = JSONResponseSerializer()
  278. let data = Data("{\"json\": true}".utf8)
  279. // When
  280. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  281. // Then
  282. XCTAssertTrue(result.isSuccess)
  283. XCTAssertNotNil(result.value)
  284. XCTAssertNil(result.error)
  285. }
  286. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  287. // Given
  288. let serializer = JSONResponseSerializer()
  289. let data = Data("definitely not valid json".utf8)
  290. // When
  291. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  292. // Then
  293. XCTAssertTrue(result.isFailure)
  294. XCTAssertNil(result.value)
  295. XCTAssertNotNil(result.error)
  296. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  297. XCTAssertTrue(error.isJSONSerializationFailed)
  298. XCTAssertEqual(underlyingError.errorCode, 3840)
  299. } else {
  300. XCTFail("error should not be nil")
  301. }
  302. }
  303. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  304. // Given
  305. let serializer = JSONResponseSerializer()
  306. // When
  307. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  308. // Then
  309. XCTAssertTrue(result.isFailure)
  310. XCTAssertNil(result.value)
  311. XCTAssertNotNil(result.error)
  312. if let error = result.error?.asAFError {
  313. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  314. } else {
  315. XCTFail("error should not be nil")
  316. }
  317. }
  318. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  319. // Given
  320. let serializer = JSONResponseSerializer()
  321. let response = HTTPURLResponse(statusCode: 200)
  322. // When
  323. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  324. // Then
  325. XCTAssertTrue(result.isFailure)
  326. XCTAssertNil(result.value)
  327. XCTAssertNotNil(result.error)
  328. if let error = result.error?.asAFError {
  329. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  330. } else {
  331. XCTFail("error should not be nil")
  332. }
  333. }
  334. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  335. // Given
  336. let serializer = JSONResponseSerializer()
  337. let response = HTTPURLResponse(statusCode: 204)
  338. // When
  339. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  340. // Then
  341. XCTAssertTrue(result.isSuccess)
  342. XCTAssertNotNil(result.value)
  343. XCTAssertNil(result.error)
  344. if let json = result.value as? NSNull {
  345. XCTAssertEqual(json, NSNull())
  346. } else {
  347. XCTFail("json should not be nil")
  348. }
  349. }
  350. }
  351. // MARK: -
  352. final class DecodableResponseSerializerTests: BaseTestCase {
  353. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  354. struct DecodableValue: Decodable {
  355. let string: String
  356. }
  357. func testThatDecodableResponseSerializerFailsWhenDataIsNil() {
  358. // Given
  359. let serializer = DecodableResponseSerializer<DecodableValue>()
  360. // When
  361. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  362. // Then
  363. XCTAssertTrue(result.isFailure)
  364. XCTAssertNil(result.value)
  365. XCTAssertNotNil(result.error)
  366. if let error = result.error?.asAFError {
  367. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  368. } else {
  369. XCTFail("error should not be nil")
  370. }
  371. }
  372. func testThatDecodableResponseSerializerFailsWhenDataIsEmpty() {
  373. // Given
  374. let serializer = DecodableResponseSerializer<DecodableValue>()
  375. // When
  376. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  377. // Then
  378. XCTAssertTrue(result.isFailure)
  379. XCTAssertNil(result.value)
  380. XCTAssertNotNil(result.error)
  381. if let error = result.error?.asAFError {
  382. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  383. } else {
  384. XCTFail("error should not be nil")
  385. }
  386. }
  387. func testThatDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  388. // Given
  389. let data = Data("{\"string\":\"string\"}".utf8)
  390. let serializer = DecodableResponseSerializer<DecodableValue>()
  391. // When
  392. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  393. // Then
  394. XCTAssertTrue(result.isSuccess)
  395. XCTAssertNotNil(result.value)
  396. XCTAssertEqual(result.value?.string, "string")
  397. XCTAssertNil(result.error)
  398. }
  399. func testThatDecodableResponseSerializerFailsWhenDataIsInvalidRepresentation() {
  400. // Given
  401. let serializer = DecodableResponseSerializer<DecodableValue>()
  402. let data = Data("definitely not valid".utf8)
  403. // When
  404. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  405. // Then
  406. XCTAssertTrue(result.isFailure)
  407. XCTAssertNil(result.value)
  408. XCTAssertNotNil(result.error)
  409. }
  410. func testThatDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  411. // Given
  412. let serializer = DecodableResponseSerializer<DecodableValue>()
  413. // When
  414. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  415. // Then
  416. XCTAssertTrue(result.isFailure)
  417. XCTAssertNil(result.value)
  418. XCTAssertNotNil(result.error)
  419. if let error = result.error?.asAFError {
  420. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  421. } else {
  422. XCTFail("error should not be nil")
  423. }
  424. }
  425. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  426. // Given
  427. let serializer = DecodableResponseSerializer<DecodableValue>()
  428. let response = HTTPURLResponse(statusCode: 200)
  429. // When
  430. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  431. // Then
  432. XCTAssertTrue(result.isFailure)
  433. XCTAssertNil(result.value)
  434. XCTAssertNotNil(result.error)
  435. if let error = result.error?.asAFError {
  436. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  437. } else {
  438. XCTFail("error should not be nil")
  439. }
  440. }
  441. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  442. // Given
  443. let serializer = DecodableResponseSerializer<Empty>()
  444. let response = HTTPURLResponse(statusCode: 204)
  445. // When
  446. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  447. // Then
  448. XCTAssertTrue(result.isSuccess)
  449. XCTAssertNotNil(result.value)
  450. XCTAssertNil(result.error)
  451. }
  452. }
  453. // MARK: -
  454. final class DownloadResponseSerializationTestCase: BaseTestCase {
  455. // MARK: Properties
  456. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  457. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  458. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  459. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  460. private var plistEmptyDataFileURL: URL { return url(forResource: "empty", withExtension: "data") }
  461. private var plistValidDataFileURL: URL { return url(forResource: "valid", withExtension: "data") }
  462. private var plistInvalidDataFileURL: URL { return url(forResource: "invalid", withExtension: "data") }
  463. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  464. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  465. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  466. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  467. // MARK: Tests - Data Response Serializer
  468. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  469. // Given
  470. let serializer = DataResponseSerializer()
  471. // When
  472. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  473. // Then
  474. XCTAssertTrue(result.isSuccess)
  475. XCTAssertNotNil(result.value)
  476. XCTAssertNil(result.error)
  477. }
  478. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  479. // Given
  480. let serializer = DataResponseSerializer()
  481. // When
  482. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  483. // Then
  484. XCTAssertTrue(result.isFailure)
  485. XCTAssertNil(result.value)
  486. XCTAssertNotNil(result.error)
  487. if let error = result.error?.asAFError {
  488. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  489. } else {
  490. XCTFail("error should not be nil")
  491. }
  492. }
  493. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  494. // Given
  495. let serializer = DataResponseSerializer()
  496. // When
  497. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  498. // Then
  499. XCTAssertTrue(result.isFailure)
  500. XCTAssertNil(result.value)
  501. XCTAssertNotNil(result.error)
  502. if let error = result.error?.asAFError {
  503. XCTAssertTrue(error.isInputFileNil)
  504. } else {
  505. XCTFail("error should not be nil")
  506. }
  507. }
  508. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  509. // Given
  510. let serializer = DataResponseSerializer()
  511. // When
  512. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  513. // Then
  514. XCTAssertTrue(result.isFailure)
  515. XCTAssertNil(result.value)
  516. XCTAssertNotNil(result.error)
  517. if let error = result.error?.asAFError {
  518. XCTAssertTrue(error.isInputFileReadFailed)
  519. } else {
  520. XCTFail("error should not be nil")
  521. }
  522. }
  523. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  524. // Given
  525. let serializer = DataResponseSerializer()
  526. // When
  527. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  528. // Then
  529. XCTAssertTrue(result.isFailure)
  530. XCTAssertNil(result.value)
  531. XCTAssertNotNil(result.error)
  532. if let error = result.error?.asAFError {
  533. XCTAssertTrue(error.isInputFileNil)
  534. } else {
  535. XCTFail("error should not be nil")
  536. }
  537. }
  538. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  539. // Given
  540. let serializer = DataResponseSerializer()
  541. let response = HTTPURLResponse(statusCode: 200)
  542. // When
  543. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  544. // Then
  545. XCTAssertTrue(result.isFailure)
  546. XCTAssertNil(result.value)
  547. XCTAssertNotNil(result.error)
  548. if let error = result.error?.asAFError {
  549. XCTAssertTrue(error.isInputFileNil)
  550. } else {
  551. XCTFail("error should not be nil")
  552. }
  553. }
  554. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  555. // Given
  556. let serializer = DataResponseSerializer()
  557. let response = HTTPURLResponse(statusCode: 205)
  558. // When
  559. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  560. // Then
  561. XCTAssertTrue(result.isSuccess)
  562. XCTAssertNotNil(result.value)
  563. XCTAssertNil(result.error)
  564. if let data = result.value {
  565. XCTAssertEqual(data.count, 0)
  566. } else {
  567. XCTFail("data should not be nil")
  568. }
  569. }
  570. // MARK: Tests - String Response Serializer
  571. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  572. // Given
  573. let serializer = StringResponseSerializer()
  574. // When
  575. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  576. // Then
  577. XCTAssertTrue(result.isFailure)
  578. XCTAssertNil(result.value)
  579. XCTAssertNotNil(result.error)
  580. if let error = result.error?.asAFError {
  581. XCTAssertTrue(error.isInputFileNil)
  582. } else {
  583. XCTFail("error should not be nil")
  584. }
  585. }
  586. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  587. // Given
  588. let serializer = StringResponseSerializer()
  589. // When
  590. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  591. // Then
  592. XCTAssertEqual(result.isSuccess, false)
  593. XCTAssertNil(result.value)
  594. XCTAssertNotNil(result.error)
  595. if let error = result.error?.asAFError {
  596. XCTAssertTrue(error.isInputFileReadFailed)
  597. } else {
  598. XCTFail("error should not be nil")
  599. }
  600. }
  601. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  602. // Given
  603. let serializer = StringResponseSerializer()
  604. // When
  605. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  606. // Then
  607. XCTAssertTrue(result.isFailure)
  608. XCTAssertNil(result.value)
  609. XCTAssertNotNil(result.error)
  610. if let error = result.error?.asAFError {
  611. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  612. } else {
  613. XCTFail("error should not be nil")
  614. }
  615. }
  616. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  617. // Given
  618. let serializer = StringResponseSerializer()
  619. // When
  620. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  621. // Then
  622. XCTAssertTrue(result.isSuccess)
  623. XCTAssertNotNil(result.value)
  624. XCTAssertNil(result.error)
  625. }
  626. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  627. // Given
  628. let serializer = StringResponseSerializer(encoding: .utf8)
  629. // When
  630. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  631. // Then
  632. XCTAssertTrue(result.isSuccess)
  633. XCTAssertNotNil(result.value)
  634. XCTAssertNil(result.error)
  635. }
  636. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  637. // Given
  638. let serializer = StringResponseSerializer()
  639. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  640. // When
  641. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  642. // Then
  643. XCTAssertTrue(result.isSuccess)
  644. XCTAssertNotNil(result.value)
  645. XCTAssertNil(result.error)
  646. }
  647. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  648. // Given
  649. let serializer = StringResponseSerializer(encoding: .utf8)
  650. // When
  651. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  652. // Then
  653. XCTAssertTrue(result.isFailure)
  654. XCTAssertNil(result.value)
  655. XCTAssertNotNil(result.error)
  656. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  657. XCTAssertTrue(error.isStringSerializationFailed)
  658. XCTAssertEqual(failedEncoding, .utf8)
  659. } else {
  660. XCTFail("error should not be nil")
  661. }
  662. }
  663. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  664. // Given
  665. let serializer = StringResponseSerializer()
  666. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  667. // When
  668. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  669. // Then
  670. XCTAssertTrue(result.isFailure)
  671. XCTAssertNil(result.value)
  672. XCTAssertNotNil(result.error)
  673. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  674. XCTAssertTrue(error.isStringSerializationFailed)
  675. XCTAssertEqual(failedEncoding, .utf8)
  676. } else {
  677. XCTFail("error should not be nil")
  678. }
  679. }
  680. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  681. // Given
  682. let serializer = StringResponseSerializer()
  683. // When
  684. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  685. // Then
  686. XCTAssertTrue(result.isFailure)
  687. XCTAssertNil(result.value)
  688. XCTAssertNotNil(result.error)
  689. if let error = result.error?.asAFError {
  690. XCTAssertTrue(error.isInputFileNil)
  691. } else {
  692. XCTFail("error should not be nil")
  693. }
  694. }
  695. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  696. // Given
  697. let serializer = StringResponseSerializer()
  698. let response = HTTPURLResponse(statusCode: 200)
  699. // When
  700. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  701. // Then
  702. XCTAssertTrue(result.isFailure)
  703. XCTAssertNil(result.value)
  704. XCTAssertNotNil(result.error)
  705. if let error = result.error?.asAFError {
  706. XCTAssertTrue(error.isInputFileNil)
  707. } else {
  708. XCTFail("error should not be nil")
  709. }
  710. }
  711. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  712. // Given
  713. let serializer = StringResponseSerializer()
  714. let response = HTTPURLResponse(statusCode: 204)
  715. // When
  716. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  717. // Then
  718. XCTAssertTrue(result.isSuccess)
  719. XCTAssertNotNil(result.value)
  720. XCTAssertNil(result.error)
  721. if let string = result.value {
  722. XCTAssertEqual(string, "")
  723. }
  724. }
  725. // MARK: Tests - JSON Response Serializer
  726. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  727. // Given
  728. let serializer = JSONResponseSerializer()
  729. // When
  730. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  731. // Then
  732. XCTAssertTrue(result.isFailure)
  733. XCTAssertNil(result.value)
  734. XCTAssertNotNil(result.error)
  735. if let error = result.error?.asAFError {
  736. XCTAssertTrue(error.isInputFileNil)
  737. } else {
  738. XCTFail("error should not be nil")
  739. }
  740. }
  741. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  742. // Given
  743. let serializer = JSONResponseSerializer()
  744. // When
  745. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  746. // Then
  747. XCTAssertTrue(result.isFailure)
  748. XCTAssertNil(result.value)
  749. XCTAssertNotNil(result.error)
  750. if let error = result.error?.asAFError {
  751. XCTAssertTrue(error.isInputFileReadFailed)
  752. } else {
  753. XCTFail("error should not be nil")
  754. }
  755. }
  756. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  757. // Given
  758. let serializer = JSONResponseSerializer()
  759. // When
  760. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  761. // Then
  762. XCTAssertTrue(result.isFailure)
  763. XCTAssertNil(result.value)
  764. XCTAssertNotNil(result.error)
  765. if let error = result.error?.asAFError {
  766. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  767. } else {
  768. XCTFail("error should not be nil")
  769. }
  770. }
  771. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  772. // Given
  773. let serializer = JSONResponseSerializer()
  774. // When
  775. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  776. // Then
  777. XCTAssertTrue(result.isSuccess)
  778. XCTAssertNotNil(result.value)
  779. XCTAssertNil(result.error)
  780. }
  781. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  782. // Given
  783. let serializer = JSONResponseSerializer()
  784. // When
  785. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  786. // Then
  787. XCTAssertTrue(result.isFailure)
  788. XCTAssertNil(result.value)
  789. XCTAssertNotNil(result.error)
  790. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  791. XCTAssertTrue(error.isJSONSerializationFailed)
  792. XCTAssertEqual(underlyingError.errorCode, 3840)
  793. } else {
  794. XCTFail("error should not be nil")
  795. }
  796. }
  797. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  798. // Given
  799. let serializer = JSONResponseSerializer()
  800. // When
  801. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  802. // Then
  803. XCTAssertTrue(result.isFailure)
  804. XCTAssertNil(result.value)
  805. XCTAssertNotNil(result.error)
  806. if let error = result.error?.asAFError {
  807. XCTAssertTrue(error.isInputFileNil)
  808. } else {
  809. XCTFail("error should not be nil")
  810. }
  811. }
  812. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  813. // Given
  814. let serializer = JSONResponseSerializer()
  815. let response = HTTPURLResponse(statusCode: 200)
  816. // When
  817. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  818. // Then
  819. XCTAssertTrue(result.isFailure)
  820. XCTAssertNil(result.value)
  821. XCTAssertNotNil(result.error)
  822. if let error = result.error?.asAFError {
  823. XCTAssertTrue(error.isInputFileNil)
  824. } else {
  825. XCTFail("error should not be nil")
  826. }
  827. }
  828. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  829. // Given
  830. let serializer = JSONResponseSerializer()
  831. let response = HTTPURLResponse(statusCode: 205)
  832. // When
  833. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  834. // Then
  835. XCTAssertTrue(result.isSuccess)
  836. XCTAssertNotNil(result.value)
  837. XCTAssertNil(result.error)
  838. if let json = result.value as? NSNull {
  839. XCTAssertEqual(json, NSNull())
  840. }
  841. }
  842. }
  843. final class CustomResponseSerializerTestCases: BaseTestCase {
  844. func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() {
  845. // Given
  846. final class UselessResponseSerializer: ResponseSerializer {
  847. func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? {
  848. return data
  849. }
  850. }
  851. let serializer = UselessResponseSerializer()
  852. let expectation = self.expectation(description: "request should finish")
  853. var data: Data?
  854. // When
  855. AF.request(URLRequest.makeHTTPBinRequest()).response(responseSerializer: serializer) { (response) in
  856. data = response.data
  857. expectation.fulfill()
  858. }
  859. waitForExpectations(timeout: timeout, handler: nil)
  860. // Then
  861. XCTAssertNotNil(data)
  862. }
  863. }
  864. extension HTTPURLResponse {
  865. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  866. let url = URL(string: "https://httpbin.org/get")!
  867. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  868. }
  869. }