ResponseSerializationTests.swift 50 KB

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