ResponseSerializationTests.swift 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014-2020 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 = Endpoint().urlRequest
  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 = Endpoint().urlRequest
  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 = Endpoint(method: .head).urlRequest
  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 = Endpoint().urlRequest
  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 = Endpoint().urlRequest
  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 = Endpoint(method: .head).urlRequest
  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 = Endpoint().urlRequest
  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 = Endpoint().urlRequest
  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 = Endpoint(method: .head).urlRequest
  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. final class URLResponseSerializerTests: BaseTestCase {
  370. func testThatURLResponseSerializerProducesURLOnSuccess() {
  371. // Given
  372. let serializer = URLResponseSerializer()
  373. let request = Endpoint().urlRequest
  374. let response = HTTPURLResponse(statusCode: 200)
  375. let url = URL(fileURLWithPath: "/")
  376. // When
  377. let result = Result { try serializer.serializeDownload(request: request,
  378. response: response,
  379. fileURL: url,
  380. error: nil) }
  381. // Then
  382. XCTAssertEqual(result.success, url)
  383. }
  384. func testThatURLResponseSerializerProducesErrorFromIncomingErrors() {
  385. // Given
  386. let serializer = URLResponseSerializer()
  387. let request = Endpoint().urlRequest
  388. let response = HTTPURLResponse(statusCode: 200)
  389. let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 404))
  390. // When
  391. let result = Result { try serializer.serializeDownload(request: request,
  392. response: response,
  393. fileURL: nil,
  394. error: error) }
  395. // Then
  396. XCTAssertEqual(result.failure?.localizedDescription, error.localizedDescription)
  397. }
  398. func testThatURLResponseSerializerProducesInputFileNilErrorWhenNoURL() {
  399. // Given
  400. let serializer = URLResponseSerializer()
  401. let request = Endpoint().urlRequest
  402. let response = HTTPURLResponse(statusCode: 200)
  403. // When
  404. let result = Result { try serializer.serializeDownload(request: request,
  405. response: response,
  406. fileURL: nil,
  407. error: nil) }
  408. // Then
  409. XCTAssertTrue(result.failure?.asAFError?.isInputFileNil == true)
  410. }
  411. }
  412. // MARK: -
  413. // used by testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode
  414. extension Bool: EmptyResponse {
  415. public static func emptyValue() -> Bool {
  416. true
  417. }
  418. }
  419. final class DecodableResponseSerializerTests: BaseTestCase {
  420. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  421. struct DecodableValue: Decodable, EmptyResponse {
  422. static func emptyValue() -> DecodableValue {
  423. DecodableValue(string: "")
  424. }
  425. let string: String
  426. }
  427. func testThatDecodableResponseSerializerFailsWhenDataIsNil() {
  428. // Given
  429. let serializer = DecodableResponseSerializer<DecodableValue>()
  430. // When
  431. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  432. // Then
  433. XCTAssertTrue(result.isFailure)
  434. XCTAssertNil(result.success)
  435. XCTAssertNotNil(result.failure)
  436. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  437. }
  438. func testThatDecodableResponseSerializerFailsWhenDataIsEmpty() {
  439. // Given
  440. let serializer = DecodableResponseSerializer<DecodableValue>()
  441. // When
  442. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  443. // Then
  444. XCTAssertTrue(result.isFailure)
  445. XCTAssertNil(result.success)
  446. XCTAssertNotNil(result.failure)
  447. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  448. }
  449. func testThatDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  450. // Given
  451. let data = Data("{\"string\":\"string\"}".utf8)
  452. let serializer = DecodableResponseSerializer<DecodableValue>()
  453. // When
  454. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  455. // Then
  456. XCTAssertTrue(result.isSuccess)
  457. XCTAssertNotNil(result.success)
  458. XCTAssertEqual(result.success?.string, "string")
  459. XCTAssertNil(result.failure)
  460. }
  461. func testThatDecodableResponseSerializerFailsWhenDataIsInvalidRepresentation() {
  462. // Given
  463. let serializer = DecodableResponseSerializer<DecodableValue>()
  464. let data = Data("definitely not valid".utf8)
  465. // When
  466. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  467. // Then
  468. XCTAssertTrue(result.isFailure)
  469. XCTAssertNil(result.success)
  470. XCTAssertNotNil(result.failure)
  471. }
  472. func testThatDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  473. // Given
  474. let serializer = DecodableResponseSerializer<DecodableValue>()
  475. // When
  476. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  477. // Then
  478. XCTAssertTrue(result.isFailure)
  479. XCTAssertNil(result.success)
  480. XCTAssertNotNil(result.failure)
  481. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  482. }
  483. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  484. // Given
  485. let serializer = DecodableResponseSerializer<DecodableValue>()
  486. let response = HTTPURLResponse(statusCode: 200)
  487. // When
  488. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  489. // Then
  490. XCTAssertTrue(result.isFailure)
  491. XCTAssertNil(result.success)
  492. XCTAssertNotNil(result.failure)
  493. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  494. }
  495. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  496. // Given
  497. let serializer = DecodableResponseSerializer<DecodableValue>()
  498. let response = HTTPURLResponse(statusCode: 204)
  499. // When
  500. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  501. // Then
  502. XCTAssertTrue(result.isSuccess)
  503. XCTAssertNotNil(result.success)
  504. XCTAssertNil(result.failure)
  505. }
  506. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyTypeAndEmptyResponseStatusCode() {
  507. // Given
  508. let serializer = DecodableResponseSerializer<Empty>()
  509. let response = HTTPURLResponse(statusCode: 204)
  510. // When
  511. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  512. // Then
  513. XCTAssertTrue(result.isSuccess)
  514. XCTAssertNotNil(result.success)
  515. XCTAssertNil(result.failure)
  516. }
  517. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  518. // Given
  519. let serializer = DecodableResponseSerializer<Empty>()
  520. let request = Endpoint().urlRequest
  521. let response = HTTPURLResponse(statusCode: 204)
  522. // When
  523. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  524. // Then
  525. XCTAssertTrue(result.isSuccess)
  526. XCTAssertNotNil(result.success)
  527. XCTAssertNil(result.failure)
  528. }
  529. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  530. // Given
  531. let serializer = DecodableResponseSerializer<Empty>()
  532. let request = Endpoint().urlRequest
  533. let response = HTTPURLResponse(statusCode: 205)
  534. // When
  535. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  536. // Then
  537. XCTAssertTrue(result.isSuccess)
  538. XCTAssertNotNil(result.success)
  539. XCTAssertNil(result.failure)
  540. }
  541. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  542. // Given
  543. let serializer = DecodableResponseSerializer<Empty>()
  544. let request = Endpoint(method: .head).urlRequest
  545. let response = HTTPURLResponse(statusCode: 200)
  546. // When
  547. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  548. // Then
  549. XCTAssertTrue(result.isSuccess)
  550. XCTAssertNotNil(result.success)
  551. XCTAssertNil(result.failure)
  552. }
  553. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode() {
  554. // Given
  555. let serializer = DecodableResponseSerializer<Bool>()
  556. let response = HTTPURLResponse(statusCode: 204)
  557. // When
  558. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  559. // Then
  560. XCTAssertTrue(result.isSuccess)
  561. XCTAssertNotNil(result.success)
  562. XCTAssertNil(result.failure)
  563. }
  564. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithEmptyResponseNonconformingTypeAndEmptyResponseStatusCode() {
  565. // Given
  566. let serializer = DecodableResponseSerializer<Int>()
  567. let response = HTTPURLResponse(statusCode: 204)
  568. // When
  569. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  570. // Then
  571. XCTAssertTrue(result.isFailure)
  572. XCTAssertNil(result.success)
  573. XCTAssertNotNil(result.failure)
  574. XCTAssertEqual(result.failure?.asAFError?.isInvalidEmptyResponse, true)
  575. }
  576. }
  577. // MARK: -
  578. #if !SWIFT_PACKAGE
  579. final class DownloadResponseSerializationTestCase: BaseTestCase {
  580. // MARK: Properties
  581. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  582. private var jsonEmptyDataFileURL: URL { url(forResource: "empty_data", withExtension: "json") }
  583. private var jsonValidDataFileURL: URL { url(forResource: "valid_data", withExtension: "json") }
  584. private var jsonInvalidDataFileURL: URL { url(forResource: "invalid_data", withExtension: "json") }
  585. private var stringEmptyDataFileURL: URL { url(forResource: "empty_string", withExtension: "txt") }
  586. private var stringUTF8DataFileURL: URL { url(forResource: "utf8_string", withExtension: "txt") }
  587. private var stringUTF32DataFileURL: URL { url(forResource: "utf32_string", withExtension: "txt") }
  588. private var invalidFileURL: URL { URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  589. // MARK: Tests - Data Response Serializer
  590. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  591. // Given
  592. let serializer = DataResponseSerializer()
  593. // When
  594. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  595. // Then
  596. XCTAssertTrue(result.isSuccess)
  597. XCTAssertNotNil(result.success)
  598. XCTAssertNil(result.failure)
  599. }
  600. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  601. // Given
  602. let serializer = DataResponseSerializer()
  603. // When
  604. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  605. // Then
  606. XCTAssertTrue(result.isFailure)
  607. XCTAssertNil(result.success)
  608. XCTAssertNotNil(result.failure)
  609. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  610. }
  611. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  612. // Given
  613. let serializer = DataResponseSerializer()
  614. // When
  615. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  616. // Then
  617. XCTAssertTrue(result.isFailure)
  618. XCTAssertNil(result.success)
  619. XCTAssertNotNil(result.failure)
  620. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  621. }
  622. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  623. // Given
  624. let serializer = DataResponseSerializer()
  625. // When
  626. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  627. // Then
  628. XCTAssertTrue(result.isFailure)
  629. XCTAssertNil(result.success)
  630. XCTAssertNotNil(result.failure)
  631. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  632. }
  633. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  634. // Given
  635. let serializer = DataResponseSerializer()
  636. // When
  637. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  638. // Then
  639. XCTAssertTrue(result.isFailure)
  640. XCTAssertNil(result.success)
  641. XCTAssertNotNil(result.failure)
  642. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  643. }
  644. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  645. // Given
  646. let serializer = DataResponseSerializer()
  647. let response = HTTPURLResponse(statusCode: 200)
  648. // When
  649. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  650. // Then
  651. XCTAssertTrue(result.isFailure)
  652. XCTAssertNil(result.success)
  653. XCTAssertNotNil(result.failure)
  654. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  655. }
  656. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  657. // Given
  658. let serializer = DataResponseSerializer()
  659. let response = HTTPURLResponse(statusCode: 205)
  660. // When
  661. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  662. // Then
  663. XCTAssertTrue(result.isSuccess)
  664. XCTAssertNotNil(result.success)
  665. XCTAssertNil(result.failure)
  666. XCTAssertEqual(result.success?.count, 0)
  667. }
  668. // MARK: Tests - String Response Serializer
  669. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  670. // Given
  671. let serializer = StringResponseSerializer()
  672. // When
  673. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  674. // Then
  675. XCTAssertTrue(result.isFailure)
  676. XCTAssertNil(result.success)
  677. XCTAssertNotNil(result.failure)
  678. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  679. }
  680. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  681. // Given
  682. let serializer = StringResponseSerializer()
  683. // When
  684. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  685. // Then
  686. XCTAssertEqual(result.isSuccess, false)
  687. XCTAssertNil(result.success)
  688. XCTAssertNotNil(result.failure)
  689. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  690. }
  691. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  692. // Given
  693. let serializer = StringResponseSerializer()
  694. // When
  695. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  696. // Then
  697. XCTAssertTrue(result.isFailure)
  698. XCTAssertNil(result.success)
  699. XCTAssertNotNil(result.failure)
  700. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  701. }
  702. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  703. // Given
  704. let serializer = StringResponseSerializer()
  705. // When
  706. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  707. // Then
  708. XCTAssertTrue(result.isSuccess)
  709. XCTAssertNotNil(result.success)
  710. XCTAssertNil(result.failure)
  711. }
  712. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  713. // Given
  714. let serializer = StringResponseSerializer(encoding: .utf8)
  715. // When
  716. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  717. // Then
  718. XCTAssertTrue(result.isSuccess)
  719. XCTAssertNotNil(result.success)
  720. XCTAssertNil(result.failure)
  721. }
  722. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  723. // Given
  724. let serializer = StringResponseSerializer()
  725. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  726. // When
  727. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  728. // Then
  729. XCTAssertTrue(result.isSuccess)
  730. XCTAssertNotNil(result.success)
  731. XCTAssertNil(result.failure)
  732. }
  733. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  734. // Given
  735. let serializer = StringResponseSerializer(encoding: .utf8)
  736. // When
  737. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  738. // Then
  739. XCTAssertTrue(result.isFailure)
  740. XCTAssertNil(result.success)
  741. XCTAssertNotNil(result.failure)
  742. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  743. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  744. }
  745. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  746. // Given
  747. let serializer = StringResponseSerializer()
  748. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  749. // When
  750. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  751. // Then
  752. XCTAssertTrue(result.isFailure)
  753. XCTAssertNil(result.success)
  754. XCTAssertNotNil(result.failure)
  755. XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true)
  756. XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8)
  757. }
  758. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  759. // Given
  760. let serializer = StringResponseSerializer()
  761. // When
  762. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  763. // Then
  764. XCTAssertTrue(result.isFailure)
  765. XCTAssertNil(result.success)
  766. XCTAssertNotNil(result.failure)
  767. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  768. }
  769. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  770. // Given
  771. let serializer = StringResponseSerializer()
  772. let response = HTTPURLResponse(statusCode: 200)
  773. // When
  774. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  775. // Then
  776. XCTAssertTrue(result.isFailure)
  777. XCTAssertNil(result.success)
  778. XCTAssertNotNil(result.failure)
  779. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  780. }
  781. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  782. // Given
  783. let serializer = StringResponseSerializer()
  784. let response = HTTPURLResponse(statusCode: 204)
  785. // When
  786. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  787. // Then
  788. XCTAssertTrue(result.isSuccess)
  789. XCTAssertNotNil(result.success)
  790. XCTAssertNil(result.failure)
  791. XCTAssertEqual(result.success, "")
  792. }
  793. // MARK: Tests - JSON Response Serializer
  794. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  795. // Given
  796. let serializer = JSONResponseSerializer()
  797. // When
  798. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  799. // Then
  800. XCTAssertTrue(result.isFailure)
  801. XCTAssertNil(result.success)
  802. XCTAssertNotNil(result.failure)
  803. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  804. }
  805. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  806. // Given
  807. let serializer = JSONResponseSerializer()
  808. // When
  809. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  810. // Then
  811. XCTAssertTrue(result.isFailure)
  812. XCTAssertNil(result.success)
  813. XCTAssertNotNil(result.failure)
  814. XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true)
  815. }
  816. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  817. // Given
  818. let serializer = JSONResponseSerializer()
  819. // When
  820. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  821. // Then
  822. XCTAssertTrue(result.isFailure)
  823. XCTAssertNil(result.success)
  824. XCTAssertNotNil(result.failure)
  825. XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true)
  826. }
  827. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  828. // Given
  829. let serializer = JSONResponseSerializer()
  830. // When
  831. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  832. // Then
  833. XCTAssertTrue(result.isSuccess)
  834. XCTAssertNotNil(result.success)
  835. XCTAssertNil(result.failure)
  836. }
  837. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  838. // Given
  839. let serializer = JSONResponseSerializer()
  840. // When
  841. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  842. // Then
  843. XCTAssertTrue(result.isFailure)
  844. XCTAssertNil(result.success)
  845. XCTAssertNotNil(result.failure)
  846. XCTAssertEqual(result.failure?.asAFError?.isJSONSerializationFailed, true)
  847. XCTAssertEqual((result.failure?.asAFError?.underlyingError as? CocoaError)?.code, .propertyListReadCorrupt)
  848. }
  849. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  850. // Given
  851. let serializer = JSONResponseSerializer()
  852. // When
  853. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  854. // Then
  855. XCTAssertTrue(result.isFailure)
  856. XCTAssertNil(result.success)
  857. XCTAssertNotNil(result.failure)
  858. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  859. }
  860. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  861. // Given
  862. let serializer = JSONResponseSerializer()
  863. let response = HTTPURLResponse(statusCode: 200)
  864. // When
  865. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  866. // Then
  867. XCTAssertTrue(result.isFailure)
  868. XCTAssertNil(result.success)
  869. XCTAssertNotNil(result.failure)
  870. XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true)
  871. }
  872. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  873. // Given
  874. let serializer = JSONResponseSerializer()
  875. let response = HTTPURLResponse(statusCode: 205)
  876. // When
  877. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  878. // Then
  879. XCTAssertTrue(result.isSuccess)
  880. XCTAssertNotNil(result.success)
  881. XCTAssertNil(result.failure)
  882. XCTAssertEqual(result.success as? NSNull, NSNull())
  883. }
  884. }
  885. #endif
  886. final class CustomResponseSerializerTests: BaseTestCase {
  887. func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() {
  888. // Given
  889. final class UselessResponseSerializer: ResponseSerializer {
  890. func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? {
  891. data
  892. }
  893. }
  894. let serializer = UselessResponseSerializer()
  895. let expectation = self.expectation(description: "request should finish")
  896. var data: Data?
  897. // When
  898. AF.request(.default).response(responseSerializer: serializer) { response in
  899. data = response.data
  900. expectation.fulfill()
  901. }
  902. waitForExpectations(timeout: timeout)
  903. // Then
  904. XCTAssertNotNil(data)
  905. }
  906. }
  907. final class DataPreprocessorSerializationTests: BaseTestCase {
  908. struct DropFirst: DataPreprocessor {
  909. func preprocess(_ data: Data) throws -> Data {
  910. data.dropFirst()
  911. }
  912. }
  913. struct Throwing: DataPreprocessor {
  914. struct Error: Swift.Error {}
  915. func preprocess(_ data: Data) throws -> Data {
  916. throw Error()
  917. }
  918. }
  919. func testThatDataResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  920. // Given
  921. let preprocessor = DropFirst()
  922. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  923. let data = Data("abcd".utf8)
  924. // When
  925. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  926. // Then
  927. XCTAssertTrue(result.isSuccess)
  928. XCTAssertEqual(result.success, Data("bcd".utf8))
  929. XCTAssertNil(result.failure)
  930. }
  931. func testThatDataResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  932. // Given
  933. let preprocessor = Throwing()
  934. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  935. let data = Data("abcd".utf8)
  936. // When
  937. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  938. // Then
  939. XCTAssertTrue(result.isFailure)
  940. XCTAssertNil(result.success)
  941. XCTAssertNotNil(result.failure)
  942. }
  943. func testThatStringResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  944. // Given
  945. let preprocessor = DropFirst()
  946. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  947. let data = Data("abcd".utf8)
  948. // When
  949. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  950. // Then
  951. XCTAssertTrue(result.isSuccess)
  952. XCTAssertEqual(result.success, "bcd")
  953. XCTAssertNil(result.failure)
  954. }
  955. func testThatStringResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  956. // Given
  957. let preprocessor = Throwing()
  958. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  959. let data = Data("abcd".utf8)
  960. // When
  961. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  962. // Then
  963. XCTAssertTrue(result.isFailure)
  964. XCTAssertNil(result.success)
  965. XCTAssertNotNil(result.failure)
  966. }
  967. func testThatJSONResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  968. // Given
  969. let preprocessor = DropFirst()
  970. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  971. let data = Data("1\"abcd\"".utf8)
  972. // When
  973. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  974. // Then
  975. XCTAssertTrue(result.isSuccess)
  976. XCTAssertEqual(result.success as? String, "abcd")
  977. XCTAssertNil(result.failure)
  978. }
  979. func testThatJSONResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  980. // Given
  981. let preprocessor = Throwing()
  982. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  983. let data = Data("1\"abcd\"".utf8)
  984. // When
  985. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  986. // Then
  987. XCTAssertTrue(result.isFailure)
  988. XCTAssertNil(result.success)
  989. XCTAssertNotNil(result.failure)
  990. }
  991. func testThatDecodableResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  992. // Given
  993. let preprocessor = DropFirst()
  994. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  995. let data = Data("1{\"string\":\"string\"}".utf8)
  996. // When
  997. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  998. // Then
  999. XCTAssertTrue(result.isSuccess)
  1000. XCTAssertEqual(result.success?.string, "string")
  1001. XCTAssertNil(result.failure)
  1002. }
  1003. func testThatDecodableResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  1004. // Given
  1005. let preprocessor = Throwing()
  1006. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  1007. let data = Data("1{\"string\":\"string\"}".utf8)
  1008. // When
  1009. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1010. // Then
  1011. XCTAssertTrue(result.isFailure)
  1012. XCTAssertNil(result.success)
  1013. XCTAssertNotNil(result.failure)
  1014. }
  1015. }
  1016. final class DataPreprocessorTests: BaseTestCase {
  1017. func testThatPassthroughPreprocessorPassesDataThrough() {
  1018. // Given
  1019. let preprocessor = PassthroughPreprocessor()
  1020. let data = Data("data".utf8)
  1021. // When
  1022. let result = Result { try preprocessor.preprocess(data) }
  1023. // Then
  1024. XCTAssertEqual(data, result.success, "Preprocessed data should equal original data.")
  1025. }
  1026. func testThatGoogleXSSIPreprocessorProperlyPreprocessesData() {
  1027. // Given
  1028. let preprocessor = GoogleXSSIPreprocessor()
  1029. let data = Data(")]}',\nabcd".utf8)
  1030. // When
  1031. let result = Result { try preprocessor.preprocess(data) }
  1032. // Then
  1033. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  1034. }
  1035. func testThatGoogleXSSIPreprocessorDoesNotChangeDataIfPrefixDoesNotMatch() {
  1036. // Given
  1037. let preprocessor = GoogleXSSIPreprocessor()
  1038. let data = Data("abcd".utf8)
  1039. // When
  1040. let result = Result { try preprocessor.preprocess(data) }
  1041. // Then
  1042. XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  1043. }
  1044. }
  1045. extension HTTPURLResponse {
  1046. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  1047. let url = Endpoint().url
  1048. self.init(url: url, statusCode: statusCode, httpVersion: String(kCFHTTPVersion1_1), headerFields: headers?.dictionary)!
  1049. }
  1050. }