ResponseSerializationTests.swift 39 KB

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