ResponseSerializationTests.swift 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  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.success)
  40. XCTAssertNil(result.failure)
  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.success)
  50. XCTAssertNotNil(result.failure)
  51. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  52. }
  53. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  54. // Given
  55. let serializer = DataResponseSerializer()
  56. // When
  57. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  58. // Then
  59. XCTAssertTrue(result.isFailure)
  60. XCTAssertNil(result.success)
  61. XCTAssertNotNil(result.failure)
  62. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  63. }
  64. func testThatDataResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  65. // Given
  66. let serializer = DataResponseSerializer()
  67. let response = HTTPURLResponse(statusCode: 200)
  68. // When
  69. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  70. // Then
  71. XCTAssertTrue(result.isFailure, "result is failure should be true")
  72. XCTAssertNil(result.success, "result value should be nil")
  73. XCTAssertNotNil(result.failure, "result error should not be nil")
  74. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  75. }
  76. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  77. // Given
  78. let serializer = DataResponseSerializer()
  79. let request = URLRequest.make(method: .get)
  80. let response = HTTPURLResponse(statusCode: 204)
  81. // When
  82. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  83. // Then
  84. XCTAssertTrue(result.isSuccess)
  85. XCTAssertNotNil(result.success)
  86. XCTAssertNil(result.failure)
  87. XCTAssertEqual(result.success?.count, 0)
  88. }
  89. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  90. // Given
  91. let serializer = DataResponseSerializer()
  92. let request = URLRequest.make(method: .get)
  93. let response = HTTPURLResponse(statusCode: 205)
  94. // When
  95. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  96. // Then
  97. XCTAssertTrue(result.isSuccess)
  98. XCTAssertNotNil(result.success)
  99. XCTAssertNil(result.failure)
  100. XCTAssertEqual(result.success?.count, 0)
  101. }
  102. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  103. // Given
  104. let serializer = DataResponseSerializer()
  105. let request = URLRequest.make(method: .head)
  106. let response = HTTPURLResponse(statusCode: 200)
  107. // When
  108. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  109. // Then
  110. XCTAssertTrue(result.isSuccess)
  111. XCTAssertNotNil(result.success)
  112. XCTAssertNil(result.failure)
  113. XCTAssertEqual(result.success?.count, 0)
  114. }
  115. // MARK: StringResponseSerializer
  116. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  117. // Given
  118. let serializer = DataResponseSerializer()
  119. // When
  120. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  121. // Then
  122. XCTAssertTrue(result.isFailure)
  123. XCTAssertNil(result.success)
  124. XCTAssertNotNil(result.failure)
  125. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  126. }
  127. func testThatStringResponseSerializerFailsWhenDataIsEmpty() {
  128. // Given
  129. let serializer = StringResponseSerializer()
  130. // When
  131. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  132. // Then
  133. XCTAssertTrue(result.isFailure)
  134. XCTAssertNil(result.success)
  135. XCTAssertNotNil(result.failure)
  136. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  137. }
  138. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  139. let serializer = StringResponseSerializer()
  140. let data = Data("data".utf8)
  141. // When
  142. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  143. // Then
  144. XCTAssertTrue(result.isSuccess)
  145. XCTAssertNotNil(result.success)
  146. XCTAssertNil(result.failure)
  147. }
  148. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  149. let serializer = StringResponseSerializer(encoding: .utf8)
  150. let data = Data("data".utf8)
  151. // When
  152. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  153. // Then
  154. XCTAssertTrue(result.isSuccess)
  155. XCTAssertNotNil(result.success)
  156. XCTAssertNil(result.failure)
  157. }
  158. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  159. let serializer = StringResponseSerializer()
  160. let data = Data("data".utf8)
  161. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  162. // When
  163. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  164. // Then
  165. XCTAssertTrue(result.isSuccess)
  166. XCTAssertNotNil(result.success)
  167. XCTAssertNil(result.failure)
  168. }
  169. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  170. // Given
  171. let serializer = StringResponseSerializer(encoding: .utf8)
  172. let data = "random data".data(using: .utf32)!
  173. // When
  174. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  175. // Then
  176. XCTAssertTrue(result.isFailure)
  177. XCTAssertNil(result.success)
  178. XCTAssertNotNil(result.failure)
  179. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  180. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  181. }
  182. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  183. // Given
  184. let serializer = StringResponseSerializer()
  185. let data = "random data".data(using: .utf32)!
  186. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  187. // When
  188. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  189. // Then
  190. XCTAssertTrue(result.isFailure)
  191. XCTAssertNil(result.success)
  192. XCTAssertNotNil(result.failure)
  193. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  194. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  195. }
  196. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  197. // Given
  198. let serializer = StringResponseSerializer()
  199. // When
  200. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  201. // Then
  202. XCTAssertTrue(result.isFailure)
  203. XCTAssertNil(result.success)
  204. XCTAssertNotNil(result.failure)
  205. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  206. }
  207. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  208. // Given
  209. let serializer = StringResponseSerializer()
  210. let response = HTTPURLResponse(statusCode: 200)
  211. // When
  212. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  213. // Then
  214. XCTAssertTrue(result.isFailure)
  215. XCTAssertNil(result.success)
  216. XCTAssertNotNil(result.failure)
  217. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  218. }
  219. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  220. // Given
  221. let serializer = StringResponseSerializer()
  222. let request = URLRequest.make(method: .get)
  223. let response = HTTPURLResponse(statusCode: 204)
  224. // When
  225. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  226. // Then
  227. XCTAssertTrue(result.isSuccess)
  228. XCTAssertNotNil(result.success)
  229. XCTAssertNil(result.failure)
  230. XCTAssertEqual(result.success, "")
  231. }
  232. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  233. // Given
  234. let serializer = StringResponseSerializer()
  235. let request = URLRequest.make(method: .get)
  236. let response = HTTPURLResponse(statusCode: 205)
  237. // When
  238. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  239. // Then
  240. XCTAssertTrue(result.isSuccess)
  241. XCTAssertNotNil(result.success)
  242. XCTAssertNil(result.failure)
  243. XCTAssertEqual(result.success, "")
  244. }
  245. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  246. // Given
  247. let serializer = StringResponseSerializer()
  248. let request = URLRequest.make(method: .head)
  249. let response = HTTPURLResponse(statusCode: 200)
  250. // When
  251. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  252. // Then
  253. XCTAssertTrue(result.isSuccess)
  254. XCTAssertNotNil(result.success)
  255. XCTAssertNil(result.failure)
  256. XCTAssertEqual(result.success, "")
  257. }
  258. // MARK: JSONResponseSerializer
  259. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  260. // Given
  261. let serializer = JSONResponseSerializer()
  262. // When
  263. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  264. // Then
  265. XCTAssertTrue(result.isFailure)
  266. XCTAssertNil(result.success)
  267. XCTAssertNotNil(result.failure)
  268. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  269. }
  270. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  271. // Given
  272. let serializer = JSONResponseSerializer()
  273. // When
  274. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  275. // Then
  276. XCTAssertTrue(result.isFailure)
  277. XCTAssertNil(result.success)
  278. XCTAssertNotNil(result.failure)
  279. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  280. }
  281. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  282. // Given
  283. let serializer = JSONResponseSerializer()
  284. let data = Data("{\"json\": true}".utf8)
  285. // When
  286. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  287. // Then
  288. XCTAssertTrue(result.isSuccess)
  289. XCTAssertNotNil(result.success)
  290. XCTAssertNil(result.failure)
  291. }
  292. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  293. // Given
  294. let serializer = JSONResponseSerializer()
  295. let data = Data("definitely not valid json".utf8)
  296. // When
  297. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  298. // Then
  299. XCTAssertTrue(result.isFailure)
  300. XCTAssertNil(result.success)
  301. XCTAssertNotNil(result.failure)
  302. XCTAssertEqual(result.failure?.asAFError?.isJSONSerializationFailed, true)
  303. XCTAssertEqual((result.failure?.asAFError?.underlyingError as? CocoaError)?.code, .propertyListReadCorrupt)
  304. }
  305. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  306. // Given
  307. let serializer = JSONResponseSerializer()
  308. // When
  309. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  310. // Then
  311. XCTAssertTrue(result.isFailure)
  312. XCTAssertNil(result.success)
  313. XCTAssertNotNil(result.failure)
  314. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  315. }
  316. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  317. // Given
  318. let serializer = JSONResponseSerializer()
  319. let response = HTTPURLResponse(statusCode: 200)
  320. // When
  321. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  322. // Then
  323. XCTAssertTrue(result.isFailure)
  324. XCTAssertNil(result.success)
  325. XCTAssertNotNil(result.failure)
  326. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  327. }
  328. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  329. // Given
  330. let serializer = JSONResponseSerializer()
  331. let request = URLRequest.make(method: .get)
  332. let response = HTTPURLResponse(statusCode: 204)
  333. // When
  334. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  335. // Then
  336. XCTAssertTrue(result.isSuccess)
  337. XCTAssertNotNil(result.success)
  338. XCTAssertNil(result.failure)
  339. XCTAssertEqual(result.success as? NSNull, NSNull())
  340. }
  341. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  342. // Given
  343. let serializer = JSONResponseSerializer()
  344. let request = URLRequest.make(method: .get)
  345. let response = HTTPURLResponse(statusCode: 205)
  346. // When
  347. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  348. // Then
  349. XCTAssertTrue(result.isSuccess)
  350. XCTAssertNotNil(result.success)
  351. XCTAssertNil(result.failure)
  352. XCTAssertEqual(result.success as? NSNull, NSNull())
  353. }
  354. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  355. // Given
  356. let serializer = JSONResponseSerializer()
  357. let request = URLRequest.make(method: .head)
  358. let response = HTTPURLResponse(statusCode: 200)
  359. // When
  360. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  361. // Then
  362. XCTAssertTrue(result.isSuccess)
  363. XCTAssertNotNil(result.success)
  364. XCTAssertNil(result.failure)
  365. XCTAssertEqual(result.success as? NSNull, NSNull())
  366. }
  367. }
  368. // MARK: -
  369. // used by testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode
  370. extension Bool: EmptyResponse {
  371. public static func emptyValue() -> Bool {
  372. return true
  373. }
  374. }
  375. final class DecodableResponseSerializerTests: BaseTestCase {
  376. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  377. struct DecodableValue: Decodable, EmptyResponse {
  378. static func emptyValue() -> DecodableValue {
  379. return DecodableValue(string: "")
  380. }
  381. let string: String
  382. }
  383. func testThatDecodableResponseSerializerFailsWhenDataIsNil() {
  384. // Given
  385. let serializer = DecodableResponseSerializer<DecodableValue>()
  386. // When
  387. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  388. // Then
  389. XCTAssertTrue(result.isFailure)
  390. XCTAssertNil(result.success)
  391. XCTAssertNotNil(result.failure)
  392. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  393. }
  394. func testThatDecodableResponseSerializerFailsWhenDataIsEmpty() {
  395. // Given
  396. let serializer = DecodableResponseSerializer<DecodableValue>()
  397. // When
  398. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  399. // Then
  400. XCTAssertTrue(result.isFailure)
  401. XCTAssertNil(result.success)
  402. XCTAssertNotNil(result.failure)
  403. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  404. }
  405. func testThatDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  406. // Given
  407. let data = Data("{\"string\":\"string\"}".utf8)
  408. let serializer = DecodableResponseSerializer<DecodableValue>()
  409. // When
  410. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  411. // Then
  412. XCTAssertTrue(result.isSuccess)
  413. XCTAssertNotNil(result.success)
  414. XCTAssertEqual(result.success?.string, "string")
  415. XCTAssertNil(result.failure)
  416. }
  417. func testThatDecodableResponseSerializerFailsWhenDataIsInvalidRepresentation() {
  418. // Given
  419. let serializer = DecodableResponseSerializer<DecodableValue>()
  420. let data = Data("definitely not valid".utf8)
  421. // When
  422. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  423. // Then
  424. XCTAssertTrue(result.isFailure)
  425. XCTAssertNil(result.success)
  426. XCTAssertNotNil(result.failure)
  427. }
  428. func testThatDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  429. // Given
  430. let serializer = DecodableResponseSerializer<DecodableValue>()
  431. // When
  432. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  433. // Then
  434. XCTAssertTrue(result.isFailure)
  435. XCTAssertNil(result.success)
  436. XCTAssertNotNil(result.failure)
  437. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  438. }
  439. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  440. // Given
  441. let serializer = DecodableResponseSerializer<DecodableValue>()
  442. let response = HTTPURLResponse(statusCode: 200)
  443. // When
  444. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  445. // Then
  446. XCTAssertTrue(result.isFailure)
  447. XCTAssertNil(result.success)
  448. XCTAssertNotNil(result.failure)
  449. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  450. }
  451. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  452. // Given
  453. let serializer = DecodableResponseSerializer<DecodableValue>()
  454. let response = HTTPURLResponse(statusCode: 204)
  455. // When
  456. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  457. // Then
  458. XCTAssertTrue(result.isSuccess)
  459. XCTAssertNotNil(result.success)
  460. XCTAssertNil(result.failure)
  461. }
  462. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyTypeAndEmptyResponseStatusCode() {
  463. // Given
  464. let serializer = DecodableResponseSerializer<Empty>()
  465. let response = HTTPURLResponse(statusCode: 204)
  466. // When
  467. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  468. // Then
  469. XCTAssertTrue(result.isSuccess)
  470. XCTAssertNotNil(result.success)
  471. XCTAssertNil(result.failure)
  472. }
  473. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  474. // Given
  475. let serializer = DecodableResponseSerializer<Empty>()
  476. let request = URLRequest.make(method: .get)
  477. let response = HTTPURLResponse(statusCode: 204)
  478. // When
  479. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  480. // Then
  481. XCTAssertTrue(result.isSuccess)
  482. XCTAssertNotNil(result.success)
  483. XCTAssertNil(result.failure)
  484. }
  485. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  486. // Given
  487. let serializer = DecodableResponseSerializer<Empty>()
  488. let request = URLRequest.make(method: .get)
  489. let response = HTTPURLResponse(statusCode: 205)
  490. // When
  491. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  492. // Then
  493. XCTAssertTrue(result.isSuccess)
  494. XCTAssertNotNil(result.success)
  495. XCTAssertNil(result.failure)
  496. }
  497. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  498. // Given
  499. let serializer = DecodableResponseSerializer<Empty>()
  500. let request = URLRequest.make(method: .head)
  501. let response = HTTPURLResponse(statusCode: 200)
  502. // When
  503. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  504. // Then
  505. XCTAssertTrue(result.isSuccess)
  506. XCTAssertNotNil(result.success)
  507. XCTAssertNil(result.failure)
  508. }
  509. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode() {
  510. // Given
  511. let serializer = DecodableResponseSerializer<Bool>()
  512. let response = HTTPURLResponse(statusCode: 204)
  513. // When
  514. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  515. // Then
  516. XCTAssertTrue(result.isSuccess)
  517. XCTAssertNotNil(result.success)
  518. XCTAssertNil(result.failure)
  519. }
  520. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithEmptyResponseNonconformingTypeAndEmptyResponseStatusCode() {
  521. // Given
  522. let serializer = DecodableResponseSerializer<Int>()
  523. let response = HTTPURLResponse(statusCode: 204)
  524. // When
  525. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  526. // Then
  527. XCTAssertTrue(result.isFailure)
  528. XCTAssertNil(result.success)
  529. XCTAssertNotNil(result.failure)
  530. XCTAssertEqual(result.failure?.asAFError?.isInvalidEmptyResponse, true)
  531. }
  532. }
  533. // MARK: -
  534. final class DownloadResponseSerializationTestCase: BaseTestCase {
  535. // MARK: Properties
  536. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  537. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  538. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  539. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  540. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  541. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  542. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  543. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  544. // MARK: Tests - Data Response Serializer
  545. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  546. // Given
  547. let serializer = DataResponseSerializer()
  548. // When
  549. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  550. // Then
  551. XCTAssertTrue(result.isSuccess)
  552. XCTAssertNotNil(result.success)
  553. XCTAssertNil(result.failure)
  554. }
  555. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  556. // Given
  557. let serializer = DataResponseSerializer()
  558. // When
  559. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  560. // Then
  561. XCTAssertTrue(result.isFailure)
  562. XCTAssertNil(result.success)
  563. XCTAssertNotNil(result.failure)
  564. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  565. }
  566. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  567. // Given
  568. let serializer = DataResponseSerializer()
  569. // When
  570. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  571. // Then
  572. XCTAssertTrue(result.isFailure)
  573. XCTAssertNil(result.success)
  574. XCTAssertNotNil(result.failure)
  575. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  576. }
  577. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  578. // Given
  579. let serializer = DataResponseSerializer()
  580. // When
  581. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  582. // Then
  583. XCTAssertTrue(result.isFailure)
  584. XCTAssertNil(result.success)
  585. XCTAssertNotNil(result.failure)
  586. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  587. }
  588. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  589. // Given
  590. let serializer = DataResponseSerializer()
  591. // When
  592. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  593. // Then
  594. XCTAssertTrue(result.isFailure)
  595. XCTAssertNil(result.success)
  596. XCTAssertNotNil(result.failure)
  597. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  598. }
  599. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  600. // Given
  601. let serializer = DataResponseSerializer()
  602. let response = HTTPURLResponse(statusCode: 200)
  603. // When
  604. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  605. // Then
  606. XCTAssertTrue(result.isFailure)
  607. XCTAssertNil(result.success)
  608. XCTAssertNotNil(result.failure)
  609. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  610. }
  611. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  612. // Given
  613. let serializer = DataResponseSerializer()
  614. let response = HTTPURLResponse(statusCode: 205)
  615. // When
  616. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  617. // Then
  618. XCTAssertTrue(result.isSuccess)
  619. XCTAssertNotNil(result.success)
  620. XCTAssertNil(result.failure)
  621. XCTAssertEqual(result.success?.count, 0)
  622. }
  623. // MARK: Tests - String Response Serializer
  624. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  625. // Given
  626. let serializer = StringResponseSerializer()
  627. // When
  628. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  629. // Then
  630. XCTAssertTrue(result.isFailure)
  631. XCTAssertNil(result.success)
  632. XCTAssertNotNil(result.failure)
  633. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  634. }
  635. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  636. // Given
  637. let serializer = StringResponseSerializer()
  638. // When
  639. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  640. // Then
  641. XCTAssertEqual(result.isSuccess, false)
  642. XCTAssertNil(result.success)
  643. XCTAssertNotNil(result.failure)
  644. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  645. }
  646. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  647. // Given
  648. let serializer = StringResponseSerializer()
  649. // When
  650. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  651. // Then
  652. XCTAssertTrue(result.isFailure)
  653. XCTAssertNil(result.success)
  654. XCTAssertNotNil(result.failure)
  655. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  656. }
  657. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  658. // Given
  659. let serializer = StringResponseSerializer()
  660. // When
  661. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  662. // Then
  663. XCTAssertTrue(result.isSuccess)
  664. XCTAssertNotNil(result.success)
  665. XCTAssertNil(result.failure)
  666. }
  667. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  668. // Given
  669. let serializer = StringResponseSerializer(encoding: .utf8)
  670. // When
  671. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  672. // Then
  673. XCTAssertTrue(result.isSuccess)
  674. XCTAssertNotNil(result.success)
  675. XCTAssertNil(result.failure)
  676. }
  677. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  678. // Given
  679. let serializer = StringResponseSerializer()
  680. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  681. // When
  682. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  683. // Then
  684. XCTAssertTrue(result.isSuccess)
  685. XCTAssertNotNil(result.success)
  686. XCTAssertNil(result.failure)
  687. }
  688. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  689. // Given
  690. let serializer = StringResponseSerializer(encoding: .utf8)
  691. // When
  692. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  693. // Then
  694. XCTAssertTrue(result.isFailure)
  695. XCTAssertNil(result.success)
  696. XCTAssertNotNil(result.failure)
  697. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  698. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  699. }
  700. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  701. // Given
  702. let serializer = StringResponseSerializer()
  703. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  704. // When
  705. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  706. // Then
  707. XCTAssertTrue(result.isFailure)
  708. XCTAssertNil(result.success)
  709. XCTAssertNotNil(result.failure)
  710. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  711. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  712. }
  713. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  714. // Given
  715. let serializer = StringResponseSerializer()
  716. // When
  717. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  718. // Then
  719. XCTAssertTrue(result.isFailure)
  720. XCTAssertNil(result.success)
  721. XCTAssertNotNil(result.failure)
  722. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  723. }
  724. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  725. // Given
  726. let serializer = StringResponseSerializer()
  727. let response = HTTPURLResponse(statusCode: 200)
  728. // When
  729. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  730. // Then
  731. XCTAssertTrue(result.isFailure)
  732. XCTAssertNil(result.success)
  733. XCTAssertNotNil(result.failure)
  734. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  735. }
  736. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  737. // Given
  738. let serializer = StringResponseSerializer()
  739. let response = HTTPURLResponse(statusCode: 204)
  740. // When
  741. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  742. // Then
  743. XCTAssertTrue(result.isSuccess)
  744. XCTAssertNotNil(result.success)
  745. XCTAssertNil(result.failure)
  746. XCTAssertEqual(result.success, "")
  747. }
  748. // MARK: Tests - JSON Response Serializer
  749. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  750. // Given
  751. let serializer = JSONResponseSerializer()
  752. // When
  753. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  754. // Then
  755. XCTAssertTrue(result.isFailure)
  756. XCTAssertNil(result.success)
  757. XCTAssertNotNil(result.failure)
  758. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  759. }
  760. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  761. // Given
  762. let serializer = JSONResponseSerializer()
  763. // When
  764. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  765. // Then
  766. XCTAssertTrue(result.isFailure)
  767. XCTAssertNil(result.success)
  768. XCTAssertNotNil(result.failure)
  769. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  770. }
  771. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  772. // Given
  773. let serializer = JSONResponseSerializer()
  774. // When
  775. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  776. // Then
  777. XCTAssertTrue(result.isFailure)
  778. XCTAssertNil(result.success)
  779. XCTAssertNotNil(result.failure)
  780. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  781. }
  782. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  783. // Given
  784. let serializer = JSONResponseSerializer()
  785. // When
  786. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  787. // Then
  788. XCTAssertTrue(result.isSuccess)
  789. XCTAssertNotNil(result.success)
  790. XCTAssertNil(result.failure)
  791. }
  792. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  793. // Given
  794. let serializer = JSONResponseSerializer()
  795. // When
  796. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  797. // Then
  798. XCTAssertTrue(result.isFailure)
  799. XCTAssertNil(result.success)
  800. XCTAssertNotNil(result.failure)
  801. XCTAssertEqual(result.failure?.asAFError?.isJSONSerializationFailed, true)
  802. XCTAssertEqual((result.failure?.asAFError?.underlyingError as? CocoaError)?.code, .propertyListReadCorrupt)
  803. }
  804. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  805. // Given
  806. let serializer = JSONResponseSerializer()
  807. // When
  808. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  809. // Then
  810. XCTAssertTrue(result.isFailure)
  811. XCTAssertNil(result.success)
  812. XCTAssertNotNil(result.failure)
  813. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  814. }
  815. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  816. // Given
  817. let serializer = JSONResponseSerializer()
  818. let response = HTTPURLResponse(statusCode: 200)
  819. // When
  820. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  821. // Then
  822. XCTAssertTrue(result.isFailure)
  823. XCTAssertNil(result.success)
  824. XCTAssertNotNil(result.failure)
  825. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  826. }
  827. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  828. // Given
  829. let serializer = JSONResponseSerializer()
  830. let response = HTTPURLResponse(statusCode: 205)
  831. // When
  832. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  833. // Then
  834. XCTAssertTrue(result.isSuccess)
  835. XCTAssertNotNil(result.success)
  836. XCTAssertNil(result.failure)
  837. XCTAssertEqual(result.success as? NSNull, NSNull())
  838. }
  839. }
  840. final class CustomResponseSerializerTests: 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. final class DataPreprocessorSerializationTests: BaseTestCase {
  862. struct DropFirst: DataPreprocessor {
  863. func preprocess(_ data: Data) throws -> Data {
  864. return data.dropFirst()
  865. }
  866. }
  867. struct Throwing: DataPreprocessor {
  868. struct Error: Swift.Error {}
  869. func preprocess(_ data: Data) throws -> Data {
  870. throw Error()
  871. }
  872. }
  873. func testThatDataResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  874. // Given
  875. let preprocessor = DropFirst()
  876. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  877. let data = Data("abcd".utf8)
  878. // When
  879. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  880. // Then
  881. XCTAssertTrue(result.isSuccess)
  882. XCTAssertEqual(result.success, Data("bcd".utf8))
  883. XCTAssertNil(result.failure)
  884. }
  885. func testThatDataResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  886. // Given
  887. let preprocessor = Throwing()
  888. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  889. let data = Data("abcd".utf8)
  890. // When
  891. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  892. // Then
  893. XCTAssertTrue(result.isFailure)
  894. XCTAssertNil(result.success)
  895. XCTAssertNotNil(result.failure)
  896. }
  897. func testThatStringResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  898. // Given
  899. let preprocessor = DropFirst()
  900. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  901. let data = Data("abcd".utf8)
  902. // When
  903. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  904. // Then
  905. XCTAssertTrue(result.isSuccess)
  906. XCTAssertEqual(result.success, "bcd")
  907. XCTAssertNil(result.failure)
  908. }
  909. func testThatStringResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  910. // Given
  911. let preprocessor = Throwing()
  912. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  913. let data = Data("abcd".utf8)
  914. // When
  915. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  916. // Then
  917. XCTAssertTrue(result.isFailure)
  918. XCTAssertNil(result.success)
  919. XCTAssertNotNil(result.failure)
  920. }
  921. func testThatJSONResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  922. // Given
  923. let preprocessor = DropFirst()
  924. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  925. let data = Data("1\"abcd\"".utf8)
  926. // When
  927. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  928. // Then
  929. XCTAssertTrue(result.isSuccess)
  930. XCTAssertEqual(result.success as? String, "abcd")
  931. XCTAssertNil(result.failure)
  932. }
  933. func testThatJSONResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  934. // Given
  935. let preprocessor = Throwing()
  936. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  937. let data = Data("1\"abcd\"".utf8)
  938. // When
  939. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  940. // Then
  941. XCTAssertTrue(result.isFailure)
  942. XCTAssertNil(result.success)
  943. XCTAssertNotNil(result.failure)
  944. }
  945. func testThatDecodableResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  946. // Given
  947. let preprocessor = DropFirst()
  948. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  949. let data = Data("1{\"string\":\"string\"}".utf8)
  950. // When
  951. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  952. // Then
  953. XCTAssertTrue(result.isSuccess)
  954. XCTAssertEqual(result.success?.string, "string")
  955. XCTAssertNil(result.failure)
  956. }
  957. func testThatDecodableResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  958. // Given
  959. let preprocessor = Throwing()
  960. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  961. let data = Data("1{\"string\":\"string\"}".utf8)
  962. // When
  963. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  964. // Then
  965. XCTAssertTrue(result.isFailure)
  966. XCTAssertNil(result.success)
  967. XCTAssertNotNil(result.failure)
  968. }
  969. }
  970. final class DataPreprocessorTests: BaseTestCase {
  971. func testThatPassthroughPreprocessorPassesDataThrough() {
  972. // Given
  973. let preprocessor = PassthroughPreprocessor()
  974. let data = Data("data".utf8)
  975. // When
  976. let result = Result { try preprocessor.preprocess(data) }
  977. // Then
  978. XCTAssertEqual(data, result.success, "Preprocessed data should equal original data.")
  979. }
  980. func testThatGoogleXSSIPreprocessorProperlyPreprocessesData() {
  981. // Given
  982. let preprocessor = GoogleXSSIPreprocessor()
  983. let data = Data(")]}',\nabcd".utf8)
  984. // When
  985. let result = Result { try preprocessor.preprocess(data) }
  986. // Then
  987. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  988. }
  989. func testThatGoogleXSSIPreprocessorDoesNotChangeDataIfPrefixDoesNotMatch() {
  990. // Given
  991. let preprocessor = GoogleXSSIPreprocessor()
  992. let data = Data("abcd".utf8)
  993. // When
  994. let result = Result { try preprocessor.preprocess(data) }
  995. // Then
  996. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  997. }
  998. }
  999. extension HTTPURLResponse {
  1000. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  1001. let url = URL(string: "https://httpbin.org/get")!
  1002. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  1003. }
  1004. }