ResponseSerializationTests.swift 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  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. #if !SWIFT_PACKAGE
  535. final class DownloadResponseSerializationTestCase: BaseTestCase {
  536. // MARK: Properties
  537. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  538. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  539. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  540. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  541. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  542. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  543. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  544. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  545. // MARK: Tests - Data Response Serializer
  546. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  547. // Given
  548. let serializer = DataResponseSerializer()
  549. // When
  550. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  551. // Then
  552. XCTAssertTrue(result.isSuccess)
  553. XCTAssertNotNil(result.success)
  554. XCTAssertNil(result.failure)
  555. }
  556. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  557. // Given
  558. let serializer = DataResponseSerializer()
  559. // When
  560. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  561. // Then
  562. XCTAssertTrue(result.isFailure)
  563. XCTAssertNil(result.success)
  564. XCTAssertNotNil(result.failure)
  565. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  566. }
  567. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  568. // Given
  569. let serializer = DataResponseSerializer()
  570. // When
  571. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  572. // Then
  573. XCTAssertTrue(result.isFailure)
  574. XCTAssertNil(result.success)
  575. XCTAssertNotNil(result.failure)
  576. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  577. }
  578. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  579. // Given
  580. let serializer = DataResponseSerializer()
  581. // When
  582. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  583. // Then
  584. XCTAssertTrue(result.isFailure)
  585. XCTAssertNil(result.success)
  586. XCTAssertNotNil(result.failure)
  587. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  588. }
  589. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  590. // Given
  591. let serializer = DataResponseSerializer()
  592. // When
  593. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  594. // Then
  595. XCTAssertTrue(result.isFailure)
  596. XCTAssertNil(result.success)
  597. XCTAssertNotNil(result.failure)
  598. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  599. }
  600. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  601. // Given
  602. let serializer = DataResponseSerializer()
  603. let response = HTTPURLResponse(statusCode: 200)
  604. // When
  605. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  606. // Then
  607. XCTAssertTrue(result.isFailure)
  608. XCTAssertNil(result.success)
  609. XCTAssertNotNil(result.failure)
  610. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  611. }
  612. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  613. // Given
  614. let serializer = DataResponseSerializer()
  615. let response = HTTPURLResponse(statusCode: 205)
  616. // When
  617. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  618. // Then
  619. XCTAssertTrue(result.isSuccess)
  620. XCTAssertNotNil(result.success)
  621. XCTAssertNil(result.failure)
  622. XCTAssertEqual(result.success?.count, 0)
  623. }
  624. // MARK: Tests - String Response Serializer
  625. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  626. // Given
  627. let serializer = StringResponseSerializer()
  628. // When
  629. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  630. // Then
  631. XCTAssertTrue(result.isFailure)
  632. XCTAssertNil(result.success)
  633. XCTAssertNotNil(result.failure)
  634. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  635. }
  636. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  637. // Given
  638. let serializer = StringResponseSerializer()
  639. // When
  640. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  641. // Then
  642. XCTAssertEqual(result.isSuccess, false)
  643. XCTAssertNil(result.success)
  644. XCTAssertNotNil(result.failure)
  645. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  646. }
  647. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  648. // Given
  649. let serializer = StringResponseSerializer()
  650. // When
  651. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  652. // Then
  653. XCTAssertTrue(result.isFailure)
  654. XCTAssertNil(result.success)
  655. XCTAssertNotNil(result.failure)
  656. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  657. }
  658. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  659. // Given
  660. let serializer = StringResponseSerializer()
  661. // When
  662. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  663. // Then
  664. XCTAssertTrue(result.isSuccess)
  665. XCTAssertNotNil(result.success)
  666. XCTAssertNil(result.failure)
  667. }
  668. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  669. // Given
  670. let serializer = StringResponseSerializer(encoding: .utf8)
  671. // When
  672. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  673. // Then
  674. XCTAssertTrue(result.isSuccess)
  675. XCTAssertNotNil(result.success)
  676. XCTAssertNil(result.failure)
  677. }
  678. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  679. // Given
  680. let serializer = StringResponseSerializer()
  681. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  682. // When
  683. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  684. // Then
  685. XCTAssertTrue(result.isSuccess)
  686. XCTAssertNotNil(result.success)
  687. XCTAssertNil(result.failure)
  688. }
  689. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  690. // Given
  691. let serializer = StringResponseSerializer(encoding: .utf8)
  692. // When
  693. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  694. // Then
  695. XCTAssertTrue(result.isFailure)
  696. XCTAssertNil(result.success)
  697. XCTAssertNotNil(result.failure)
  698. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  699. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  700. }
  701. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  702. // Given
  703. let serializer = StringResponseSerializer()
  704. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  705. // When
  706. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  707. // Then
  708. XCTAssertTrue(result.isFailure)
  709. XCTAssertNil(result.success)
  710. XCTAssertNotNil(result.failure)
  711. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  712. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  713. }
  714. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  715. // Given
  716. let serializer = StringResponseSerializer()
  717. // When
  718. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  719. // Then
  720. XCTAssertTrue(result.isFailure)
  721. XCTAssertNil(result.success)
  722. XCTAssertNotNil(result.failure)
  723. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  724. }
  725. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  726. // Given
  727. let serializer = StringResponseSerializer()
  728. let response = HTTPURLResponse(statusCode: 200)
  729. // When
  730. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  731. // Then
  732. XCTAssertTrue(result.isFailure)
  733. XCTAssertNil(result.success)
  734. XCTAssertNotNil(result.failure)
  735. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  736. }
  737. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  738. // Given
  739. let serializer = StringResponseSerializer()
  740. let response = HTTPURLResponse(statusCode: 204)
  741. // When
  742. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  743. // Then
  744. XCTAssertTrue(result.isSuccess)
  745. XCTAssertNotNil(result.success)
  746. XCTAssertNil(result.failure)
  747. XCTAssertEqual(result.success, "")
  748. }
  749. // MARK: Tests - JSON Response Serializer
  750. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  751. // Given
  752. let serializer = JSONResponseSerializer()
  753. // When
  754. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  755. // Then
  756. XCTAssertTrue(result.isFailure)
  757. XCTAssertNil(result.success)
  758. XCTAssertNotNil(result.failure)
  759. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  760. }
  761. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  762. // Given
  763. let serializer = JSONResponseSerializer()
  764. // When
  765. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  766. // Then
  767. XCTAssertTrue(result.isFailure)
  768. XCTAssertNil(result.success)
  769. XCTAssertNotNil(result.failure)
  770. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  771. }
  772. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  773. // Given
  774. let serializer = JSONResponseSerializer()
  775. // When
  776. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  777. // Then
  778. XCTAssertTrue(result.isFailure)
  779. XCTAssertNil(result.success)
  780. XCTAssertNotNil(result.failure)
  781. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  782. }
  783. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  784. // Given
  785. let serializer = JSONResponseSerializer()
  786. // When
  787. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  788. // Then
  789. XCTAssertTrue(result.isSuccess)
  790. XCTAssertNotNil(result.success)
  791. XCTAssertNil(result.failure)
  792. }
  793. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  794. // Given
  795. let serializer = JSONResponseSerializer()
  796. // When
  797. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  798. // Then
  799. XCTAssertTrue(result.isFailure)
  800. XCTAssertNil(result.success)
  801. XCTAssertNotNil(result.failure)
  802. XCTAssertEqual(result.failure?.asAFError?.isJSONSerializationFailed, true)
  803. XCTAssertEqual((result.failure?.asAFError?.underlyingError as? CocoaError)?.code, .propertyListReadCorrupt)
  804. }
  805. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  806. // Given
  807. let serializer = JSONResponseSerializer()
  808. // When
  809. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  810. // Then
  811. XCTAssertTrue(result.isFailure)
  812. XCTAssertNil(result.success)
  813. XCTAssertNotNil(result.failure)
  814. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  815. }
  816. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  817. // Given
  818. let serializer = JSONResponseSerializer()
  819. let response = HTTPURLResponse(statusCode: 200)
  820. // When
  821. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  822. // Then
  823. XCTAssertTrue(result.isFailure)
  824. XCTAssertNil(result.success)
  825. XCTAssertNotNil(result.failure)
  826. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  827. }
  828. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  829. // Given
  830. let serializer = JSONResponseSerializer()
  831. let response = HTTPURLResponse(statusCode: 205)
  832. // When
  833. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  834. // Then
  835. XCTAssertTrue(result.isSuccess)
  836. XCTAssertNotNil(result.success)
  837. XCTAssertNil(result.failure)
  838. XCTAssertEqual(result.success as? NSNull, NSNull())
  839. }
  840. }
  841. #endif
  842. final class CustomResponseSerializerTests: BaseTestCase {
  843. func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() {
  844. // Given
  845. final class UselessResponseSerializer: ResponseSerializer {
  846. func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? {
  847. return data
  848. }
  849. }
  850. let serializer = UselessResponseSerializer()
  851. let expectation = self.expectation(description: "request should finish")
  852. var data: Data?
  853. // When
  854. AF.request(URLRequest.makeHTTPBinRequest()).response(responseSerializer: serializer) { response in
  855. data = response.data
  856. expectation.fulfill()
  857. }
  858. waitForExpectations(timeout: timeout, handler: nil)
  859. // Then
  860. XCTAssertNotNil(data)
  861. }
  862. }
  863. final class DataPreprocessorSerializationTests: BaseTestCase {
  864. struct DropFirst: DataPreprocessor {
  865. func preprocess(_ data: Data) throws -> Data {
  866. return data.dropFirst()
  867. }
  868. }
  869. struct Throwing: DataPreprocessor {
  870. struct Error: Swift.Error {}
  871. func preprocess(_ data: Data) throws -> Data {
  872. throw Error()
  873. }
  874. }
  875. func testThatDataResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  876. // Given
  877. let preprocessor = DropFirst()
  878. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  879. let data = Data("abcd".utf8)
  880. // When
  881. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  882. // Then
  883. XCTAssertTrue(result.isSuccess)
  884. XCTAssertEqual(result.success, Data("bcd".utf8))
  885. XCTAssertNil(result.failure)
  886. }
  887. func testThatDataResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  888. // Given
  889. let preprocessor = Throwing()
  890. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  891. let data = Data("abcd".utf8)
  892. // When
  893. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  894. // Then
  895. XCTAssertTrue(result.isFailure)
  896. XCTAssertNil(result.success)
  897. XCTAssertNotNil(result.failure)
  898. }
  899. func testThatStringResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  900. // Given
  901. let preprocessor = DropFirst()
  902. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  903. let data = Data("abcd".utf8)
  904. // When
  905. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  906. // Then
  907. XCTAssertTrue(result.isSuccess)
  908. XCTAssertEqual(result.success, "bcd")
  909. XCTAssertNil(result.failure)
  910. }
  911. func testThatStringResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  912. // Given
  913. let preprocessor = Throwing()
  914. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  915. let data = Data("abcd".utf8)
  916. // When
  917. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  918. // Then
  919. XCTAssertTrue(result.isFailure)
  920. XCTAssertNil(result.success)
  921. XCTAssertNotNil(result.failure)
  922. }
  923. func testThatJSONResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  924. // Given
  925. let preprocessor = DropFirst()
  926. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  927. let data = Data("1\"abcd\"".utf8)
  928. // When
  929. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  930. // Then
  931. XCTAssertTrue(result.isSuccess)
  932. XCTAssertEqual(result.success as? String, "abcd")
  933. XCTAssertNil(result.failure)
  934. }
  935. func testThatJSONResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  936. // Given
  937. let preprocessor = Throwing()
  938. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  939. let data = Data("1\"abcd\"".utf8)
  940. // When
  941. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  942. // Then
  943. XCTAssertTrue(result.isFailure)
  944. XCTAssertNil(result.success)
  945. XCTAssertNotNil(result.failure)
  946. }
  947. func testThatDecodableResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  948. // Given
  949. let preprocessor = DropFirst()
  950. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  951. let data = Data("1{\"string\":\"string\"}".utf8)
  952. // When
  953. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  954. // Then
  955. XCTAssertTrue(result.isSuccess)
  956. XCTAssertEqual(result.success?.string, "string")
  957. XCTAssertNil(result.failure)
  958. }
  959. func testThatDecodableResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  960. // Given
  961. let preprocessor = Throwing()
  962. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  963. let data = Data("1{\"string\":\"string\"}".utf8)
  964. // When
  965. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  966. // Then
  967. XCTAssertTrue(result.isFailure)
  968. XCTAssertNil(result.success)
  969. XCTAssertNotNil(result.failure)
  970. }
  971. }
  972. final class DataPreprocessorTests: BaseTestCase {
  973. func testThatPassthroughPreprocessorPassesDataThrough() {
  974. // Given
  975. let preprocessor = PassthroughPreprocessor()
  976. let data = Data("data".utf8)
  977. // When
  978. let result = Result { try preprocessor.preprocess(data) }
  979. // Then
  980. XCTAssertEqual(data, result.success, "Preprocessed data should equal original data.")
  981. }
  982. func testThatGoogleXSSIPreprocessorProperlyPreprocessesData() {
  983. // Given
  984. let preprocessor = GoogleXSSIPreprocessor()
  985. let data = Data(")]}',\nabcd".utf8)
  986. // When
  987. let result = Result { try preprocessor.preprocess(data) }
  988. // Then
  989. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  990. }
  991. func testThatGoogleXSSIPreprocessorDoesNotChangeDataIfPrefixDoesNotMatch() {
  992. // Given
  993. let preprocessor = GoogleXSSIPreprocessor()
  994. let data = Data("abcd".utf8)
  995. // When
  996. let result = Result { try preprocessor.preprocess(data) }
  997. // Then
  998. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  999. }
  1000. }
  1001. extension HTTPURLResponse {
  1002. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  1003. let url = URL(string: "https://httpbin.org/get")!
  1004. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  1005. }
  1006. }