ResponseSerializationTests.swift 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  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. 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. // MARK: DecodableResponseSerializer
  351. struct DecodableValue: Codable {
  352. let string: String
  353. }
  354. func testThatJSONDecodableResponseSerializerFailsWhenDataIsNil() {
  355. // Given
  356. let serializer = DecodableResponseSerializer<DecodableValue>()
  357. // When
  358. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  359. // Then
  360. XCTAssertTrue(result.isFailure)
  361. XCTAssertNil(result.value)
  362. XCTAssertNotNil(result.error)
  363. if let error = result.error?.asAFError {
  364. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  365. } else {
  366. XCTFail("error should not be nil")
  367. }
  368. }
  369. func testThatJSONDecodableResponseSerializerFailsWhenDataIsEmpty() {
  370. // Given
  371. let serializer = DecodableResponseSerializer<DecodableValue>()
  372. // When
  373. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  374. // Then
  375. XCTAssertTrue(result.isFailure)
  376. XCTAssertNil(result.value)
  377. XCTAssertNotNil(result.error)
  378. if let error = result.error?.asAFError {
  379. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  380. } else {
  381. XCTFail("error should not be nil")
  382. }
  383. }
  384. func testThatJSONDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  385. // Given
  386. let data = Data("{\"string\":\"string\"}".utf8)
  387. let serializer = DecodableResponseSerializer<DecodableValue>()
  388. // When
  389. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  390. // Then
  391. XCTAssertTrue(result.isSuccess)
  392. XCTAssertNotNil(result.value)
  393. XCTAssertEqual(result.value?.string, "string")
  394. XCTAssertNil(result.error)
  395. }
  396. func testThatJSONDecodableResponseSerializerFailsWhenDataIsInvalidJSON() {
  397. // Given
  398. let serializer = DecodableResponseSerializer<DecodableValue>()
  399. let data = Data("definitely not valid json".utf8)
  400. // When
  401. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  402. // Then
  403. XCTAssertTrue(result.isFailure)
  404. XCTAssertNil(result.value)
  405. XCTAssertNotNil(result.error)
  406. }
  407. func testThatJSONDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  408. // Given
  409. let serializer = DecodableResponseSerializer<DecodableValue>()
  410. // When
  411. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  412. // Then
  413. XCTAssertTrue(result.isFailure)
  414. XCTAssertNil(result.value)
  415. XCTAssertNotNil(result.error)
  416. if let error = result.error?.asAFError {
  417. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  418. } else {
  419. XCTFail("error should not be nil")
  420. }
  421. }
  422. func testThatJSONDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  423. // Given
  424. let serializer = DecodableResponseSerializer<DecodableValue>()
  425. let response = HTTPURLResponse(statusCode: 200)
  426. // When
  427. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  428. // Then
  429. XCTAssertTrue(result.isFailure)
  430. XCTAssertNil(result.value)
  431. XCTAssertNotNil(result.error)
  432. if let error = result.error?.asAFError {
  433. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  434. } else {
  435. XCTFail("error should not be nil")
  436. }
  437. }
  438. func testThatJSONDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  439. // Given
  440. let serializer = DecodableResponseSerializer<Empty>()
  441. let response = HTTPURLResponse(statusCode: 204)
  442. // When
  443. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  444. // Then
  445. XCTAssertTrue(result.isSuccess)
  446. XCTAssertNotNil(result.value)
  447. XCTAssertNil(result.error)
  448. }
  449. }
  450. // MARK: -
  451. class DownloadResponseSerializationTestCase: BaseTestCase {
  452. // MARK: Properties
  453. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  454. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  455. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  456. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  457. private var plistEmptyDataFileURL: URL { return url(forResource: "empty", withExtension: "data") }
  458. private var plistValidDataFileURL: URL { return url(forResource: "valid", withExtension: "data") }
  459. private var plistInvalidDataFileURL: URL { return url(forResource: "invalid", withExtension: "data") }
  460. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  461. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  462. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  463. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  464. // MARK: Tests - Data Response Serializer
  465. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  466. // Given
  467. let serializer = DataResponseSerializer()
  468. // When
  469. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  470. // Then
  471. XCTAssertTrue(result.isSuccess)
  472. XCTAssertNotNil(result.value)
  473. XCTAssertNil(result.error)
  474. }
  475. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  476. // Given
  477. let serializer = DataResponseSerializer()
  478. // When
  479. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  480. // Then
  481. XCTAssertTrue(result.isFailure)
  482. XCTAssertNil(result.value)
  483. XCTAssertNotNil(result.error)
  484. if let error = result.error?.asAFError {
  485. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  486. } else {
  487. XCTFail("error should not be nil")
  488. }
  489. }
  490. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  491. // Given
  492. let serializer = DataResponseSerializer()
  493. // When
  494. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  495. // Then
  496. XCTAssertTrue(result.isFailure)
  497. XCTAssertNil(result.value)
  498. XCTAssertNotNil(result.error)
  499. if let error = result.error?.asAFError {
  500. XCTAssertTrue(error.isInputFileNil)
  501. } else {
  502. XCTFail("error should not be nil")
  503. }
  504. }
  505. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  506. // Given
  507. let serializer = DataResponseSerializer()
  508. // When
  509. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  510. // Then
  511. XCTAssertTrue(result.isFailure)
  512. XCTAssertNil(result.value)
  513. XCTAssertNotNil(result.error)
  514. if let error = result.error?.asAFError {
  515. XCTAssertTrue(error.isInputFileReadFailed)
  516. } else {
  517. XCTFail("error should not be nil")
  518. }
  519. }
  520. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  521. // Given
  522. let serializer = DataResponseSerializer()
  523. // When
  524. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  525. // Then
  526. XCTAssertTrue(result.isFailure)
  527. XCTAssertNil(result.value)
  528. XCTAssertNotNil(result.error)
  529. if let error = result.error?.asAFError {
  530. XCTAssertTrue(error.isInputFileNil)
  531. } else {
  532. XCTFail("error should not be nil")
  533. }
  534. }
  535. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  536. // Given
  537. let serializer = DataResponseSerializer()
  538. let response = HTTPURLResponse(statusCode: 200)
  539. // When
  540. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  541. // Then
  542. XCTAssertTrue(result.isFailure)
  543. XCTAssertNil(result.value)
  544. XCTAssertNotNil(result.error)
  545. if let error = result.error?.asAFError {
  546. XCTAssertTrue(error.isInputFileNil)
  547. } else {
  548. XCTFail("error should not be nil")
  549. }
  550. }
  551. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  552. // Given
  553. let serializer = DataResponseSerializer()
  554. let response = HTTPURLResponse(statusCode: 205)
  555. // When
  556. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  557. // Then
  558. XCTAssertTrue(result.isSuccess)
  559. XCTAssertNotNil(result.value)
  560. XCTAssertNil(result.error)
  561. if let data = result.value {
  562. XCTAssertEqual(data.count, 0)
  563. } else {
  564. XCTFail("data should not be nil")
  565. }
  566. }
  567. // MARK: Tests - String Response Serializer
  568. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  569. // Given
  570. let serializer = StringResponseSerializer()
  571. // When
  572. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  573. // Then
  574. XCTAssertTrue(result.isFailure)
  575. XCTAssertNil(result.value)
  576. XCTAssertNotNil(result.error)
  577. if let error = result.error?.asAFError {
  578. XCTAssertTrue(error.isInputFileNil)
  579. } else {
  580. XCTFail("error should not be nil")
  581. }
  582. }
  583. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  584. // Given
  585. let serializer = StringResponseSerializer()
  586. // When
  587. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  588. // Then
  589. XCTAssertEqual(result.isSuccess, false)
  590. XCTAssertNil(result.value)
  591. XCTAssertNotNil(result.error)
  592. if let error = result.error?.asAFError {
  593. XCTAssertTrue(error.isInputFileReadFailed)
  594. } else {
  595. XCTFail("error should not be nil")
  596. }
  597. }
  598. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  599. // Given
  600. let serializer = StringResponseSerializer()
  601. // When
  602. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  603. // Then
  604. XCTAssertTrue(result.isFailure)
  605. XCTAssertNil(result.value)
  606. XCTAssertNotNil(result.error)
  607. if let error = result.error?.asAFError {
  608. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  609. } else {
  610. XCTFail("error should not be nil")
  611. }
  612. }
  613. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  614. // Given
  615. let serializer = StringResponseSerializer()
  616. // When
  617. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  618. // Then
  619. XCTAssertTrue(result.isSuccess)
  620. XCTAssertNotNil(result.value)
  621. XCTAssertNil(result.error)
  622. }
  623. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  624. // Given
  625. let serializer = StringResponseSerializer(encoding: .utf8)
  626. // When
  627. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  628. // Then
  629. XCTAssertTrue(result.isSuccess)
  630. XCTAssertNotNil(result.value)
  631. XCTAssertNil(result.error)
  632. }
  633. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  634. // Given
  635. let serializer = StringResponseSerializer()
  636. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  637. // When
  638. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  639. // Then
  640. XCTAssertTrue(result.isSuccess)
  641. XCTAssertNotNil(result.value)
  642. XCTAssertNil(result.error)
  643. }
  644. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  645. // Given
  646. let serializer = StringResponseSerializer(encoding: .utf8)
  647. // When
  648. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  649. // Then
  650. XCTAssertTrue(result.isFailure)
  651. XCTAssertNil(result.value)
  652. XCTAssertNotNil(result.error)
  653. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  654. XCTAssertTrue(error.isStringSerializationFailed)
  655. XCTAssertEqual(failedEncoding, .utf8)
  656. } else {
  657. XCTFail("error should not be nil")
  658. }
  659. }
  660. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  661. // Given
  662. let serializer = StringResponseSerializer()
  663. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  664. // When
  665. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  666. // Then
  667. XCTAssertTrue(result.isFailure)
  668. XCTAssertNil(result.value)
  669. XCTAssertNotNil(result.error)
  670. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  671. XCTAssertTrue(error.isStringSerializationFailed)
  672. XCTAssertEqual(failedEncoding, .utf8)
  673. } else {
  674. XCTFail("error should not be nil")
  675. }
  676. }
  677. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  678. // Given
  679. let serializer = StringResponseSerializer()
  680. // When
  681. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  682. // Then
  683. XCTAssertTrue(result.isFailure)
  684. XCTAssertNil(result.value)
  685. XCTAssertNotNil(result.error)
  686. if let error = result.error?.asAFError {
  687. XCTAssertTrue(error.isInputFileNil)
  688. } else {
  689. XCTFail("error should not be nil")
  690. }
  691. }
  692. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  693. // Given
  694. let serializer = StringResponseSerializer()
  695. let response = HTTPURLResponse(statusCode: 200)
  696. // When
  697. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  698. // Then
  699. XCTAssertTrue(result.isFailure)
  700. XCTAssertNil(result.value)
  701. XCTAssertNotNil(result.error)
  702. if let error = result.error?.asAFError {
  703. XCTAssertTrue(error.isInputFileNil)
  704. } else {
  705. XCTFail("error should not be nil")
  706. }
  707. }
  708. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  709. // Given
  710. let serializer = StringResponseSerializer()
  711. let response = HTTPURLResponse(statusCode: 204)
  712. // When
  713. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  714. // Then
  715. XCTAssertTrue(result.isSuccess)
  716. XCTAssertNotNil(result.value)
  717. XCTAssertNil(result.error)
  718. if let string = result.value {
  719. XCTAssertEqual(string, "")
  720. }
  721. }
  722. // MARK: Tests - JSON Response Serializer
  723. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  724. // Given
  725. let serializer = JSONResponseSerializer()
  726. // When
  727. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  728. // Then
  729. XCTAssertTrue(result.isFailure)
  730. XCTAssertNil(result.value)
  731. XCTAssertNotNil(result.error)
  732. if let error = result.error?.asAFError {
  733. XCTAssertTrue(error.isInputFileNil)
  734. } else {
  735. XCTFail("error should not be nil")
  736. }
  737. }
  738. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  739. // Given
  740. let serializer = JSONResponseSerializer()
  741. // When
  742. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  743. // Then
  744. XCTAssertTrue(result.isFailure)
  745. XCTAssertNil(result.value)
  746. XCTAssertNotNil(result.error)
  747. if let error = result.error?.asAFError {
  748. XCTAssertTrue(error.isInputFileReadFailed)
  749. } else {
  750. XCTFail("error should not be nil")
  751. }
  752. }
  753. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  754. // Given
  755. let serializer = JSONResponseSerializer()
  756. // When
  757. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  758. // Then
  759. XCTAssertTrue(result.isFailure)
  760. XCTAssertNil(result.value)
  761. XCTAssertNotNil(result.error)
  762. if let error = result.error?.asAFError {
  763. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  764. } else {
  765. XCTFail("error should not be nil")
  766. }
  767. }
  768. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  769. // Given
  770. let serializer = JSONResponseSerializer()
  771. // When
  772. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  773. // Then
  774. XCTAssertTrue(result.isSuccess)
  775. XCTAssertNotNil(result.value)
  776. XCTAssertNil(result.error)
  777. }
  778. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  779. // Given
  780. let serializer = JSONResponseSerializer()
  781. // When
  782. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  783. // Then
  784. XCTAssertTrue(result.isFailure)
  785. XCTAssertNil(result.value)
  786. XCTAssertNotNil(result.error)
  787. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  788. XCTAssertTrue(error.isJSONSerializationFailed)
  789. XCTAssertEqual(underlyingError.errorCode, 3840)
  790. } else {
  791. XCTFail("error should not be nil")
  792. }
  793. }
  794. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  795. // Given
  796. let serializer = JSONResponseSerializer()
  797. // When
  798. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  799. // Then
  800. XCTAssertTrue(result.isFailure)
  801. XCTAssertNil(result.value)
  802. XCTAssertNotNil(result.error)
  803. if let error = result.error?.asAFError {
  804. XCTAssertTrue(error.isInputFileNil)
  805. } else {
  806. XCTFail("error should not be nil")
  807. }
  808. }
  809. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  810. // Given
  811. let serializer = JSONResponseSerializer()
  812. let response = HTTPURLResponse(statusCode: 200)
  813. // When
  814. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  815. // Then
  816. XCTAssertTrue(result.isFailure)
  817. XCTAssertNil(result.value)
  818. XCTAssertNotNil(result.error)
  819. if let error = result.error?.asAFError {
  820. XCTAssertTrue(error.isInputFileNil)
  821. } else {
  822. XCTFail("error should not be nil")
  823. }
  824. }
  825. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  826. // Given
  827. let serializer = JSONResponseSerializer()
  828. let response = HTTPURLResponse(statusCode: 205)
  829. // When
  830. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  831. // Then
  832. XCTAssertTrue(result.isSuccess)
  833. XCTAssertNotNil(result.value)
  834. XCTAssertNil(result.error)
  835. if let json = result.value as? NSNull {
  836. XCTAssertEqual(json, NSNull())
  837. }
  838. }
  839. }
  840. final class CustomResponseSerializerTestCases: BaseTestCase {
  841. func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() {
  842. // Given
  843. final class UselessResponseSerializer: ResponseSerializer {
  844. func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? {
  845. return data
  846. }
  847. }
  848. let serializer = UselessResponseSerializer()
  849. let expectation = self.expectation(description: "request should finish")
  850. var data: Data?
  851. // When
  852. AF.request(URLRequest.makeHTTPBinRequest()).response(responseSerializer: serializer) { (response) in
  853. data = response.data
  854. expectation.fulfill()
  855. }
  856. waitForExpectations(timeout: timeout, handler: nil)
  857. // Then
  858. XCTAssertNotNil(data)
  859. }
  860. }
  861. extension HTTPURLResponse {
  862. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  863. let url = URL(string: "https://httpbin.org/get")!
  864. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  865. }
  866. }