ResponseSerializationTests.swift 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import Foundation
  26. import XCTest
  27. class DataResponseSerializationTestCase: BaseTestCase {
  28. // MARK: Properties
  29. private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)
  30. // MARK: DataResponseSerializer
  31. func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
  32. // Given
  33. let serializer = DataResponseSerializer()
  34. let data = Data("data".utf8)
  35. // When
  36. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  37. // Then
  38. XCTAssertTrue(result.isSuccess)
  39. XCTAssertNotNil(result.value)
  40. XCTAssertNil(result.error)
  41. }
  42. func testThatDataResponseSerializerFailsWhenDataIsNil() {
  43. // Given
  44. let serializer = DataResponseSerializer()
  45. // When
  46. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  47. // Then
  48. XCTAssertTrue(result.isFailure)
  49. XCTAssertNil(result.value)
  50. XCTAssertNotNil(result.error)
  51. if let error = result.error?.asAFError {
  52. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  53. } else {
  54. XCTFail("error should not be nil")
  55. }
  56. }
  57. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  58. // Given
  59. let serializer = DataResponseSerializer()
  60. // When
  61. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  62. // Then
  63. XCTAssertTrue(result.isFailure)
  64. XCTAssertNil(result.value)
  65. XCTAssertNotNil(result.error)
  66. if let error = result.error?.asAFError {
  67. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  68. } else {
  69. XCTFail("error should not be nil")
  70. }
  71. }
  72. func testThatDataResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  73. // Given
  74. let serializer = DataResponseSerializer()
  75. let response = HTTPURLResponse(statusCode: 200)
  76. // When
  77. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  78. // Then
  79. XCTAssertTrue(result.isFailure, "result is failure should be true")
  80. XCTAssertNil(result.value, "result value should be nil")
  81. XCTAssertNotNil(result.error, "result error should not be nil")
  82. if let error = result.error?.asAFError {
  83. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  84. } else {
  85. XCTFail("error should not be nil")
  86. }
  87. }
  88. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  89. // Given
  90. let serializer = DataResponseSerializer()
  91. let response = HTTPURLResponse(statusCode: 204)
  92. // When
  93. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  94. // Then
  95. XCTAssertTrue(result.isSuccess)
  96. XCTAssertNotNil(result.value)
  97. XCTAssertNil(result.error)
  98. if let data = result.value {
  99. XCTAssertEqual(data.count, 0)
  100. }
  101. }
  102. // MARK: StringResponseSerializer
  103. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  104. // Given
  105. let serializer = DataResponseSerializer()
  106. // When
  107. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  108. // Then
  109. XCTAssertTrue(result.isFailure)
  110. XCTAssertNil(result.value)
  111. XCTAssertNotNil(result.error)
  112. if let error = result.error?.asAFError {
  113. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  114. } else {
  115. XCTFail("error should not be nil")
  116. }
  117. }
  118. func testThatStringResponseSerializerFailsWhenDataIsEmpty() {
  119. // Given
  120. let serializer = StringResponseSerializer()
  121. // When
  122. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  123. // Then
  124. XCTAssertTrue(result.isFailure)
  125. XCTAssertNil(result.value)
  126. XCTAssertNotNil(result.error)
  127. if let error = result.error?.asAFError {
  128. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  129. } else {
  130. XCTFail("error should not be nil")
  131. }
  132. }
  133. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  134. let serializer = StringResponseSerializer()
  135. let data = Data("data".utf8)
  136. // When
  137. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  138. // Then
  139. XCTAssertTrue(result.isSuccess)
  140. XCTAssertNotNil(result.value)
  141. XCTAssertNil(result.error)
  142. }
  143. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  144. let serializer = StringResponseSerializer(encoding: .utf8)
  145. let data = Data("data".utf8)
  146. // When
  147. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  148. // Then
  149. XCTAssertTrue(result.isSuccess)
  150. XCTAssertNotNil(result.value)
  151. XCTAssertNil(result.error)
  152. }
  153. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  154. let serializer = StringResponseSerializer()
  155. let data = Data("data".utf8)
  156. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  157. // When
  158. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  159. // Then
  160. XCTAssertTrue(result.isSuccess)
  161. XCTAssertNotNil(result.value)
  162. XCTAssertNil(result.error)
  163. }
  164. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  165. // Given
  166. let serializer = StringResponseSerializer(encoding: .utf8)
  167. let data = "random data".data(using: .utf32)!
  168. // When
  169. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  170. // Then
  171. XCTAssertTrue(result.isFailure)
  172. XCTAssertNil(result.value)
  173. XCTAssertNotNil(result.error)
  174. if let error = result.error?.asAFError, 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 = StringResponseSerializer()
  184. let data = "random data".data(using: .utf32)!
  185. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  186. // When
  187. let result = Result { try serializer.serialize(request: nil, response: response, data: data, error: nil) }
  188. // Then
  189. XCTAssertTrue(result.isFailure)
  190. XCTAssertNil(result.value)
  191. XCTAssertNotNil(result.error)
  192. if let error = result.error?.asAFError, 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 = StringResponseSerializer()
  202. // When
  203. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  204. // Then
  205. XCTAssertTrue(result.isFailure)
  206. XCTAssertNil(result.value)
  207. XCTAssertNotNil(result.error)
  208. if let error = result.error?.asAFError {
  209. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  210. } else {
  211. XCTFail("error should not be nil")
  212. }
  213. }
  214. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  215. // Given
  216. let serializer = StringResponseSerializer()
  217. let response = HTTPURLResponse(statusCode: 200)
  218. // When
  219. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  220. // Then
  221. XCTAssertTrue(result.isFailure)
  222. XCTAssertNil(result.value)
  223. XCTAssertNotNil(result.error)
  224. if let error = result.error?.asAFError {
  225. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  226. } else {
  227. XCTFail("error should not be nil")
  228. }
  229. }
  230. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  231. // Given
  232. let serializer = StringResponseSerializer()
  233. let response = HTTPURLResponse(statusCode: 205)
  234. // When
  235. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: 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: JSONResponseSerializer
  245. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  246. // Given
  247. let serializer = JSONResponseSerializer()
  248. // When
  249. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  250. // Then
  251. XCTAssertTrue(result.isFailure)
  252. XCTAssertNil(result.value)
  253. XCTAssertNotNil(result.error)
  254. if let error = result.error?.asAFError {
  255. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  256. } else {
  257. XCTFail("error should not be nil")
  258. }
  259. }
  260. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  261. // Given
  262. let serializer = JSONResponseSerializer()
  263. // When
  264. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  265. // Then
  266. XCTAssertTrue(result.isFailure)
  267. XCTAssertNil(result.value)
  268. XCTAssertNotNil(result.error)
  269. if let error = result.error?.asAFError {
  270. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  271. } else {
  272. XCTFail("error should not be nil")
  273. }
  274. }
  275. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  276. // Given
  277. let serializer = JSONResponseSerializer()
  278. let data = Data("{\"json\": true}".utf8)
  279. // When
  280. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  281. // Then
  282. XCTAssertTrue(result.isSuccess)
  283. XCTAssertNotNil(result.value)
  284. XCTAssertNil(result.error)
  285. }
  286. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  287. // Given
  288. let serializer = JSONResponseSerializer()
  289. let data = Data("definitely not valid json".utf8)
  290. // When
  291. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  292. // Then
  293. XCTAssertTrue(result.isFailure)
  294. XCTAssertNil(result.value)
  295. XCTAssertNotNil(result.error)
  296. if let error = result.error?.asAFError, 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 = JSONResponseSerializer()
  306. // When
  307. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  308. // Then
  309. XCTAssertTrue(result.isFailure)
  310. XCTAssertNil(result.value)
  311. XCTAssertNotNil(result.error)
  312. if let error = result.error?.asAFError {
  313. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  314. } else {
  315. XCTFail("error should not be nil")
  316. }
  317. }
  318. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  319. // Given
  320. let serializer = JSONResponseSerializer()
  321. let response = HTTPURLResponse(statusCode: 200)
  322. // When
  323. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  324. // Then
  325. XCTAssertTrue(result.isFailure)
  326. XCTAssertNil(result.value)
  327. XCTAssertNotNil(result.error)
  328. if let error = result.error?.asAFError {
  329. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  330. } else {
  331. XCTFail("error should not be nil")
  332. }
  333. }
  334. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  335. // Given
  336. let serializer = JSONResponseSerializer()
  337. let response = HTTPURLResponse(statusCode: 204)
  338. // When
  339. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: 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. } else {
  347. XCTFail("json should not be nil")
  348. }
  349. }
  350. // MARK: JSONDecodableResponseSerializer
  351. struct DecodableValue: Codable {
  352. let string: String
  353. }
  354. func testThatJSONDecodableResponseSerializerFailsWhenDataIsNil() {
  355. // Given
  356. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  357. // When
  358. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) }
  359. // Then
  360. XCTAssertTrue(result.isFailure)
  361. XCTAssertNil(result.value)
  362. XCTAssertNotNil(result.error)
  363. if let error = result.error?.asAFError {
  364. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  365. } else {
  366. XCTFail("error should not be nil")
  367. }
  368. }
  369. func testThatJSONDecodableResponseSerializerFailsWhenDataIsEmpty() {
  370. // Given
  371. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  372. // When
  373. let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) }
  374. // Then
  375. XCTAssertTrue(result.isFailure)
  376. XCTAssertNil(result.value)
  377. XCTAssertNotNil(result.error)
  378. if let error = result.error?.asAFError {
  379. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  380. } else {
  381. XCTFail("error should not be nil")
  382. }
  383. }
  384. func testThatJSONDecodableResponseSerializerSucceedsWhenDataIsValidJSON() {
  385. // Given
  386. let data = Data("{\"string\":\"string\"}".utf8)
  387. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  388. // When
  389. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  390. // Then
  391. XCTAssertTrue(result.isSuccess)
  392. XCTAssertNotNil(result.value)
  393. XCTAssertEqual(result.value?.string, "string")
  394. XCTAssertNil(result.error)
  395. }
  396. func testThatJSONDecodableResponseSerializerFailsWhenDataIsInvalidJSON() {
  397. // Given
  398. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  399. let data = Data("definitely not valid json".utf8)
  400. // When
  401. let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) }
  402. // Then
  403. XCTAssertTrue(result.isFailure)
  404. XCTAssertNil(result.value)
  405. XCTAssertNotNil(result.error)
  406. }
  407. func testThatJSONDecodableResponseSerializerFailsWhenErrorIsNotNil() {
  408. // Given
  409. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  410. // When
  411. let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) }
  412. // Then
  413. XCTAssertTrue(result.isFailure)
  414. XCTAssertNil(result.value)
  415. XCTAssertNotNil(result.error)
  416. if let error = result.error?.asAFError {
  417. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  418. } else {
  419. XCTFail("error should not be nil")
  420. }
  421. }
  422. func testThatJSONDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  423. // Given
  424. let serializer = JSONDecodableResponseSerializer<DecodableValue>()
  425. let response = HTTPURLResponse(statusCode: 200)
  426. // When
  427. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  428. // Then
  429. XCTAssertTrue(result.isFailure)
  430. XCTAssertNil(result.value)
  431. XCTAssertNotNil(result.error)
  432. if let error = result.error?.asAFError {
  433. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  434. } else {
  435. XCTFail("error should not be nil")
  436. }
  437. }
  438. func testThatJSONDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  439. // Given
  440. let serializer = JSONDecodableResponseSerializer<Empty>()
  441. let response = HTTPURLResponse(statusCode: 204)
  442. // When
  443. let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) }
  444. // Then
  445. XCTAssertTrue(result.isSuccess)
  446. XCTAssertNotNil(result.value)
  447. XCTAssertNil(result.error)
  448. }
  449. }
  450. // MARK: -
  451. class DownloadResponseSerializationTestCase: BaseTestCase {
  452. // MARK: Properties
  453. private let error = AFError.responseSerializationFailed(reason: .inputFileNil)
  454. private var jsonEmptyDataFileURL: URL { return url(forResource: "empty_data", withExtension: "json") }
  455. private var jsonValidDataFileURL: URL { return url(forResource: "valid_data", withExtension: "json") }
  456. private var jsonInvalidDataFileURL: URL { return url(forResource: "invalid_data", withExtension: "json") }
  457. private var plistEmptyDataFileURL: URL { return url(forResource: "empty", withExtension: "data") }
  458. private var plistValidDataFileURL: URL { return url(forResource: "valid", withExtension: "data") }
  459. private var plistInvalidDataFileURL: URL { return url(forResource: "invalid", withExtension: "data") }
  460. private var stringEmptyDataFileURL: URL { return url(forResource: "empty_string", withExtension: "txt") }
  461. private var stringUTF8DataFileURL: URL { return url(forResource: "utf8_string", withExtension: "txt") }
  462. private var stringUTF32DataFileURL: URL { return url(forResource: "utf32_string", withExtension: "txt") }
  463. private var invalidFileURL: URL { return URL(fileURLWithPath: "/this/file/does/not/exist.txt") }
  464. // MARK: Tests - Data Response Serializer
  465. func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() {
  466. // Given
  467. let serializer = DataResponseSerializer()
  468. // When
  469. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  470. // Then
  471. XCTAssertTrue(result.isSuccess)
  472. XCTAssertNotNil(result.value)
  473. XCTAssertNil(result.error)
  474. }
  475. func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() {
  476. // Given
  477. let serializer = DataResponseSerializer()
  478. // When
  479. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  480. // Then
  481. XCTAssertTrue(result.isFailure)
  482. XCTAssertNil(result.value)
  483. XCTAssertNotNil(result.error)
  484. if let error = result.error?.asAFError {
  485. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  486. } else {
  487. XCTFail("error should not be nil")
  488. }
  489. }
  490. func testThatDataResponseSerializerFailsWhenFileURLIsNil() {
  491. // Given
  492. let serializer = DataResponseSerializer()
  493. // When
  494. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  495. // Then
  496. XCTAssertTrue(result.isFailure)
  497. XCTAssertNil(result.value)
  498. XCTAssertNotNil(result.error)
  499. if let error = result.error?.asAFError {
  500. XCTAssertTrue(error.isInputFileNil)
  501. } else {
  502. XCTFail("error should not be nil")
  503. }
  504. }
  505. func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() {
  506. // Given
  507. let serializer = DataResponseSerializer()
  508. // When
  509. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  510. // Then
  511. XCTAssertTrue(result.isFailure)
  512. XCTAssertNil(result.value)
  513. XCTAssertNotNil(result.error)
  514. if let error = result.error?.asAFError {
  515. XCTAssertTrue(error.isInputFileReadFailed)
  516. } else {
  517. XCTFail("error should not be nil")
  518. }
  519. }
  520. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  521. // Given
  522. let serializer = DataResponseSerializer()
  523. // When
  524. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  525. // Then
  526. XCTAssertTrue(result.isFailure)
  527. XCTAssertNil(result.value)
  528. XCTAssertNotNil(result.error)
  529. if let error = result.error?.asAFError {
  530. XCTAssertTrue(error.isInputFileNil)
  531. } else {
  532. XCTFail("error should not be nil")
  533. }
  534. }
  535. func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() {
  536. // Given
  537. let serializer = DataResponseSerializer()
  538. let response = HTTPURLResponse(statusCode: 200)
  539. // When
  540. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  541. // Then
  542. XCTAssertTrue(result.isFailure)
  543. XCTAssertNil(result.value)
  544. XCTAssertNotNil(result.error)
  545. if let error = result.error?.asAFError {
  546. XCTAssertTrue(error.isInputFileNil)
  547. } else {
  548. XCTFail("error should not be nil")
  549. }
  550. }
  551. func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  552. // Given
  553. let serializer = DataResponseSerializer()
  554. let response = HTTPURLResponse(statusCode: 205)
  555. // When
  556. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  557. // Then
  558. XCTAssertTrue(result.isSuccess)
  559. XCTAssertNotNil(result.value)
  560. XCTAssertNil(result.error)
  561. if let data = result.value {
  562. XCTAssertEqual(data.count, 0)
  563. } else {
  564. XCTFail("data should not be nil")
  565. }
  566. }
  567. // MARK: Tests - String Response Serializer
  568. func testThatStringResponseSerializerFailsWhenFileURLIsNil() {
  569. // Given
  570. let serializer = StringResponseSerializer()
  571. // When
  572. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  573. // Then
  574. XCTAssertTrue(result.isFailure)
  575. XCTAssertNil(result.value)
  576. XCTAssertNotNil(result.error)
  577. if let error = result.error?.asAFError {
  578. XCTAssertTrue(error.isInputFileNil)
  579. } else {
  580. XCTFail("error should not be nil")
  581. }
  582. }
  583. func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() {
  584. // Given
  585. let serializer = StringResponseSerializer()
  586. // When
  587. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  588. // Then
  589. XCTAssertEqual(result.isSuccess, false)
  590. XCTAssertNil(result.value)
  591. XCTAssertNotNil(result.error)
  592. if let error = result.error?.asAFError {
  593. XCTAssertTrue(error.isInputFileReadFailed)
  594. } else {
  595. XCTFail("error should not be nil")
  596. }
  597. }
  598. func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() {
  599. // Given
  600. let serializer = StringResponseSerializer()
  601. // When
  602. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) }
  603. // Then
  604. XCTAssertTrue(result.isFailure)
  605. XCTAssertNil(result.value)
  606. XCTAssertNotNil(result.error)
  607. if let error = result.error?.asAFError {
  608. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  609. } else {
  610. XCTFail("error should not be nil")
  611. }
  612. }
  613. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  614. // Given
  615. let serializer = StringResponseSerializer()
  616. // When
  617. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  618. // Then
  619. XCTAssertTrue(result.isSuccess)
  620. XCTAssertNotNil(result.value)
  621. XCTAssertNil(result.error)
  622. }
  623. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  624. // Given
  625. let serializer = StringResponseSerializer(encoding: .utf8)
  626. // When
  627. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) }
  628. // Then
  629. XCTAssertTrue(result.isSuccess)
  630. XCTAssertNotNil(result.value)
  631. XCTAssertNil(result.error)
  632. }
  633. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  634. // Given
  635. let serializer = StringResponseSerializer()
  636. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  637. // When
  638. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) }
  639. // Then
  640. XCTAssertTrue(result.isSuccess)
  641. XCTAssertNotNil(result.value)
  642. XCTAssertNil(result.error)
  643. }
  644. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  645. // Given
  646. let serializer = StringResponseSerializer(encoding: .utf8)
  647. // When
  648. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) }
  649. // Then
  650. XCTAssertTrue(result.isFailure)
  651. XCTAssertNil(result.value)
  652. XCTAssertNotNil(result.error)
  653. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  654. XCTAssertTrue(error.isStringSerializationFailed)
  655. XCTAssertEqual(failedEncoding, .utf8)
  656. } else {
  657. XCTFail("error should not be nil")
  658. }
  659. }
  660. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  661. // Given
  662. let serializer = StringResponseSerializer()
  663. let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"])
  664. // When
  665. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) }
  666. // Then
  667. XCTAssertTrue(result.isFailure)
  668. XCTAssertNil(result.value)
  669. XCTAssertNotNil(result.error)
  670. if let error = result.error?.asAFError, let failedEncoding = error.failedStringEncoding {
  671. XCTAssertTrue(error.isStringSerializationFailed)
  672. XCTAssertEqual(failedEncoding, .utf8)
  673. } else {
  674. XCTFail("error should not be nil")
  675. }
  676. }
  677. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  678. // Given
  679. let serializer = StringResponseSerializer()
  680. // When
  681. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  682. // Then
  683. XCTAssertTrue(result.isFailure)
  684. XCTAssertNil(result.value)
  685. XCTAssertNotNil(result.error)
  686. if let error = result.error?.asAFError {
  687. XCTAssertTrue(error.isInputFileNil)
  688. } else {
  689. XCTFail("error should not be nil")
  690. }
  691. }
  692. func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  693. // Given
  694. let serializer = StringResponseSerializer()
  695. let response = HTTPURLResponse(statusCode: 200)
  696. // When
  697. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  698. // Then
  699. XCTAssertTrue(result.isFailure)
  700. XCTAssertNil(result.value)
  701. XCTAssertNotNil(result.error)
  702. if let error = result.error?.asAFError {
  703. XCTAssertTrue(error.isInputFileNil)
  704. } else {
  705. XCTFail("error should not be nil")
  706. }
  707. }
  708. func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  709. // Given
  710. let serializer = StringResponseSerializer()
  711. let response = HTTPURLResponse(statusCode: 204)
  712. // When
  713. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) }
  714. // Then
  715. XCTAssertTrue(result.isSuccess)
  716. XCTAssertNotNil(result.value)
  717. XCTAssertNil(result.error)
  718. if let string = result.value {
  719. XCTAssertEqual(string, "")
  720. }
  721. }
  722. // MARK: Tests - JSON Response Serializer
  723. func testThatJSONResponseSerializerFailsWhenFileURLIsNil() {
  724. // Given
  725. let serializer = JSONResponseSerializer()
  726. // When
  727. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) }
  728. // Then
  729. XCTAssertTrue(result.isFailure)
  730. XCTAssertNil(result.value)
  731. XCTAssertNotNil(result.error)
  732. if let error = result.error?.asAFError {
  733. XCTAssertTrue(error.isInputFileNil)
  734. } else {
  735. XCTFail("error should not be nil")
  736. }
  737. }
  738. func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() {
  739. // Given
  740. let serializer = JSONResponseSerializer()
  741. // When
  742. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) }
  743. // Then
  744. XCTAssertTrue(result.isFailure)
  745. XCTAssertNil(result.value)
  746. XCTAssertNotNil(result.error)
  747. if let error = result.error?.asAFError {
  748. XCTAssertTrue(error.isInputFileReadFailed)
  749. } else {
  750. XCTFail("error should not be nil")
  751. }
  752. }
  753. func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() {
  754. // Given
  755. let serializer = JSONResponseSerializer()
  756. // When
  757. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) }
  758. // Then
  759. XCTAssertTrue(result.isFailure)
  760. XCTAssertNil(result.value)
  761. XCTAssertNotNil(result.error)
  762. if let error = result.error?.asAFError {
  763. XCTAssertTrue(error.isInputDataNilOrZeroLength)
  764. } else {
  765. XCTFail("error should not be nil")
  766. }
  767. }
  768. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  769. // Given
  770. let serializer = JSONResponseSerializer()
  771. // When
  772. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) }
  773. // Then
  774. XCTAssertTrue(result.isSuccess)
  775. XCTAssertNotNil(result.value)
  776. XCTAssertNil(result.error)
  777. }
  778. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  779. // Given
  780. let serializer = JSONResponseSerializer()
  781. // When
  782. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) }
  783. // Then
  784. XCTAssertTrue(result.isFailure)
  785. XCTAssertNil(result.value)
  786. XCTAssertNotNil(result.error)
  787. if let error = result.error?.asAFError, let underlyingError = error.underlyingError as? CocoaError {
  788. XCTAssertTrue(error.isJSONSerializationFailed)
  789. XCTAssertEqual(underlyingError.errorCode, 3840)
  790. } else {
  791. XCTFail("error should not be nil")
  792. }
  793. }
  794. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  795. // Given
  796. let serializer = JSONResponseSerializer()
  797. // When
  798. let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) }
  799. // Then
  800. XCTAssertTrue(result.isFailure)
  801. XCTAssertNil(result.value)
  802. XCTAssertNotNil(result.error)
  803. if let error = result.error?.asAFError {
  804. XCTAssertTrue(error.isInputFileNil)
  805. } else {
  806. XCTFail("error should not be nil")
  807. }
  808. }
  809. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() {
  810. // Given
  811. let serializer = JSONResponseSerializer()
  812. let response = HTTPURLResponse(statusCode: 200)
  813. // When
  814. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) }
  815. // Then
  816. XCTAssertTrue(result.isFailure)
  817. XCTAssertNil(result.value)
  818. XCTAssertNotNil(result.error)
  819. if let error = result.error?.asAFError {
  820. XCTAssertTrue(error.isInputFileNil)
  821. } else {
  822. XCTFail("error should not be nil")
  823. }
  824. }
  825. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() {
  826. // Given
  827. let serializer = JSONResponseSerializer()
  828. let response = HTTPURLResponse(statusCode: 205)
  829. // When
  830. let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) }
  831. // Then
  832. XCTAssertTrue(result.isSuccess)
  833. XCTAssertNotNil(result.value)
  834. XCTAssertNil(result.error)
  835. if let json = result.value as? NSNull {
  836. XCTAssertEqual(json, NSNull())
  837. }
  838. }
  839. }
  840. extension HTTPURLResponse {
  841. convenience init(statusCode: Int, headers: HTTPHeaders? = nil) {
  842. let url = URL(string: "https://httpbin.org/get")!
  843. self.init(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers?.dictionary)!
  844. }
  845. }