ResponseSerializationTests.swift 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014 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. private func httpURLResponse(forStatusCode statusCode: Int, headers: HTTPHeaders = [:]) -> HTTPURLResponse {
  28. let url = URL(string: "https://httpbin.org/get")!
  29. return HTTPURLResponse(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers)!
  30. }
  31. // MARK: -
  32. class DataResponseSerializationTestCase: BaseTestCase {
  33. // MARK: Properties
  34. private let error = AFError.responseSerializationFailed(reason: .inputDataNil)
  35. // MARK: Tests - Data Response Serializer
  36. func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
  37. // Given
  38. let serializer = DataRequest.dataResponseSerializer()
  39. let data = "data".data(using: .utf8)!
  40. // When
  41. let result = serializer.serializeResponse(nil, nil, data, nil)
  42. // Then
  43. XCTAssertTrue(result.isSuccess)
  44. XCTAssertNotNil(result.value)
  45. XCTAssertNil(result.error)
  46. }
  47. func testThatDataResponseSerializerFailsWhenDataIsNil() {
  48. // Given
  49. let serializer = DataRequest.dataResponseSerializer()
  50. // When
  51. let result = serializer.serializeResponse(nil, nil, nil, nil)
  52. // Then
  53. XCTAssertTrue(result.isFailure)
  54. XCTAssertNil(result.value)
  55. XCTAssertNotNil(result.error)
  56. if let error = result.error as? AFError {
  57. XCTAssertTrue(error.isInputDataNil)
  58. } else {
  59. XCTFail("error should not be nil")
  60. }
  61. }
  62. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  63. // Given
  64. let serializer = DataRequest.dataResponseSerializer()
  65. // When
  66. let result = serializer.serializeResponse(nil, nil, nil, error)
  67. // Then
  68. XCTAssertTrue(result.isFailure)
  69. XCTAssertNil(result.value)
  70. XCTAssertNotNil(result.error)
  71. if let error = result.error as? AFError {
  72. XCTAssertTrue(error.isInputDataNil)
  73. } else {
  74. XCTFail("error should not be nil")
  75. }
  76. }
  77. func testThatDataResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  78. // Given
  79. let serializer = DataRequest.dataResponseSerializer()
  80. let response = httpURLResponse(forStatusCode: 200)
  81. // When
  82. let result = serializer.serializeResponse(nil, response, nil, nil)
  83. // Then
  84. XCTAssertTrue(result.isFailure, "result is failure should be true")
  85. XCTAssertNil(result.value, "result value should be nil")
  86. XCTAssertNotNil(result.error, "result error should not be nil")
  87. if let error = result.error as? AFError {
  88. XCTAssertTrue(error.isInputDataNil)
  89. } else {
  90. XCTFail("error should not be nil")
  91. }
  92. }
  93. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  94. // Given
  95. let serializer = DataRequest.dataResponseSerializer()
  96. let response = httpURLResponse(forStatusCode: 204)
  97. // When
  98. let result = serializer.serializeResponse(nil, response, nil, nil)
  99. // Then
  100. XCTAssertTrue(result.isSuccess)
  101. XCTAssertNotNil(result.value)
  102. XCTAssertNil(result.error)
  103. if let data = result.value {
  104. XCTAssertEqual(data.count, 0)
  105. }
  106. }
  107. // MARK: Tests - String Response Serializer
  108. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  109. // Given
  110. let serializer = DataRequest.stringResponseSerializer()
  111. // When
  112. let result = serializer.serializeResponse(nil, nil, nil, nil)
  113. // Then
  114. XCTAssertTrue(result.isFailure)
  115. XCTAssertNil(result.value)
  116. XCTAssertNotNil(result.error)
  117. if let error = result.error as? AFError {
  118. XCTAssertTrue(error.isInputDataNil)
  119. } else {
  120. XCTFail("error should not be nil")
  121. }
  122. }
  123. func testThatStringResponseSerializerSucceedsWhenDataIsEmpty() {
  124. // Given
  125. let serializer = DataRequest.stringResponseSerializer()
  126. // When
  127. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  128. // Then
  129. XCTAssertTrue(result.isSuccess)
  130. XCTAssertNotNil(result.value)
  131. XCTAssertNil(result.error)
  132. }
  133. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  134. let serializer = DataRequest.stringResponseSerializer()
  135. let data = "data".data(using: .utf8)!
  136. // When
  137. let result = serializer.serializeResponse(nil, nil, data, nil)
  138. // Then
  139. XCTAssertTrue(result.isSuccess)
  140. XCTAssertNotNil(result.value)
  141. XCTAssertNil(result.error)
  142. }
  143. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  144. let serializer = DataRequest.stringResponseSerializer(encoding: .utf8)
  145. let data = "data".data(using: .utf8)!
  146. // When
  147. let result = serializer.serializeResponse(nil, nil, data, nil)
  148. // Then
  149. XCTAssertTrue(result.isSuccess)
  150. XCTAssertNotNil(result.value)
  151. XCTAssertNil(result.error)
  152. }
  153. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  154. let serializer = DataRequest.stringResponseSerializer()
  155. let data = "data".data(using: .utf8)!
  156. let response = httpURLResponse(forStatusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  157. // When
  158. let result = serializer.serializeResponse(nil, response, data, nil)
  159. // Then
  160. XCTAssertTrue(result.isSuccess)
  161. XCTAssertNotNil(result.value)
  162. XCTAssertNil(result.error)
  163. }
  164. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  165. // Given
  166. let serializer = DataRequest.stringResponseSerializer(encoding: .utf8)
  167. let data = "random data".data(using: .utf32)!
  168. // When
  169. let result = serializer.serializeResponse(nil, nil, data, nil)
  170. // Then
  171. XCTAssertTrue(result.isFailure)
  172. XCTAssertNil(result.value)
  173. XCTAssertNotNil(result.error)
  174. if let error = result.error as? AFError, let failedEncoding = error.failedStringEncoding {
  175. XCTAssertTrue(error.isStringSerializationFailed)
  176. XCTAssertEqual(failedEncoding, .utf8)
  177. } else {
  178. XCTFail("error should not be nil")
  179. }
  180. }
  181. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  182. // Given
  183. let serializer = DataRequest.stringResponseSerializer()
  184. let data = "random data".data(using: .utf32)!
  185. let response = httpURLResponse(forStatusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  186. // When
  187. let result = serializer.serializeResponse(nil, response, data, nil)
  188. // Then
  189. XCTAssertTrue(result.isFailure)
  190. XCTAssertNil(result.value)
  191. XCTAssertNotNil(result.error)
  192. if let error = result.error as? AFError, let failedEncoding = error.failedStringEncoding {
  193. XCTAssertTrue(error.isStringSerializationFailed)
  194. XCTAssertEqual(failedEncoding, .utf8)
  195. } else {
  196. XCTFail("error should not be nil")
  197. }
  198. }
  199. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  200. // Given
  201. let serializer = DataRequest.stringResponseSerializer()
  202. // When
  203. let result = serializer.serializeResponse(nil, nil, nil, error)
  204. // Then
  205. XCTAssertTrue(result.isFailure)
  206. XCTAssertNil(result.value)
  207. XCTAssertNotNil(result.error)
  208. if let error = result.error as? AFError {
  209. XCTAssertTrue(error.isInputDataNil)
  210. } else {
  211. XCTFail("error should not be nil")
  212. }
  213. }
  214. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  215. // Given
  216. let serializer = DataRequest.stringResponseSerializer()
  217. let response = httpURLResponse(forStatusCode: 200)
  218. // When
  219. let result = serializer.serializeResponse(nil, response, nil, nil)
  220. // Then
  221. XCTAssertTrue(result.isFailure)
  222. XCTAssertNil(result.value)
  223. XCTAssertNotNil(result.error)
  224. if let error = result.error as? AFError {
  225. XCTAssertTrue(error.isInputDataNil)
  226. } else {
  227. XCTFail("error should not be nil")
  228. }
  229. }
  230. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  231. // Given
  232. let serializer = DataRequest.stringResponseSerializer()
  233. let response = httpURLResponse(forStatusCode: 205)
  234. // When
  235. let result = serializer.serializeResponse(nil, response, nil, nil)
  236. // Then
  237. XCTAssertTrue(result.isSuccess)
  238. XCTAssertNotNil(result.value)
  239. XCTAssertNil(result.error)
  240. if let string = result.value {
  241. XCTAssertEqual(string, "")
  242. }
  243. }
  244. // MARK: Tests - JSON Response Serializer
  245. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  246. // Given
  247. let serializer = DataRequest.jsonResponseSerializer()
  248. // When
  249. let result = serializer.serializeResponse(nil, nil, nil, nil)
  250. // Then
  251. XCTAssertTrue(result.isFailure)
  252. XCTAssertNil(result.value)
  253. XCTAssertNotNil(result.error)
  254. if let error = result.error as? AFError {
  255. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  256. } else {
  257. XCTFail("error should not be nil")
  258. }
  259. }
  260. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  261. // Given
  262. let serializer = DataRequest.jsonResponseSerializer()
  263. // When
  264. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  265. // Then
  266. XCTAssertTrue(result.isFailure)
  267. XCTAssertNil(result.value)
  268. XCTAssertNotNil(result.error)
  269. if let error = result.error as? AFError {
  270. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  271. } else {
  272. XCTFail("error should not be nil")
  273. }
  274. }
  275. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  276. // Given
  277. let serializer = DataRequest.jsonResponseSerializer()
  278. let data = "{\"json\": true}".data(using: .utf8)!
  279. // When
  280. let result = serializer.serializeResponse(nil, nil, data, nil)
  281. // Then
  282. XCTAssertTrue(result.isSuccess)
  283. XCTAssertNotNil(result.value)
  284. XCTAssertNil(result.error)
  285. }
  286. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  287. // Given
  288. let serializer = DataRequest.jsonResponseSerializer()
  289. let data = "definitely not valid json".data(using: .utf8)!
  290. // When
  291. let result = serializer.serializeResponse(nil, nil, data, nil)
  292. // Then
  293. XCTAssertTrue(result.isFailure)
  294. XCTAssertNil(result.value)
  295. XCTAssertNotNil(result.error)
  296. if let error = result.error as? AFError, let underlyingError = error.underlyingError as? CocoaError {
  297. XCTAssertTrue(error.isJSONSerializationFailed)
  298. XCTAssertEqual(underlyingError.errorCode, 3840)
  299. } else {
  300. XCTFail("error should not be nil")
  301. }
  302. }
  303. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  304. // Given
  305. let serializer = DataRequest.jsonResponseSerializer()
  306. // When
  307. let result = serializer.serializeResponse(nil, nil, nil, error)
  308. // Then
  309. XCTAssertTrue(result.isFailure)
  310. XCTAssertNil(result.value)
  311. XCTAssertNotNil(result.error)
  312. if let error = result.error as? AFError {
  313. XCTAssertTrue(error.isInputDataNil)
  314. } else {
  315. XCTFail("error should not be nil")
  316. }
  317. }
  318. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  319. // Given
  320. let serializer = DataRequest.jsonResponseSerializer()
  321. let response = httpURLResponse(forStatusCode: 200)
  322. // When
  323. let result = serializer.serializeResponse(nil, response, nil, nil)
  324. // Then
  325. XCTAssertTrue(result.isFailure)
  326. XCTAssertNil(result.value)
  327. XCTAssertNotNil(result.error)
  328. if let error = result.error as? AFError {
  329. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  330. } else {
  331. XCTFail("error should not be nil")
  332. }
  333. }
  334. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  335. // Given
  336. let serializer = DataRequest.jsonResponseSerializer()
  337. let response = httpURLResponse(forStatusCode: 204)
  338. // When
  339. let result = serializer.serializeResponse(nil, response, nil, nil)
  340. // Then
  341. XCTAssertTrue(result.isSuccess)
  342. XCTAssertNotNil(result.value)
  343. XCTAssertNil(result.error)
  344. if let json = result.value as? NSNull {
  345. XCTAssertEqual(json, NSNull())
  346. }
  347. }
  348. // MARK: Tests - Property List Response Serializer
  349. func testThatPropertyListResponseSerializerFailsWhenDataIsNil() {
  350. // Given
  351. let serializer = DataRequest.propertyListResponseSerializer()
  352. // When
  353. let result = serializer.serializeResponse(nil, nil, nil, nil)
  354. // Then
  355. XCTAssertTrue(result.isFailure)
  356. XCTAssertNil(result.value)
  357. XCTAssertNotNil(result.error)
  358. if let error = result.error as? AFError {
  359. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  360. } else {
  361. XCTFail("error should not be nil")
  362. }
  363. }
  364. func testThatPropertyListResponseSerializerFailsWhenDataIsEmpty() {
  365. // Given
  366. let serializer = DataRequest.propertyListResponseSerializer()
  367. // When
  368. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  369. // Then
  370. XCTAssertTrue(result.isFailure)
  371. XCTAssertNil(result.value)
  372. XCTAssertNotNil(result.error)
  373. if let error = result.error as? AFError {
  374. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  375. } else {
  376. XCTFail("error should not be nil")
  377. }
  378. }
  379. @available(macOS 10.11, iOS 9.0, tvOS 9.0, *)
  380. func testThatPropertyListResponseSerializerSucceedsWhenDataIsValidPropertyListData() {
  381. // Given
  382. let serializer = DataRequest.propertyListResponseSerializer()
  383. let data = NSKeyedArchiver.archivedData(withRootObject: ["foo": "bar"])
  384. // When
  385. let result = serializer.serializeResponse(nil, nil, data, nil)
  386. // Then
  387. XCTAssertTrue(result.isSuccess)
  388. XCTAssertNotNil(result.value)
  389. XCTAssertNil(result.error)
  390. }
  391. func testThatPropertyListResponseSerializerFailsWhenDataIsInvalidPropertyListData() {
  392. // Given
  393. let serializer = DataRequest.propertyListResponseSerializer()
  394. let data = "definitely not valid plist data".data(using: .utf8)!
  395. // When
  396. let result = serializer.serializeResponse(nil, nil, data, nil)
  397. // Then
  398. XCTAssertTrue(result.isFailure)
  399. XCTAssertNil(result.value)
  400. XCTAssertNotNil(result.error)
  401. if let error = result.error as? AFError, let underlyingError = error.underlyingError as? CocoaError {
  402. XCTAssertTrue(error.isPropertyListSerializationFailed)
  403. XCTAssertEqual(underlyingError.errorCode, 3840)
  404. } else {
  405. XCTFail("error should not be nil")
  406. }
  407. }
  408. func testThatPropertyListResponseSerializerFailsWhenErrorIsNotNil() {
  409. // Given
  410. let serializer = DataRequest.propertyListResponseSerializer()
  411. // When
  412. let result = serializer.serializeResponse(nil, nil, nil, error)
  413. // Then
  414. XCTAssertTrue(result.isFailure)
  415. XCTAssertNil(result.value)
  416. XCTAssertNotNil(result.error)
  417. if let error = result.error as? AFError {
  418. XCTAssertTrue(error.isInputDataNil)
  419. } else {
  420. XCTFail("error should not be nil")
  421. }
  422. }
  423. func testThatPropertyListResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  424. // Given
  425. let serializer = DataRequest.propertyListResponseSerializer()
  426. let response = httpURLResponse(forStatusCode: 200)
  427. // When
  428. let result = serializer.serializeResponse(nil, response, nil, nil)
  429. // Then
  430. XCTAssertTrue(result.isFailure)
  431. XCTAssertNil(result.value)
  432. XCTAssertNotNil(result.error)
  433. if let error = result.error as? AFError {
  434. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  435. } else {
  436. XCTFail("error should not be nil")
  437. }
  438. }
  439. func testThatPropertyListResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  440. // Given
  441. let serializer = DataRequest.propertyListResponseSerializer()
  442. let response = httpURLResponse(forStatusCode: 205)
  443. // When
  444. let result = serializer.serializeResponse(nil, response, nil, nil)
  445. // Then
  446. XCTAssertTrue(result.isSuccess)
  447. XCTAssertNotNil(result.value)
  448. XCTAssertNil(result.error)
  449. if let plist = result.value as? NSNull {
  450. XCTAssertEqual(plist, NSNull())
  451. }
  452. }
  453. }
  454. // MARK: -
  455. class DownloadResponseSerializationTestCase: BaseTestCase {
  456. // MARK: Properties
  457. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  458. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  459. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  460. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  461. private var plistEmptyDataFileURL: URL { return url(forResource: "empty", withExtension: "data") }
  462. private var plistValidDataFileURL: URL { return url(forResource: "valid", withExtension: "data") }
  463. private var plistInvalidDataFileURL: URL { return url(forResource: "invalid", withExtension: "data") }
  464. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  465. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  466. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  467. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  468. // MARK: Tests - Data Response Serializer
  469. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  470. // Given
  471. let serializer = DownloadRequest.dataResponseSerializer()
  472. // When
  473. let result = serializer.serializeResponse(nil, nil, jsonValidDataFileURL, nil)
  474. // Then
  475. XCTAssertTrue(result.isSuccess)
  476. XCTAssertNotNil(result.value)
  477. XCTAssertNil(result.error)
  478. }
  479. func testThatDataResponseSerializerSucceedsWhenFileDataIsNil() {
  480. // Given
  481. let serializer = DownloadRequest.dataResponseSerializer()
  482. // When
  483. let result = serializer.serializeResponse(nil, nil, jsonEmptyDataFileURL, nil)
  484. // Then
  485. XCTAssertTrue(result.isSuccess)
  486. XCTAssertNotNil(result.value)
  487. XCTAssertNil(result.error)
  488. }
  489. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  490. // Given
  491. let serializer = DownloadRequest.dataResponseSerializer()
  492. // When
  493. let result = serializer.serializeResponse(nil, nil, nil, nil)
  494. // Then
  495. XCTAssertTrue(result.isFailure)
  496. XCTAssertNil(result.value)
  497. XCTAssertNotNil(result.error)
  498. if let error = result.error as? AFError {
  499. XCTAssertTrue(error.isInputFileNil)
  500. } else {
  501. XCTFail("error should not be nil")
  502. }
  503. }
  504. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  505. // Given
  506. let serializer = DownloadRequest.dataResponseSerializer()
  507. // When
  508. let result = serializer.serializeResponse(nil, nil, invalidFileURL, nil)
  509. // Then
  510. XCTAssertTrue(result.isFailure)
  511. XCTAssertNil(result.value)
  512. XCTAssertNotNil(result.error)
  513. if let error = result.error as? AFError {
  514. XCTAssertTrue(error.isInputFileReadFailed)
  515. } else {
  516. XCTFail("error should not be nil")
  517. }
  518. }
  519. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  520. // Given
  521. let serializer = DownloadRequest.dataResponseSerializer()
  522. // When
  523. let result = serializer.serializeResponse(nil, nil, nil, error)
  524. // Then
  525. XCTAssertTrue(result.isFailure)
  526. XCTAssertNil(result.value)
  527. XCTAssertNotNil(result.error)
  528. if let error = result.error as? AFError {
  529. XCTAssertTrue(error.isInputFileNil)
  530. } else {
  531. XCTFail("error should not be nil")
  532. }
  533. }
  534. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  535. // Given
  536. let serializer = DownloadRequest.dataResponseSerializer()
  537. let response = httpURLResponse(forStatusCode: 200)
  538. // When
  539. let result = serializer.serializeResponse(nil, response, nil, nil)
  540. // Then
  541. XCTAssertTrue(result.isFailure)
  542. XCTAssertNil(result.value)
  543. XCTAssertNotNil(result.error)
  544. if let error = result.error as? AFError {
  545. XCTAssertTrue(error.isInputFileNil)
  546. } else {
  547. XCTFail("error should not be nil")
  548. }
  549. }
  550. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  551. // Given
  552. let serializer = DataRequest.dataResponseSerializer()
  553. let response = httpURLResponse(forStatusCode: 205)
  554. // When
  555. let result = serializer.serializeResponse(nil, response, nil, nil)
  556. // Then
  557. XCTAssertTrue(result.isSuccess)
  558. XCTAssertNotNil(result.value)
  559. XCTAssertNil(result.error)
  560. if let data = result.value {
  561. XCTAssertEqual(data.count, 0)
  562. }
  563. }
  564. // MARK: Tests - String Response Serializer
  565. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  566. // Given
  567. let serializer = DownloadRequest.stringResponseSerializer()
  568. // When
  569. let result = serializer.serializeResponse(nil, nil, nil, nil)
  570. // Then
  571. XCTAssertTrue(result.isFailure)
  572. XCTAssertNil(result.value)
  573. XCTAssertNotNil(result.error)
  574. if let error = result.error as? AFError {
  575. XCTAssertTrue(error.isInputFileNil)
  576. } else {
  577. XCTFail("error should not be nil")
  578. }
  579. }
  580. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  581. // Given
  582. let serializer = DownloadRequest.stringResponseSerializer()
  583. // When
  584. let result = serializer.serializeResponse(nil, nil, invalidFileURL, nil)
  585. // Then
  586. XCTAssertEqual(result.isSuccess, false)
  587. XCTAssertNil(result.value)
  588. XCTAssertNotNil(result.error)
  589. if let error = result.error as? AFError {
  590. XCTAssertTrue(error.isInputFileReadFailed)
  591. } else {
  592. XCTFail("error should not be nil")
  593. }
  594. }
  595. func testThatStringResponseSerializerSucceedsWhenFileDataIsEmpty() {
  596. // Given
  597. let serializer = DownloadRequest.stringResponseSerializer()
  598. // When
  599. let result = serializer.serializeResponse(nil, nil, stringEmptyDataFileURL, nil)
  600. // Then
  601. XCTAssertTrue(result.isSuccess)
  602. XCTAssertNotNil(result.value)
  603. XCTAssertNil(result.error)
  604. }
  605. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  606. let serializer = DownloadRequest.stringResponseSerializer()
  607. // When
  608. let result = serializer.serializeResponse(nil, nil, stringUTF8DataFileURL, nil)
  609. // Then
  610. XCTAssertTrue(result.isSuccess)
  611. XCTAssertNotNil(result.value)
  612. XCTAssertNil(result.error)
  613. }
  614. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  615. let serializer = DownloadRequest.stringResponseSerializer(encoding: .utf8)
  616. // When
  617. let result = serializer.serializeResponse(nil, nil, stringUTF8DataFileURL, nil)
  618. // Then
  619. XCTAssertTrue(result.isSuccess)
  620. XCTAssertNotNil(result.value)
  621. XCTAssertNil(result.error)
  622. }
  623. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  624. let serializer = DownloadRequest.stringResponseSerializer()
  625. let response = httpURLResponse(forStatusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  626. // When
  627. let result = serializer.serializeResponse(nil, response, stringUTF8DataFileURL, nil)
  628. // Then
  629. XCTAssertTrue(result.isSuccess)
  630. XCTAssertNotNil(result.value)
  631. XCTAssertNil(result.error)
  632. }
  633. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  634. // Given
  635. let serializer = DownloadRequest.stringResponseSerializer(encoding: .utf8)
  636. // When
  637. let result = serializer.serializeResponse(nil, nil, stringUTF32DataFileURL, nil)
  638. // Then
  639. XCTAssertTrue(result.isFailure)
  640. XCTAssertNil(result.value)
  641. XCTAssertNotNil(result.error)
  642. if let error = result.error as? AFError, let failedEncoding = error.failedStringEncoding {
  643. XCTAssertTrue(error.isStringSerializationFailed)
  644. XCTAssertEqual(failedEncoding, .utf8)
  645. } else {
  646. XCTFail("error should not be nil")
  647. }
  648. }
  649. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  650. // Given
  651. let serializer = DownloadRequest.stringResponseSerializer()
  652. let response = httpURLResponse(forStatusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  653. // When
  654. let result = serializer.serializeResponse(nil, response, stringUTF32DataFileURL, nil)
  655. // Then
  656. XCTAssertTrue(result.isFailure)
  657. XCTAssertNil(result.value)
  658. XCTAssertNotNil(result.error)
  659. if let error = result.error as? AFError, let failedEncoding = error.failedStringEncoding {
  660. XCTAssertTrue(error.isStringSerializationFailed)
  661. XCTAssertEqual(failedEncoding, .utf8)
  662. } else {
  663. XCTFail("error should not be nil")
  664. }
  665. }
  666. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  667. // Given
  668. let serializer = DownloadRequest.stringResponseSerializer()
  669. // When
  670. let result = serializer.serializeResponse(nil, nil, nil, error)
  671. // Then
  672. XCTAssertTrue(result.isFailure)
  673. XCTAssertNil(result.value)
  674. XCTAssertNotNil(result.error)
  675. if let error = result.error as? AFError {
  676. XCTAssertTrue(error.isInputFileNil)
  677. } else {
  678. XCTFail("error should not be nil")
  679. }
  680. }
  681. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  682. // Given
  683. let serializer = DataRequest.stringResponseSerializer()
  684. let response = httpURLResponse(forStatusCode: 200)
  685. // When
  686. let result = serializer.serializeResponse(nil, response, nil, nil)
  687. // Then
  688. XCTAssertTrue(result.isFailure)
  689. XCTAssertNil(result.value)
  690. XCTAssertNotNil(result.error)
  691. if let error = result.error as? AFError {
  692. XCTAssertTrue(error.isInputDataNil)
  693. } else {
  694. XCTFail("error should not be nil")
  695. }
  696. }
  697. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  698. // Given
  699. let serializer = DataRequest.stringResponseSerializer()
  700. let response = httpURLResponse(forStatusCode: 204)
  701. // When
  702. let result = serializer.serializeResponse(nil, response, nil, nil)
  703. // Then
  704. XCTAssertTrue(result.isSuccess)
  705. XCTAssertNotNil(result.value)
  706. XCTAssertNil(result.error)
  707. if let string = result.value {
  708. XCTAssertEqual(string, "")
  709. }
  710. }
  711. // MARK: Tests - JSON Response Serializer
  712. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  713. // Given
  714. let serializer = DownloadRequest.jsonResponseSerializer()
  715. // When
  716. let result = serializer.serializeResponse(nil, nil, nil, nil)
  717. // Then
  718. XCTAssertTrue(result.isFailure)
  719. XCTAssertNil(result.value)
  720. XCTAssertNotNil(result.error)
  721. if let error = result.error as? AFError {
  722. XCTAssertTrue(error.isInputFileNil)
  723. } else {
  724. XCTFail("error should not be nil")
  725. }
  726. }
  727. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  728. // Given
  729. let serializer = DownloadRequest.jsonResponseSerializer()
  730. // When
  731. let result = serializer.serializeResponse(nil, nil, invalidFileURL, nil)
  732. // Then
  733. XCTAssertTrue(result.isFailure)
  734. XCTAssertNil(result.value)
  735. XCTAssertNotNil(result.error)
  736. if let error = result.error as? AFError {
  737. XCTAssertTrue(error.isInputFileReadFailed)
  738. } else {
  739. XCTFail("error should not be nil")
  740. }
  741. }
  742. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  743. // Given
  744. let serializer = DownloadRequest.jsonResponseSerializer()
  745. // When
  746. let result = serializer.serializeResponse(nil, nil, jsonEmptyDataFileURL, nil)
  747. // Then
  748. XCTAssertTrue(result.isFailure)
  749. XCTAssertNil(result.value)
  750. XCTAssertNotNil(result.error)
  751. if let error = result.error as? AFError {
  752. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  753. } else {
  754. XCTFail("error should not be nil")
  755. }
  756. }
  757. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  758. // Given
  759. let serializer = DownloadRequest.jsonResponseSerializer()
  760. // When
  761. let result = serializer.serializeResponse(nil, nil, jsonValidDataFileURL, nil)
  762. // Then
  763. XCTAssertTrue(result.isSuccess)
  764. XCTAssertNotNil(result.value)
  765. XCTAssertNil(result.error)
  766. }
  767. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  768. // Given
  769. let serializer = DownloadRequest.jsonResponseSerializer()
  770. // When
  771. let result = serializer.serializeResponse(nil, nil, jsonInvalidDataFileURL, nil)
  772. // Then
  773. XCTAssertTrue(result.isFailure)
  774. XCTAssertNil(result.value)
  775. XCTAssertNotNil(result.error)
  776. if let error = result.error as? AFError, let underlyingError = error.underlyingError as? CocoaError {
  777. XCTAssertTrue(error.isJSONSerializationFailed)
  778. XCTAssertEqual(underlyingError.errorCode, 3840)
  779. } else {
  780. XCTFail("error should not be nil")
  781. }
  782. }
  783. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  784. // Given
  785. let serializer = DownloadRequest.jsonResponseSerializer()
  786. // When
  787. let result = serializer.serializeResponse(nil, nil, nil, error)
  788. // Then
  789. XCTAssertTrue(result.isFailure)
  790. XCTAssertNil(result.value)
  791. XCTAssertNotNil(result.error)
  792. if let error = result.error as? AFError {
  793. XCTAssertTrue(error.isInputFileNil)
  794. } else {
  795. XCTFail("error should not be nil")
  796. }
  797. }
  798. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  799. // Given
  800. let serializer = DataRequest.jsonResponseSerializer()
  801. let response = httpURLResponse(forStatusCode: 200)
  802. // When
  803. let result = serializer.serializeResponse(nil, response, nil, nil)
  804. // Then
  805. XCTAssertTrue(result.isFailure)
  806. XCTAssertNil(result.value)
  807. XCTAssertNotNil(result.error)
  808. if let error = result.error as? AFError {
  809. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  810. } else {
  811. XCTFail("error should not be nil")
  812. }
  813. }
  814. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  815. // Given
  816. let serializer = DataRequest.jsonResponseSerializer()
  817. let response = httpURLResponse(forStatusCode: 205)
  818. // When
  819. let result = serializer.serializeResponse(nil, response, nil, nil)
  820. // Then
  821. XCTAssertTrue(result.isSuccess)
  822. XCTAssertNotNil(result.value)
  823. XCTAssertNil(result.error)
  824. if let json = result.value as? NSNull {
  825. XCTAssertEqual(json, NSNull())
  826. }
  827. }
  828. // MARK: Tests - Property List Response Serializer
  829. func testThatPropertyListResponseSerializerFailsWhenFileURLIsNil() {
  830. // Given
  831. let serializer = DownloadRequest.propertyListResponseSerializer()
  832. // When
  833. let result = serializer.serializeResponse(nil, nil, nil, nil)
  834. // Then
  835. XCTAssertTrue(result.isFailure)
  836. XCTAssertNil(result.value)
  837. XCTAssertNotNil(result.error)
  838. if let error = result.error as? AFError {
  839. XCTAssertTrue(error.isInputFileNil)
  840. } else {
  841. XCTFail("error should not be nil")
  842. }
  843. }
  844. func testThatPropertyListResponseSerializerFailsWhenFileURLIsInvalid() {
  845. // Given
  846. let serializer = DownloadRequest.propertyListResponseSerializer()
  847. // When
  848. let result = serializer.serializeResponse(nil, nil, invalidFileURL, nil)
  849. // Then
  850. XCTAssertTrue(result.isFailure)
  851. XCTAssertNil(result.value)
  852. XCTAssertNotNil(result.error)
  853. if let error = result.error as? AFError {
  854. XCTAssertTrue(error.isInputFileReadFailed)
  855. } else {
  856. XCTFail("error should not be nil")
  857. }
  858. }
  859. func testThatPropertyListResponseSerializerFailsWhenFileDataIsEmpty() {
  860. // Given
  861. let serializer = DownloadRequest.propertyListResponseSerializer()
  862. // When
  863. let result = serializer.serializeResponse(nil, nil, plistEmptyDataFileURL, nil)
  864. // Then
  865. XCTAssertTrue(result.isFailure)
  866. XCTAssertNil(result.value)
  867. XCTAssertNotNil(result.error)
  868. if let error = result.error as? AFError {
  869. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  870. } else {
  871. XCTFail("error should not be nil")
  872. }
  873. }
  874. func testThatPropertyListResponseSerializerSucceedsWhenFileDataIsValidPropertyListData() {
  875. // Given
  876. let serializer = DownloadRequest.propertyListResponseSerializer()
  877. // When
  878. let result = serializer.serializeResponse(nil, nil, plistValidDataFileURL, nil)
  879. // Then
  880. XCTAssertTrue(result.isSuccess)
  881. XCTAssertNotNil(result.value)
  882. XCTAssertNil(result.error)
  883. }
  884. func testThatPropertyListResponseSerializerFailsWhenDataIsInvalidPropertyListData() {
  885. // Given
  886. let serializer = DownloadRequest.propertyListResponseSerializer()
  887. // When
  888. let result = serializer.serializeResponse(nil, nil, plistInvalidDataFileURL, nil)
  889. // Then
  890. XCTAssertTrue(result.isFailure)
  891. XCTAssertNil(result.value)
  892. XCTAssertNotNil(result.error)
  893. if let error = result.error as? AFError, let underlyingError = error.underlyingError as? CocoaError {
  894. XCTAssertTrue(error.isPropertyListSerializationFailed)
  895. XCTAssertEqual(underlyingError.errorCode, 3840)
  896. } else {
  897. XCTFail("error should not be nil")
  898. }
  899. }
  900. func testThatPropertyListResponseSerializerFailsWhenErrorIsNotNil() {
  901. // Given
  902. let serializer = DownloadRequest.propertyListResponseSerializer()
  903. // When
  904. let result = serializer.serializeResponse(nil, nil, nil, error)
  905. // Then
  906. XCTAssertTrue(result.isFailure)
  907. XCTAssertNil(result.value)
  908. XCTAssertNotNil(result.error)
  909. if let error = result.error as? AFError {
  910. XCTAssertTrue(error.isInputFileNil)
  911. } else {
  912. XCTFail("error should not be nil")
  913. }
  914. }
  915. func testThatPropertyListResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  916. // Given
  917. let serializer = DataRequest.propertyListResponseSerializer()
  918. let response = httpURLResponse(forStatusCode: 200)
  919. // When
  920. let result = serializer.serializeResponse(nil, response, nil, nil)
  921. // Then
  922. XCTAssertTrue(result.isFailure)
  923. XCTAssertNil(result.value)
  924. XCTAssertNotNil(result.error)
  925. if let error = result.error as? AFError {
  926. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  927. } else {
  928. XCTFail("error should not be nil")
  929. }
  930. }
  931. func testThatPropertyListResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
  932. // Given
  933. let serializer = DataRequest.propertyListResponseSerializer()
  934. let response = httpURLResponse(forStatusCode: 204)
  935. // When
  936. let result = serializer.serializeResponse(nil, response, nil, nil)
  937. // Then
  938. XCTAssertTrue(result.isSuccess)
  939. XCTAssertNotNil(result.value)
  940. XCTAssertNil(result.error)
  941. if let plist = result.value as? NSNull {
  942. XCTAssertEqual(plist, NSNull(), "plist should be equal to NSNull")
  943. }
  944. }
  945. }