ResponseSerializationTests.swift 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. //
  2. // ResponseSerializationTests.swift
  3. //
  4. // Copyright (c) 2014-2016 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 ResponseSerializationTestCase: BaseTestCase {
  28. // MARK: - Properties
  29. let error = NSError(domain: ErrorDomain, code: -10000, userInfo: nil)
  30. // MARK: - Tests - Data Response Serializer
  31. func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
  32. // Given
  33. let serializer = Request.dataResponseSerializer()
  34. let data = "data".data(using: String.Encoding.utf8)!
  35. // When
  36. let result = serializer.serializeResponse(nil, nil, data, nil)
  37. // Then
  38. XCTAssertTrue(result.isSuccess, "result is success should be true")
  39. XCTAssertNotNil(result.value, "result value should not be nil")
  40. XCTAssertNil(result.error, "result error should be nil")
  41. }
  42. func testThatDataResponseSerializerFailsWhenDataIsNil() {
  43. // Given
  44. let serializer = Request.dataResponseSerializer()
  45. // When
  46. let result = serializer.serializeResponse(nil, nil, nil, nil)
  47. // Then
  48. XCTAssertTrue(result.isFailure, "result is failure should be true")
  49. XCTAssertNil(result.value, "result value should be nil")
  50. XCTAssertNotNil(result.error, "result error should not be nil")
  51. if let error = result.error {
  52. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  53. XCTAssertEqual(error.code, ErrorCode.dataSerializationFailed.rawValue, "error code should match expected value")
  54. } else {
  55. XCTFail("error should not be nil")
  56. }
  57. }
  58. func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
  59. // Given
  60. let serializer = Request.dataResponseSerializer()
  61. // When
  62. let result = serializer.serializeResponse(nil, nil, nil, error)
  63. // Then
  64. XCTAssertTrue(result.isFailure, "result is failure should be true")
  65. XCTAssertNil(result.value, "result value should be nil")
  66. XCTAssertNotNil(result.error, "result error should not be nil")
  67. if let error = result.error {
  68. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  69. XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
  70. } else {
  71. XCTFail("error should not be nil")
  72. }
  73. }
  74. func testThatDataResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
  75. // Given
  76. let serializer = Request.dataResponseSerializer()
  77. let url = URL(string: "https://httpbin.org/get")!
  78. let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: nil)
  79. // When
  80. let result = serializer.serializeResponse(nil, response, nil, nil)
  81. // Then
  82. XCTAssertTrue(result.isFailure, "result is failure should be true")
  83. XCTAssertNil(result.value, "result value should be nil")
  84. XCTAssertNotNil(result.error, "result error should not be nil")
  85. if let error = result.error {
  86. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  87. XCTAssertEqual(error.code, ErrorCode.dataSerializationFailed.rawValue, "error code should match expected value")
  88. } else {
  89. XCTFail("error should not be nil")
  90. }
  91. }
  92. func testThatDataResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
  93. // Given
  94. let serializer = Request.dataResponseSerializer()
  95. let url = URL(string: "https://httpbin.org/get")!
  96. let response = HTTPURLResponse(url: url, statusCode: 204, httpVersion: "HTTP/1.1", headerFields: nil)
  97. // When
  98. let result = serializer.serializeResponse(nil, response, nil, nil)
  99. // Then
  100. XCTAssertTrue(result.isSuccess, "result is success should be true")
  101. XCTAssertNotNil(result.value, "result value should not be nil")
  102. XCTAssertNil(result.error, "result error should be nil")
  103. if let data = result.value {
  104. XCTAssertEqual(data.count, 0, "data length should be zero")
  105. }
  106. }
  107. // MARK: - Tests - String Response Serializer
  108. func testThatStringResponseSerializerFailsWhenDataIsNil() {
  109. // Given
  110. let serializer = Request.stringResponseSerializer()
  111. // When
  112. let result = serializer.serializeResponse(nil, nil, nil, nil)
  113. // Then
  114. XCTAssertTrue(result.isFailure, "result is failure should be true")
  115. XCTAssertNil(result.value, "result value should be nil")
  116. XCTAssertNotNil(result.error, "result error should not be nil")
  117. if let error = result.error {
  118. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  119. XCTAssertEqual(error.code, ErrorCode.stringSerializationFailed.rawValue, "error code should match expected value")
  120. } else {
  121. XCTFail("error should not be nil")
  122. }
  123. }
  124. func testThatStringResponseSerializerSucceedsWhenDataIsEmpty() {
  125. // Given
  126. let serializer = Request.stringResponseSerializer()
  127. // When
  128. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  129. // Then
  130. XCTAssertTrue(result.isSuccess, "result is success should be true")
  131. XCTAssertNotNil(result.value, "result value should not be nil")
  132. XCTAssertNil(result.error, "result error should be nil")
  133. }
  134. func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
  135. let serializer = Request.stringResponseSerializer()
  136. let data = "data".data(using: String.Encoding.utf8)!
  137. // When
  138. let result = serializer.serializeResponse(nil, nil, data, nil)
  139. // Then
  140. XCTAssertTrue(result.isSuccess, "result is success should be true")
  141. XCTAssertNotNil(result.value, "result value should not be nil")
  142. XCTAssertNil(result.error, "result error should be nil")
  143. }
  144. func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
  145. let serializer = Request.stringResponseSerializer(encoding: String.Encoding.utf8)
  146. let data = "data".data(using: String.Encoding.utf8)!
  147. // When
  148. let result = serializer.serializeResponse(nil, nil, data, nil)
  149. // Then
  150. XCTAssertTrue(result.isSuccess, "result is success should be true")
  151. XCTAssertNotNil(result.value, "result value should not be nil")
  152. XCTAssertNil(result.error, "result error should be nil")
  153. }
  154. func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
  155. let serializer = Request.stringResponseSerializer()
  156. let data = "data".data(using: String.Encoding.utf8)!
  157. let response = HTTPURLResponse(
  158. url: URL(string: "https://httpbin.org/get")!,
  159. statusCode: 200,
  160. httpVersion: "HTTP/1.1",
  161. headerFields: ["Content-Type": "image/jpeg; charset=utf-8"]
  162. )
  163. // When
  164. let result = serializer.serializeResponse(nil, response, data, nil)
  165. // Then
  166. XCTAssertTrue(result.isSuccess, "result is success should be true")
  167. XCTAssertNotNil(result.value, "result value should not be nil")
  168. XCTAssertNil(result.error, "result error should be nil")
  169. }
  170. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
  171. // Given
  172. let serializer = Request.stringResponseSerializer(encoding: String.Encoding.utf8)
  173. let data = "random data".data(using: String.Encoding.utf32)!
  174. // When
  175. let result = serializer.serializeResponse(nil, nil, data, nil)
  176. // Then
  177. XCTAssertTrue(result.isFailure, "result is failure should be true")
  178. XCTAssertNil(result.value, "result value should be nil")
  179. XCTAssertNotNil(result.error, "result error should not be nil")
  180. if let error = result.error {
  181. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  182. XCTAssertEqual(error.code, ErrorCode.stringSerializationFailed.rawValue, "error code should match expected value")
  183. } else {
  184. XCTFail("error should not be nil")
  185. }
  186. }
  187. func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
  188. // Given
  189. let serializer = Request.stringResponseSerializer()
  190. let data = "random data".data(using: String.Encoding.utf32)!
  191. let response = HTTPURLResponse(
  192. url: URL(string: "https://httpbin.org/get")!,
  193. statusCode: 200,
  194. httpVersion: "HTTP/1.1",
  195. headerFields: ["Content-Type": "image/jpeg; charset=utf-8"]
  196. )
  197. // When
  198. let result = serializer.serializeResponse(nil, response, data, nil)
  199. // Then
  200. XCTAssertTrue(result.isFailure, "result is failure should be true")
  201. XCTAssertNil(result.value, "result value should be nil")
  202. XCTAssertNotNil(result.error, "result error should not be nil")
  203. if let error = result.error {
  204. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  205. XCTAssertEqual(error.code, ErrorCode.stringSerializationFailed.rawValue, "error code should match expected value")
  206. } else {
  207. XCTFail("error should not be nil")
  208. }
  209. }
  210. func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
  211. // Given
  212. let serializer = Request.stringResponseSerializer()
  213. // When
  214. let result = serializer.serializeResponse(nil, nil, nil, error)
  215. // Then
  216. XCTAssertTrue(result.isFailure, "result is failure should be true")
  217. XCTAssertNil(result.value, "result value should be nil")
  218. XCTAssertNotNil(result.error, "result error should not be nil")
  219. if let error = result.error {
  220. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  221. XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
  222. } else {
  223. XCTFail("error should not be nil")
  224. }
  225. }
  226. func testThatStringResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
  227. // Given
  228. let serializer = Request.stringResponseSerializer()
  229. let url = URL(string: "https://httpbin.org/get")!
  230. let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: nil)
  231. // When
  232. let result = serializer.serializeResponse(nil, response, nil, nil)
  233. // Then
  234. XCTAssertTrue(result.isFailure, "result is failure should be true")
  235. XCTAssertNil(result.value, "result value should be nil")
  236. XCTAssertNotNil(result.error, "result error should not be nil")
  237. if let error = result.error {
  238. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  239. XCTAssertEqual(error.code, ErrorCode.stringSerializationFailed.rawValue, "error code should match expected value")
  240. } else {
  241. XCTFail("error should not be nil")
  242. }
  243. }
  244. func testThatStringResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
  245. // Given
  246. let serializer = Request.stringResponseSerializer()
  247. let url = URL(string: "https://httpbin.org/get")!
  248. let response = HTTPURLResponse(url: url, statusCode: 204, httpVersion: "HTTP/1.1", headerFields: nil)
  249. // When
  250. let result = serializer.serializeResponse(nil, response, nil, nil)
  251. // Then
  252. XCTAssertTrue(result.isSuccess, "result is success should be true")
  253. XCTAssertNotNil(result.value, "result value should not be nil")
  254. XCTAssertNil(result.error, "result error should be nil")
  255. if let string = result.value {
  256. XCTAssertEqual(string, "", "string should be equal to empty string")
  257. }
  258. }
  259. // MARK: - Tests - JSON Response Serializer
  260. func testThatJSONResponseSerializerFailsWhenDataIsNil() {
  261. // Given
  262. let serializer = Request.JSONResponseSerializer()
  263. // When
  264. let result = serializer.serializeResponse(nil, nil, nil, nil)
  265. // Then
  266. XCTAssertTrue(result.isFailure, "result is failure should be true")
  267. XCTAssertNil(result.value, "result value should be nil")
  268. XCTAssertNotNil(result.error, "result error should not be nil")
  269. if let error = result.error {
  270. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  271. XCTAssertEqual(error.code, ErrorCode.jsonSerializationFailed.rawValue, "error code should match expected value")
  272. } else {
  273. XCTFail("error should not be nil")
  274. }
  275. }
  276. func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
  277. // Given
  278. let serializer = Request.JSONResponseSerializer()
  279. // When
  280. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  281. // Then
  282. XCTAssertTrue(result.isFailure, "result is failure should be true")
  283. XCTAssertNil(result.value, "result value should be nil")
  284. XCTAssertNotNil(result.error, "result error should not be nil")
  285. if let error = result.error {
  286. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  287. XCTAssertEqual(error.code, ErrorCode.jsonSerializationFailed.rawValue, "error code should match expected value")
  288. } else {
  289. XCTFail("error should not be nil")
  290. }
  291. }
  292. func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
  293. // Given
  294. let serializer = Request.JSONResponseSerializer()
  295. let data = "{\"json\": true}".data(using: String.Encoding.utf8)!
  296. // When
  297. let result = serializer.serializeResponse(nil, nil, data, nil)
  298. // Then
  299. XCTAssertTrue(result.isSuccess, "result is success should be true")
  300. XCTAssertNotNil(result.value, "result value should not be nil")
  301. XCTAssertNil(result.error, "result error should be nil")
  302. }
  303. func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
  304. // Given
  305. let serializer = Request.JSONResponseSerializer()
  306. let data = "definitely not valid json".data(using: String.Encoding.utf8)!
  307. // When
  308. let result = serializer.serializeResponse(nil, nil, data, nil)
  309. // Then
  310. XCTAssertTrue(result.isFailure, "result is failure should be true")
  311. XCTAssertNil(result.value, "result value should be nil")
  312. XCTAssertNotNil(result.error, "result error should not be nil")
  313. if let error = result.error {
  314. XCTAssertEqual(error.domain, NSCocoaErrorDomain, "error domain should match expected value")
  315. XCTAssertEqual(error.code, 3840, "error code should match expected value")
  316. } else {
  317. XCTFail("error should not be nil")
  318. }
  319. }
  320. func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
  321. // Given
  322. let serializer = Request.JSONResponseSerializer()
  323. // When
  324. let result = serializer.serializeResponse(nil, nil, nil, error)
  325. // Then
  326. XCTAssertTrue(result.isFailure, "result is failure should be true")
  327. XCTAssertNil(result.value, "result value should be nil")
  328. XCTAssertNotNil(result.error, "result error should not be nil")
  329. if let error = result.error {
  330. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  331. XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
  332. } else {
  333. XCTFail("error should not be nil")
  334. }
  335. }
  336. func testThatJSONResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
  337. // Given
  338. let serializer = Request.JSONResponseSerializer()
  339. let url = URL(string: "https://httpbin.org/get")!
  340. let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: nil)
  341. // When
  342. let result = serializer.serializeResponse(nil, response, nil, nil)
  343. // Then
  344. XCTAssertTrue(result.isFailure, "result is failure should be true")
  345. XCTAssertNil(result.value, "result value should be nil")
  346. XCTAssertNotNil(result.error, "result error should not be nil")
  347. if let error = result.error {
  348. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  349. XCTAssertEqual(error.code, ErrorCode.jsonSerializationFailed.rawValue, "error code should match expected value")
  350. } else {
  351. XCTFail("error should not be nil")
  352. }
  353. }
  354. func testThatJSONResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
  355. // Given
  356. let serializer = Request.JSONResponseSerializer()
  357. let url = URL(string: "https://httpbin.org/get")!
  358. let response = HTTPURLResponse(url: url, statusCode: 204, httpVersion: "HTTP/1.1", headerFields: nil)
  359. // When
  360. let result = serializer.serializeResponse(nil, response, nil, nil)
  361. // Then
  362. XCTAssertTrue(result.isSuccess, "result is success should be true")
  363. XCTAssertNotNil(result.value, "result value should not be nil")
  364. XCTAssertNil(result.error, "result error should be nil")
  365. if let json = result.value as? NSNull {
  366. XCTAssertEqual(json, NSNull(), "json should be equal to NSNull")
  367. }
  368. }
  369. // MARK: - Tests - Property List Response Serializer
  370. func testThatPropertyListResponseSerializerFailsWhenDataIsNil() {
  371. // Given
  372. let serializer = Request.propertyListResponseSerializer()
  373. // When
  374. let result = serializer.serializeResponse(nil, nil, nil, nil)
  375. // Then
  376. XCTAssertTrue(result.isFailure, "result is failure should be true")
  377. XCTAssertNil(result.value, "result value should be nil")
  378. XCTAssertNotNil(result.error, "result error should not be nil")
  379. if let error = result.error {
  380. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  381. XCTAssertEqual(error.code, ErrorCode.propertyListSerializationFailed.rawValue, "error code should match expected value")
  382. } else {
  383. XCTFail("error should not be nil")
  384. }
  385. }
  386. func testThatPropertyListResponseSerializerFailsWhenDataIsEmpty() {
  387. // Given
  388. let serializer = Request.propertyListResponseSerializer()
  389. // When
  390. let result = serializer.serializeResponse(nil, nil, Data(), nil)
  391. // Then
  392. XCTAssertTrue(result.isFailure, "result is failure should be true")
  393. XCTAssertNil(result.value, "result value should be nil")
  394. XCTAssertNotNil(result.error, "result error should not be nil")
  395. if let error = result.error {
  396. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  397. XCTAssertEqual(error.code, ErrorCode.propertyListSerializationFailed.rawValue, "error code should match expected value")
  398. } else {
  399. XCTFail("error should not be nil")
  400. }
  401. }
  402. func testThatPropertyListResponseSerializerSucceedsWhenDataIsValidPropertyListData() {
  403. // Given
  404. let serializer = Request.propertyListResponseSerializer()
  405. let data = NSKeyedArchiver.archivedData(withRootObject: ["foo": "bar"])
  406. // When
  407. let result = serializer.serializeResponse(nil, nil, data, nil)
  408. // Then
  409. XCTAssertTrue(result.isSuccess, "result is success should be true")
  410. XCTAssertNotNil(result.value, "result value should not be nil")
  411. XCTAssertNil(result.error, "result error should be nil")
  412. }
  413. func testThatPropertyListResponseSerializerFailsWhenDataIsInvalidPropertyListData() {
  414. // Given
  415. let serializer = Request.propertyListResponseSerializer()
  416. let data = "definitely not valid plist data".data(using: String.Encoding.utf8)!
  417. // When
  418. let result = serializer.serializeResponse(nil, nil, data, nil)
  419. // Then
  420. XCTAssertTrue(result.isFailure, "result is failure should be true")
  421. XCTAssertNil(result.value, "result value should be nil")
  422. XCTAssertNotNil(result.error, "result error should not be nil")
  423. if let error = result.error {
  424. XCTAssertEqual(error.domain, NSCocoaErrorDomain, "error domain should match expected value")
  425. XCTAssertEqual(error.code, 3840, "error code should match expected value")
  426. } else {
  427. XCTFail("error should not be nil")
  428. }
  429. }
  430. func testThatPropertyListResponseSerializerFailsWhenErrorIsNotNil() {
  431. // Given
  432. let serializer = Request.propertyListResponseSerializer()
  433. // When
  434. let result = serializer.serializeResponse(nil, nil, nil, error)
  435. // Then
  436. XCTAssertTrue(result.isFailure, "result is failure should be true")
  437. XCTAssertNil(result.value, "result value should be nil")
  438. XCTAssertNotNil(result.error, "result error should not be nil")
  439. if let error = result.error {
  440. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  441. XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
  442. } else {
  443. XCTFail("error should not be nil")
  444. }
  445. }
  446. func testThatPropertyListResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
  447. // Given
  448. let serializer = Request.propertyListResponseSerializer()
  449. let url = URL(string: "https://httpbin.org/get")!
  450. let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: nil)
  451. // When
  452. let result = serializer.serializeResponse(nil, response, nil, nil)
  453. // Then
  454. XCTAssertTrue(result.isFailure, "result is failure should be true")
  455. XCTAssertNil(result.value, "result value should be nil")
  456. XCTAssertNotNil(result.error, "result error should not be nil")
  457. if let error = result.error {
  458. XCTAssertEqual(error.domain, ErrorDomain, "error domain should match expected value")
  459. XCTAssertEqual(error.code, ErrorCode.propertyListSerializationFailed.rawValue, "error code should match expected value")
  460. } else {
  461. XCTFail("error should not be nil")
  462. }
  463. }
  464. func testThatPropertyListResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
  465. // Given
  466. let serializer = Request.propertyListResponseSerializer()
  467. let url = URL(string: "https://httpbin.org/get")!
  468. let response = HTTPURLResponse(url: url, statusCode: 204, httpVersion: "HTTP/1.1", headerFields: nil)
  469. // When
  470. let result = serializer.serializeResponse(nil, response, nil, nil)
  471. // Then
  472. XCTAssertTrue(result.isSuccess, "result is success should be true")
  473. XCTAssertNotNil(result.value, "result value should not be nil")
  474. XCTAssertNil(result.error, "result error should be nil")
  475. if let plist = result.value as? NSNull {
  476. XCTAssertEqual(plist, NSNull(), "plist should be equal to NSNull")
  477. }
  478. }
  479. }