ResponseSerializationTests.swift 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import Foundation
  26. import XCTest
  27. final class DataResponseSerializationTestCase: BaseTestCase {
  28. // MARK: Properties
  29. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  30. // MARK: DataResponseSerializer
  31. func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
  32. // Given
  33. let serializer = DataResponseSerializer()
  34. let data = Data("data".utf8)
  35. // When
  36. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  37. // Then
  38. XCTAssertTrue(result.isSuccess)
  39. XCTAssertNotNil(result.value)
  40. XCTAssertNil(result.error)
  41. }
  42. func testThatDataResponseSerializerFailsWhenDataIsNil() {
  43. // Given
  44. let serializer = DataResponseSerializer()
  45. // When
  46. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  47. // Then
  48. XCTAssertTrue(result.isFailure)
  49. XCTAssertNil(result.value)
  50. XCTAssertNotNil(result.error)
  51. if let error = result.error?.asAFError {
  52. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  53. } else {
  54. XCTFail("error should not be nil")
  55. }
  56. }
  57. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  58. // Given
  59. let serializer = DataResponseSerializer()
  60. // When
  61. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  62. // Then
  63. XCTAssertTrue(result.isFailure)
  64. XCTAssertNil(result.value)
  65. XCTAssertNotNil(result.error)
  66. if let error = result.error?.asAFError {
  67. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  68. } else {
  69. XCTFail("error should not be nil")
  70. }
  71. }
  72. func testThatDataResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  73. // Given
  74. let serializer = DataResponseSerializer()
  75. let response = HTTPURLResponse(statusCode: 200)
  76. // When
  77. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  78. // Then
  79. XCTAssertTrue(result.isFailure, "result is failure should be true")
  80. XCTAssertNil(result.value, "result value should be nil")
  81. XCTAssertNotNil(result.error, "result error should not be nil")
  82. if let error = result.error?.asAFError {
  83. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  84. } else {
  85. XCTFail("error should not be nil")
  86. }
  87. }
  88. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  89. // Given
  90. let serializer = DataResponseSerializer()
  91. let request = URLRequest.make(method: .get)
  92. let response = HTTPURLResponse(statusCode: 204)
  93. // When
  94. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  95. // Then
  96. XCTAssertTrue(result.isSuccess)
  97. XCTAssertNotNil(result.value)
  98. XCTAssertNil(result.error)
  99. XCTAssertEqual(result.value?.count, 0)
  100. }
  101. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  102. // Given
  103. let serializer = DataResponseSerializer()
  104. let request = URLRequest.make(method: .get)
  105. let response = HTTPURLResponse(statusCode: 205)
  106. // When
  107. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  108. // Then
  109. XCTAssertTrue(result.isSuccess)
  110. XCTAssertNotNil(result.value)
  111. XCTAssertNil(result.error)
  112. XCTAssertEqual(result.value?.count, 0)
  113. }
  114. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  115. // Given
  116. let serializer = DataResponseSerializer()
  117. let request = URLRequest.make(method: .head)
  118. let response = HTTPURLResponse(statusCode: 200)
  119. // When
  120. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  121. // Then
  122. XCTAssertTrue(result.isSuccess)
  123. XCTAssertNotNil(result.value)
  124. XCTAssertNil(result.error)
  125. XCTAssertEqual(result.value?.count, 0)
  126. }
  127. // MARK: StringResponseSerializer
  128. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  129. // Given
  130. let serializer = DataResponseSerializer()
  131. // When
  132. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  133. // Then
  134. XCTAssertTrue(result.isFailure)
  135. XCTAssertNil(result.value)
  136. XCTAssertNotNil(result.error)
  137. if let error = result.error?.asAFError {
  138. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  139. } else {
  140. XCTFail("error should not be nil")
  141. }
  142. }
  143. func testThatStringResponseSerializerFailsWhenDataIsEmpty() {
  144. // Given
  145. let serializer = StringResponseSerializer()
  146. // When
  147. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  148. // Then
  149. XCTAssertTrue(result.isFailure)
  150. XCTAssertNil(result.value)
  151. XCTAssertNotNil(result.error)
  152. if let error = result.error?.asAFError {
  153. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  154. } else {
  155. XCTFail("error should not be nil")
  156. }
  157. }
  158. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  159. let serializer = StringResponseSerializer()
  160. let data = Data("data".utf8)
  161. // When
  162. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  163. // Then
  164. XCTAssertTrue(result.isSuccess)
  165. XCTAssertNotNil(result.value)
  166. XCTAssertNil(result.error)
  167. }
  168. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  169. let serializer = StringResponseSerializer(encoding: .utf8)
  170. let data = Data("data".utf8)
  171. // When
  172. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  173. // Then
  174. XCTAssertTrue(result.isSuccess)
  175. XCTAssertNotNil(result.value)
  176. XCTAssertNil(result.error)
  177. }
  178. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  179. let serializer = StringResponseSerializer()
  180. let data = Data("data".utf8)
  181. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  182. // When
  183. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  184. // Then
  185. XCTAssertTrue(result.isSuccess)
  186. XCTAssertNotNil(result.value)
  187. XCTAssertNil(result.error)
  188. }
  189. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  190. // Given
  191. let serializer = StringResponseSerializer(encoding: .utf8)
  192. let data = "random data".data(using: .utf32)!
  193. // When
  194. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  195. // Then
  196. XCTAssertTrue(result.isFailure)
  197. XCTAssertNil(result.value)
  198. XCTAssertNotNil(result.error)
  199. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  200. XCTAssertTrue(error.isStringSerializationFailed)
  201. XCTAssertEqual(failedEncoding, .utf8)
  202. } else {
  203. XCTFail("error should not be nil")
  204. }
  205. }
  206. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  207. // Given
  208. let serializer = StringResponseSerializer()
  209. let data = "random data".data(using: .utf32)!
  210. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  211. // When
  212. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  213. // Then
  214. XCTAssertTrue(result.isFailure)
  215. XCTAssertNil(result.value)
  216. XCTAssertNotNil(result.error)
  217. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  218. XCTAssertTrue(error.isStringSerializationFailed)
  219. XCTAssertEqual(failedEncoding, .utf8)
  220. } else {
  221. XCTFail("error should not be nil")
  222. }
  223. }
  224. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  225. // Given
  226. let serializer = StringResponseSerializer()
  227. // When
  228. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  229. // Then
  230. XCTAssertTrue(result.isFailure)
  231. XCTAssertNil(result.value)
  232. XCTAssertNotNil(result.error)
  233. if let error = result.error?.asAFError {
  234. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  235. } else {
  236. XCTFail("error should not be nil")
  237. }
  238. }
  239. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  240. // Given
  241. let serializer = StringResponseSerializer()
  242. let response = HTTPURLResponse(statusCode: 200)
  243. // When
  244. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  245. // Then
  246. XCTAssertTrue(result.isFailure)
  247. XCTAssertNil(result.value)
  248. XCTAssertNotNil(result.error)
  249. if let error = result.error?.asAFError {
  250. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  251. } else {
  252. XCTFail("error should not be nil")
  253. }
  254. }
  255. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  256. // Given
  257. let serializer = StringResponseSerializer()
  258. let request = URLRequest.make(method: .get)
  259. let response = HTTPURLResponse(statusCode: 204)
  260. // When
  261. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  262. // Then
  263. XCTAssertTrue(result.isSuccess)
  264. XCTAssertNotNil(result.value)
  265. XCTAssertNil(result.error)
  266. XCTAssertEqual(result.value, "")
  267. }
  268. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  269. // Given
  270. let serializer = StringResponseSerializer()
  271. let request = URLRequest.make(method: .get)
  272. let response = HTTPURLResponse(statusCode: 205)
  273. // When
  274. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  275. // Then
  276. XCTAssertTrue(result.isSuccess)
  277. XCTAssertNotNil(result.value)
  278. XCTAssertNil(result.error)
  279. XCTAssertEqual(result.value, "")
  280. }
  281. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  282. // Given
  283. let serializer = StringResponseSerializer()
  284. let request = URLRequest.make(method: .head)
  285. let response = HTTPURLResponse(statusCode: 200)
  286. // When
  287. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  288. // Then
  289. XCTAssertTrue(result.isSuccess)
  290. XCTAssertNotNil(result.value)
  291. XCTAssertNil(result.error)
  292. XCTAssertEqual(result.value, "")
  293. }
  294. // MARK: JSONResponseSerializer
  295. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  296. // Given
  297. let serializer = JSONResponseSerializer()
  298. // When
  299. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  300. // Then
  301. XCTAssertTrue(result.isFailure)
  302. XCTAssertNil(result.value)
  303. XCTAssertNotNil(result.error)
  304. if let error = result.error?.asAFError {
  305. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  306. } else {
  307. XCTFail("error should not be nil")
  308. }
  309. }
  310. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  311. // Given
  312. let serializer = JSONResponseSerializer()
  313. // When
  314. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  315. // Then
  316. XCTAssertTrue(result.isFailure)
  317. XCTAssertNil(result.value)
  318. XCTAssertNotNil(result.error)
  319. if let error = result.error?.asAFError {
  320. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  321. } else {
  322. XCTFail("error should not be nil")
  323. }
  324. }
  325. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  326. // Given
  327. let serializer = JSONResponseSerializer()
  328. let data = Data("{\"json\": true}".utf8)
  329. // When
  330. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  331. // Then
  332. XCTAssertTrue(result.isSuccess)
  333. XCTAssertNotNil(result.value)
  334. XCTAssertNil(result.error)
  335. }
  336. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  337. // Given
  338. let serializer = JSONResponseSerializer()
  339. let data = Data("definitely not valid json".utf8)
  340. // When
  341. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  342. // Then
  343. XCTAssertTrue(result.isFailure)
  344. XCTAssertNil(result.value)
  345. XCTAssertNotNil(result.error)
  346. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  347. XCTAssertTrue(error.isJSONSerializationFailed)
  348. XCTAssertEqual(underlyingError.errorCode, 3840)
  349. } else {
  350. XCTFail("error should not be nil")
  351. }
  352. }
  353. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  354. // Given
  355. let serializer = JSONResponseSerializer()
  356. // When
  357. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  358. // Then
  359. XCTAssertTrue(result.isFailure)
  360. XCTAssertNil(result.value)
  361. XCTAssertNotNil(result.error)
  362. if let error = result.error?.asAFError {
  363. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  364. } else {
  365. XCTFail("error should not be nil")
  366. }
  367. }
  368. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  369. // Given
  370. let serializer = JSONResponseSerializer()
  371. let response = HTTPURLResponse(statusCode: 200)
  372. // When
  373. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  374. // Then
  375. XCTAssertTrue(result.isFailure)
  376. XCTAssertNil(result.value)
  377. XCTAssertNotNil(result.error)
  378. if let error = result.error?.asAFError {
  379. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  380. } else {
  381. XCTFail("error should not be nil")
  382. }
  383. }
  384. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  385. // Given
  386. let serializer = JSONResponseSerializer()
  387. let request = URLRequest.make(method: .get)
  388. let response = HTTPURLResponse(statusCode: 204)
  389. // When
  390. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  391. // Then
  392. XCTAssertTrue(result.isSuccess)
  393. XCTAssertNotNil(result.value)
  394. XCTAssertNil(result.error)
  395. XCTAssertEqual(result.value as? NSNull, NSNull())
  396. }
  397. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  398. // Given
  399. let serializer = JSONResponseSerializer()
  400. let request = URLRequest.make(method: .get)
  401. let response = HTTPURLResponse(statusCode: 205)
  402. // When
  403. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  404. // Then
  405. XCTAssertTrue(result.isSuccess)
  406. XCTAssertNotNil(result.value)
  407. XCTAssertNil(result.error)
  408. XCTAssertEqual(result.value as? NSNull, NSNull())
  409. }
  410. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  411. // Given
  412. let serializer = JSONResponseSerializer()
  413. let request = URLRequest.make(method: .head)
  414. let response = HTTPURLResponse(statusCode: 200)
  415. // When
  416. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  417. // Then
  418. XCTAssertTrue(result.isSuccess)
  419. XCTAssertNotNil(result.value)
  420. XCTAssertNil(result.error)
  421. XCTAssertEqual(result.value as? NSNull, NSNull())
  422. }
  423. }
  424. // MARK: -
  425. // used by testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode
  426. extension Bool: EmptyResponse {
  427. public static func emptyValue() -> Bool {
  428. return true
  429. }
  430. }
  431. final class DecodableResponseSerializerTests: BaseTestCase {
  432. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  433. struct DecodableValue: Decodable, EmptyResponse {
  434. static func emptyValue() -> DecodableValue {
  435. return DecodableValue(string: "")
  436. }
  437. let string: String
  438. }
  439. func testThatDecodableResponseSerializerFailsWhenDataIsNil() {
  440. // Given
  441. let serializer = DecodableResponseSerializer<DecodableValue>()
  442. // When
  443. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  444. // Then
  445. XCTAssertTrue(result.isFailure)
  446. XCTAssertNil(result.value)
  447. XCTAssertNotNil(result.error)
  448. if let error = result.error?.asAFError {
  449. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  450. } else {
  451. XCTFail("error should not be nil")
  452. }
  453. }
  454. func testThatDecodableResponseSerializerFailsWhenDataIsEmpty() {
  455. // Given
  456. let serializer = DecodableResponseSerializer<DecodableValue>()
  457. // When
  458. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  459. // Then
  460. XCTAssertTrue(result.isFailure)
  461. XCTAssertNil(result.value)
  462. XCTAssertNotNil(result.error)
  463. if let error = result.error?.asAFError {
  464. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  465. } else {
  466. XCTFail("error should not be nil")
  467. }
  468. }
  469. func testThatDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  470. // Given
  471. let data = Data("{\"string\":\"string\"}".utf8)
  472. let serializer = DecodableResponseSerializer<DecodableValue>()
  473. // When
  474. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  475. // Then
  476. XCTAssertTrue(result.isSuccess)
  477. XCTAssertNotNil(result.value)
  478. XCTAssertEqual(result.value?.string, "string")
  479. XCTAssertNil(result.error)
  480. }
  481. func testThatDecodableResponseSerializerFailsWhenDataIsInvalidRepresentation() {
  482. // Given
  483. let serializer = DecodableResponseSerializer<DecodableValue>()
  484. let data = Data("definitely not valid".utf8)
  485. // When
  486. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  487. // Then
  488. XCTAssertTrue(result.isFailure)
  489. XCTAssertNil(result.value)
  490. XCTAssertNotNil(result.error)
  491. }
  492. func testThatDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  493. // Given
  494. let serializer = DecodableResponseSerializer<DecodableValue>()
  495. // When
  496. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  497. // Then
  498. XCTAssertTrue(result.isFailure)
  499. XCTAssertNil(result.value)
  500. XCTAssertNotNil(result.error)
  501. if let error = result.error?.asAFError {
  502. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  503. } else {
  504. XCTFail("error should not be nil")
  505. }
  506. }
  507. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  508. // Given
  509. let serializer = DecodableResponseSerializer<DecodableValue>()
  510. let response = HTTPURLResponse(statusCode: 200)
  511. // When
  512. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  513. // Then
  514. XCTAssertTrue(result.isFailure)
  515. XCTAssertNil(result.value)
  516. XCTAssertNotNil(result.error)
  517. if let error = result.error?.asAFError {
  518. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  519. } else {
  520. XCTFail("error should not be nil")
  521. }
  522. }
  523. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  524. // Given
  525. let serializer = DecodableResponseSerializer<DecodableValue>()
  526. let response = HTTPURLResponse(statusCode: 204)
  527. // When
  528. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  529. // Then
  530. XCTAssertTrue(result.isSuccess)
  531. XCTAssertNotNil(result.value)
  532. XCTAssertNil(result.error)
  533. }
  534. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyTypeAndEmptyResponseStatusCode() {
  535. // Given
  536. let serializer = DecodableResponseSerializer<Empty>()
  537. let response = HTTPURLResponse(statusCode: 204)
  538. // When
  539. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  540. // Then
  541. XCTAssertTrue(result.isSuccess)
  542. XCTAssertNotNil(result.value)
  543. XCTAssertNil(result.error)
  544. }
  545. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() {
  546. // Given
  547. let serializer = DecodableResponseSerializer<Empty>()
  548. let request = URLRequest.make(method: .get)
  549. let response = HTTPURLResponse(statusCode: 204)
  550. // When
  551. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  552. // Then
  553. XCTAssertTrue(result.isSuccess)
  554. XCTAssertNotNil(result.value)
  555. XCTAssertNil(result.error)
  556. }
  557. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() {
  558. // Given
  559. let serializer = DecodableResponseSerializer<Empty>()
  560. let request = URLRequest.make(method: .get)
  561. let response = HTTPURLResponse(statusCode: 205)
  562. // When
  563. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  564. // Then
  565. XCTAssertTrue(result.isSuccess)
  566. XCTAssertNotNil(result.value)
  567. XCTAssertNil(result.error)
  568. }
  569. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() {
  570. // Given
  571. let serializer = DecodableResponseSerializer<Empty>()
  572. let request = URLRequest.make(method: .head)
  573. let response = HTTPURLResponse(statusCode: 200)
  574. // When
  575. let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) }
  576. // Then
  577. XCTAssertTrue(result.isSuccess)
  578. XCTAssertNotNil(result.value)
  579. XCTAssertNil(result.error)
  580. }
  581. func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode() {
  582. // Given
  583. let serializer = DecodableResponseSerializer<Bool>()
  584. let response = HTTPURLResponse(statusCode: 204)
  585. // When
  586. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  587. // Then
  588. XCTAssertTrue(result.isSuccess)
  589. XCTAssertNotNil(result.value)
  590. XCTAssertNil(result.error)
  591. }
  592. func testThatDecodableResponseSerializerFailsWhenDataIsNilWithEmptyResponseNonconformingTypeAndEmptyResponseStatusCode() {
  593. // Given
  594. let serializer = DecodableResponseSerializer<Int>()
  595. let response = HTTPURLResponse(statusCode: 204)
  596. // When
  597. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  598. // Then
  599. XCTAssertTrue(result.isFailure)
  600. XCTAssertNil(result.value)
  601. XCTAssertNotNil(result.error)
  602. if let error = result.error?.asAFError {
  603. XCTAssertTrue(error.isInvalidEmptyResponse)
  604. } else {
  605. XCTFail("error should not be nil")
  606. }
  607. }
  608. }
  609. // MARK: -
  610. final class DownloadResponseSerializationTestCase: BaseTestCase {
  611. // MARK: Properties
  612. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  613. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  614. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  615. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  616. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  617. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  618. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  619. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  620. // MARK: Tests - Data Response Serializer
  621. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  622. // Given
  623. let serializer = DataResponseSerializer()
  624. // When
  625. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  626. // Then
  627. XCTAssertTrue(result.isSuccess)
  628. XCTAssertNotNil(result.value)
  629. XCTAssertNil(result.error)
  630. }
  631. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  632. // Given
  633. let serializer = DataResponseSerializer()
  634. // When
  635. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  636. // Then
  637. XCTAssertTrue(result.isFailure)
  638. XCTAssertNil(result.value)
  639. XCTAssertNotNil(result.error)
  640. if let error = result.error?.asAFError {
  641. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  642. } else {
  643. XCTFail("error should not be nil")
  644. }
  645. }
  646. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  647. // Given
  648. let serializer = DataResponseSerializer()
  649. // When
  650. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  651. // Then
  652. XCTAssertTrue(result.isFailure)
  653. XCTAssertNil(result.value)
  654. XCTAssertNotNil(result.error)
  655. if let error = result.error?.asAFError {
  656. XCTAssertTrue(error.isInputFileNil)
  657. } else {
  658. XCTFail("error should not be nil")
  659. }
  660. }
  661. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  662. // Given
  663. let serializer = DataResponseSerializer()
  664. // When
  665. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  666. // Then
  667. XCTAssertTrue(result.isFailure)
  668. XCTAssertNil(result.value)
  669. XCTAssertNotNil(result.error)
  670. if let error = result.error?.asAFError {
  671. XCTAssertTrue(error.isInputFileReadFailed)
  672. } else {
  673. XCTFail("error should not be nil")
  674. }
  675. }
  676. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  677. // Given
  678. let serializer = DataResponseSerializer()
  679. // When
  680. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  681. // Then
  682. XCTAssertTrue(result.isFailure)
  683. XCTAssertNil(result.value)
  684. XCTAssertNotNil(result.error)
  685. if let error = result.error?.asAFError {
  686. XCTAssertTrue(error.isInputFileNil)
  687. } else {
  688. XCTFail("error should not be nil")
  689. }
  690. }
  691. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  692. // Given
  693. let serializer = DataResponseSerializer()
  694. let response = HTTPURLResponse(statusCode: 200)
  695. // When
  696. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  697. // Then
  698. XCTAssertTrue(result.isFailure)
  699. XCTAssertNil(result.value)
  700. XCTAssertNotNil(result.error)
  701. if let error = result.error?.asAFError {
  702. XCTAssertTrue(error.isInputFileNil)
  703. } else {
  704. XCTFail("error should not be nil")
  705. }
  706. }
  707. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  708. // Given
  709. let serializer = DataResponseSerializer()
  710. let response = HTTPURLResponse(statusCode: 205)
  711. // When
  712. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  713. // Then
  714. XCTAssertTrue(result.isSuccess)
  715. XCTAssertNotNil(result.value)
  716. XCTAssertNil(result.error)
  717. XCTAssertEqual(result.value?.count, 0)
  718. }
  719. // MARK: Tests - String Response Serializer
  720. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  721. // Given
  722. let serializer = StringResponseSerializer()
  723. // When
  724. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  725. // Then
  726. XCTAssertTrue(result.isFailure)
  727. XCTAssertNil(result.value)
  728. XCTAssertNotNil(result.error)
  729. if let error = result.error?.asAFError {
  730. XCTAssertTrue(error.isInputFileNil)
  731. } else {
  732. XCTFail("error should not be nil")
  733. }
  734. }
  735. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  736. // Given
  737. let serializer = StringResponseSerializer()
  738. // When
  739. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  740. // Then
  741. XCTAssertEqual(result.isSuccess, false)
  742. XCTAssertNil(result.value)
  743. XCTAssertNotNil(result.error)
  744. if let error = result.error?.asAFError {
  745. XCTAssertTrue(error.isInputFileReadFailed)
  746. } else {
  747. XCTFail("error should not be nil")
  748. }
  749. }
  750. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  751. // Given
  752. let serializer = StringResponseSerializer()
  753. // When
  754. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  755. // Then
  756. XCTAssertTrue(result.isFailure)
  757. XCTAssertNil(result.value)
  758. XCTAssertNotNil(result.error)
  759. if let error = result.error?.asAFError {
  760. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  761. } else {
  762. XCTFail("error should not be nil")
  763. }
  764. }
  765. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  766. // Given
  767. let serializer = StringResponseSerializer()
  768. // When
  769. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  770. // Then
  771. XCTAssertTrue(result.isSuccess)
  772. XCTAssertNotNil(result.value)
  773. XCTAssertNil(result.error)
  774. }
  775. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  776. // Given
  777. let serializer = StringResponseSerializer(encoding: .utf8)
  778. // When
  779. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  780. // Then
  781. XCTAssertTrue(result.isSuccess)
  782. XCTAssertNotNil(result.value)
  783. XCTAssertNil(result.error)
  784. }
  785. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  786. // Given
  787. let serializer = StringResponseSerializer()
  788. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  789. // When
  790. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  791. // Then
  792. XCTAssertTrue(result.isSuccess)
  793. XCTAssertNotNil(result.value)
  794. XCTAssertNil(result.error)
  795. }
  796. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  797. // Given
  798. let serializer = StringResponseSerializer(encoding: .utf8)
  799. // When
  800. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  801. // Then
  802. XCTAssertTrue(result.isFailure)
  803. XCTAssertNil(result.value)
  804. XCTAssertNotNil(result.error)
  805. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  806. XCTAssertTrue(error.isStringSerializationFailed)
  807. XCTAssertEqual(failedEncoding, .utf8)
  808. } else {
  809. XCTFail("error should not be nil")
  810. }
  811. }
  812. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  813. // Given
  814. let serializer = StringResponseSerializer()
  815. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  816. // When
  817. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  818. // Then
  819. XCTAssertTrue(result.isFailure)
  820. XCTAssertNil(result.value)
  821. XCTAssertNotNil(result.error)
  822. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  823. XCTAssertTrue(error.isStringSerializationFailed)
  824. XCTAssertEqual(failedEncoding, .utf8)
  825. } else {
  826. XCTFail("error should not be nil")
  827. }
  828. }
  829. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  830. // Given
  831. let serializer = StringResponseSerializer()
  832. // When
  833. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  834. // Then
  835. XCTAssertTrue(result.isFailure)
  836. XCTAssertNil(result.value)
  837. XCTAssertNotNil(result.error)
  838. if let error = result.error?.asAFError {
  839. XCTAssertTrue(error.isInputFileNil)
  840. } else {
  841. XCTFail("error should not be nil")
  842. }
  843. }
  844. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  845. // Given
  846. let serializer = StringResponseSerializer()
  847. let response = HTTPURLResponse(statusCode: 200)
  848. // When
  849. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  850. // Then
  851. XCTAssertTrue(result.isFailure)
  852. XCTAssertNil(result.value)
  853. XCTAssertNotNil(result.error)
  854. if let error = result.error?.asAFError {
  855. XCTAssertTrue(error.isInputFileNil)
  856. } else {
  857. XCTFail("error should not be nil")
  858. }
  859. }
  860. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  861. // Given
  862. let serializer = StringResponseSerializer()
  863. let response = HTTPURLResponse(statusCode: 204)
  864. // When
  865. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  866. // Then
  867. XCTAssertTrue(result.isSuccess)
  868. XCTAssertNotNil(result.value)
  869. XCTAssertNil(result.error)
  870. XCTAssertEqual(result.value, "")
  871. }
  872. // MARK: Tests - JSON Response Serializer
  873. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  874. // Given
  875. let serializer = JSONResponseSerializer()
  876. // When
  877. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  878. // Then
  879. XCTAssertTrue(result.isFailure)
  880. XCTAssertNil(result.value)
  881. XCTAssertNotNil(result.error)
  882. if let error = result.error?.asAFError {
  883. XCTAssertTrue(error.isInputFileNil)
  884. } else {
  885. XCTFail("error should not be nil")
  886. }
  887. }
  888. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  889. // Given
  890. let serializer = JSONResponseSerializer()
  891. // When
  892. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  893. // Then
  894. XCTAssertTrue(result.isFailure)
  895. XCTAssertNil(result.value)
  896. XCTAssertNotNil(result.error)
  897. if let error = result.error?.asAFError {
  898. XCTAssertTrue(error.isInputFileReadFailed)
  899. } else {
  900. XCTFail("error should not be nil")
  901. }
  902. }
  903. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  904. // Given
  905. let serializer = JSONResponseSerializer()
  906. // When
  907. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  908. // Then
  909. XCTAssertTrue(result.isFailure)
  910. XCTAssertNil(result.value)
  911. XCTAssertNotNil(result.error)
  912. if let error = result.error?.asAFError {
  913. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  914. } else {
  915. XCTFail("error should not be nil")
  916. }
  917. }
  918. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  919. // Given
  920. let serializer = JSONResponseSerializer()
  921. // When
  922. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  923. // Then
  924. XCTAssertTrue(result.isSuccess)
  925. XCTAssertNotNil(result.value)
  926. XCTAssertNil(result.error)
  927. }
  928. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  929. // Given
  930. let serializer = JSONResponseSerializer()
  931. // When
  932. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  933. // Then
  934. XCTAssertTrue(result.isFailure)
  935. XCTAssertNil(result.value)
  936. XCTAssertNotNil(result.error)
  937. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  938. XCTAssertTrue(error.isJSONSerializationFailed)
  939. XCTAssertEqual(underlyingError.errorCode, 3840)
  940. } else {
  941. XCTFail("error should not be nil")
  942. }
  943. }
  944. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  945. // Given
  946. let serializer = JSONResponseSerializer()
  947. // When
  948. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  949. // Then
  950. XCTAssertTrue(result.isFailure)
  951. XCTAssertNil(result.value)
  952. XCTAssertNotNil(result.error)
  953. if let error = result.error?.asAFError {
  954. XCTAssertTrue(error.isInputFileNil)
  955. } else {
  956. XCTFail("error should not be nil")
  957. }
  958. }
  959. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  960. // Given
  961. let serializer = JSONResponseSerializer()
  962. let response = HTTPURLResponse(statusCode: 200)
  963. // When
  964. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  965. // Then
  966. XCTAssertTrue(result.isFailure)
  967. XCTAssertNil(result.value)
  968. XCTAssertNotNil(result.error)
  969. if let error = result.error?.asAFError {
  970. XCTAssertTrue(error.isInputFileNil)
  971. } else {
  972. XCTFail("error should not be nil")
  973. }
  974. }
  975. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  976. // Given
  977. let serializer = JSONResponseSerializer()
  978. let response = HTTPURLResponse(statusCode: 205)
  979. // When
  980. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  981. // Then
  982. XCTAssertTrue(result.isSuccess)
  983. XCTAssertNotNil(result.value)
  984. XCTAssertNil(result.error)
  985. XCTAssertEqual(result.value as? NSNull, NSNull())
  986. }
  987. }
  988. final class CustomResponseSerializerTests: BaseTestCase {
  989. func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() {
  990. // Given
  991. final class UselessResponseSerializer: ResponseSerializer {
  992. func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? {
  993. return data
  994. }
  995. }
  996. let serializer = UselessResponseSerializer()
  997. let expectation = self.expectation(description: "request should finish")
  998. var data: Data?
  999. // When
  1000. AF.request(URLRequest.makeHTTPBinRequest()).response(responseSerializer: serializer) { (response) in
  1001. data = response.data
  1002. expectation.fulfill()
  1003. }
  1004. waitForExpectations(timeout: timeout, handler: nil)
  1005. // Then
  1006. XCTAssertNotNil(data)
  1007. }
  1008. }
  1009. final class DataPreprocessorSerializationTests: BaseTestCase {
  1010. struct DropFirst: DataPreprocessor {
  1011. func preprocess(_ data: Data) throws -> Data {
  1012. return data.dropFirst()
  1013. }
  1014. }
  1015. struct Throwing: DataPreprocessor {
  1016. struct Error: Swift.Error { }
  1017. func preprocess(_ data: Data) throws -> Data {
  1018. throw Error()
  1019. }
  1020. }
  1021. func testThatDataResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  1022. // Given
  1023. let preprocessor = DropFirst()
  1024. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  1025. let data = Data("abcd".utf8)
  1026. // When
  1027. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1028. // Then
  1029. XCTAssertTrue(result.isSuccess)
  1030. XCTAssertEqual(result.value, Data("bcd".utf8))
  1031. XCTAssertNil(result.error)
  1032. }
  1033. func testThatDataResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  1034. // Given
  1035. let preprocessor = Throwing()
  1036. let serializer = DataResponseSerializer(dataPreprocessor: preprocessor)
  1037. let data = Data("abcd".utf8)
  1038. // When
  1039. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1040. // Then
  1041. XCTAssertTrue(result.isFailure)
  1042. XCTAssertNil(result.value)
  1043. XCTAssertNotNil(result.error)
  1044. }
  1045. func testThatStringResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  1046. // Given
  1047. let preprocessor = DropFirst()
  1048. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  1049. let data = Data("abcd".utf8)
  1050. // When
  1051. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1052. // Then
  1053. XCTAssertTrue(result.isSuccess)
  1054. XCTAssertEqual(result.value, "bcd")
  1055. XCTAssertNil(result.error)
  1056. }
  1057. func testThatStringResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  1058. // Given
  1059. let preprocessor = Throwing()
  1060. let serializer = StringResponseSerializer(dataPreprocessor: preprocessor)
  1061. let data = Data("abcd".utf8)
  1062. // When
  1063. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1064. // Then
  1065. XCTAssertTrue(result.isFailure)
  1066. XCTAssertNil(result.value)
  1067. XCTAssertNotNil(result.error)
  1068. }
  1069. func testThatJSONResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  1070. // Given
  1071. let preprocessor = DropFirst()
  1072. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  1073. let data = Data("1\"abcd\"".utf8)
  1074. // When
  1075. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1076. // Then
  1077. XCTAssertTrue(result.isSuccess)
  1078. XCTAssertEqual(result.value as? String, "abcd")
  1079. XCTAssertNil(result.error)
  1080. }
  1081. func testThatJSONResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  1082. // Given
  1083. let preprocessor = Throwing()
  1084. let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor)
  1085. let data = Data("1\"abcd\"".utf8)
  1086. // When
  1087. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1088. // Then
  1089. XCTAssertTrue(result.isFailure)
  1090. XCTAssertNil(result.value)
  1091. XCTAssertNotNil(result.error)
  1092. }
  1093. func testThatDecodableResponseSerializerProperlyCallsSuccessfulDataPreprocessor() {
  1094. // Given
  1095. let preprocessor = DropFirst()
  1096. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  1097. let data = Data("1{\"string\":\"string\"}".utf8)
  1098. // When
  1099. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1100. // Then
  1101. XCTAssertTrue(result.isSuccess)
  1102. XCTAssertEqual(result.value?.string, "string")
  1103. XCTAssertNil(result.error)
  1104. }
  1105. func testThatDecodableResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() {
  1106. // Given
  1107. let preprocessor = Throwing()
  1108. let serializer = DecodableResponseSerializer<DecodableResponseSerializerTests.DecodableValue>(dataPreprocessor: preprocessor)
  1109. let data = Data("1{\"string\":\"string\"}".utf8)
  1110. // When
  1111. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  1112. // Then
  1113. XCTAssertTrue(result.isFailure)
  1114. XCTAssertNil(result.value)
  1115. XCTAssertNotNil(result.error)
  1116. }
  1117. }
  1118. final class DataPreprocessorTests: BaseTestCase {
  1119. func testThatPassthroughPreprocessorPassesDataThrough() {
  1120. // Given
  1121. let preprocessor = PassthroughPreprocessor()
  1122. let data = Data("data".utf8)
  1123. // When
  1124. let result = Result { try preprocessor.preprocess(data) }
  1125. // Then
  1126. XCTAssertEqual(data, result.value, "Preprocessed data should equal original data.")
  1127. }
  1128. func testThatGoogleXSSIPreprocessorProperlyPreprocessesData() {
  1129. // Given
  1130. let preprocessor = GoogleXSSIPreprocessor()
  1131. let data = Data(")]}',\nabcd".utf8)
  1132. // When
  1133. let result = Result { try preprocessor.preprocess(data) }
  1134. // Then
  1135. XCTAssertEqual(result.value.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  1136. }
  1137. func testThatGoogleXSSIPreprocessorDoesNotChangeDataIfPrefixDoesNotMatch() {
  1138. // Given
  1139. let preprocessor = GoogleXSSIPreprocessor()
  1140. let data = Data("abcd".utf8)
  1141. // When
  1142. let result = Result { try preprocessor.preprocess(data) }
  1143. // Then
  1144. XCTAssertEqual(result.value.map { String(decoding: $0, as: UTF8.self) }, "abcd")
  1145. }
  1146. }
  1147. extension HTTPURLResponse {
  1148. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  1149. let url = URL(string: "https://httpbin.org/get")!
  1150. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  1151. }
  1152. }