ResponseSerializationTests.swift 48 KB

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