ParameterEncodingTests.swift 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. //
  2. // ParameterEncodingTests.swift
  3. //
  4. // Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import Foundation
  26. import XCTest
  27. class ParameterEncodingTestCase: BaseTestCase {
  28. let urlRequest = Endpoint().urlRequest
  29. }
  30. // MARK: -
  31. final class URLParameterEncodingTestCase: ParameterEncodingTestCase {
  32. // MARK: Properties
  33. let encoding = URLEncoding.default
  34. // MARK: Tests - Parameter Types
  35. func testURLParameterEncodeNilParameters() throws {
  36. // Given, When
  37. let urlRequest = try encoding.encode(urlRequest, with: nil)
  38. // Then
  39. XCTAssertNil(urlRequest.url?.query)
  40. }
  41. func testURLParameterEncodeEmptyDictionaryParameter() throws {
  42. // Given
  43. let parameters: [String: Any] = [:]
  44. // When
  45. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  46. // Then
  47. XCTAssertNil(urlRequest.url?.query)
  48. }
  49. func testURLParameterEncodeOneStringKeyStringValueParameter() throws {
  50. // Given
  51. let parameters = ["foo": "bar"]
  52. // When
  53. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  54. // Then
  55. XCTAssertEqual(urlRequest.url?.query, "foo=bar")
  56. }
  57. func testURLParameterEncodeOneStringKeyStringValueParameterAppendedToQuery() throws {
  58. // Given
  59. var mutableURLRequest = urlRequest
  60. var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false)!
  61. urlComponents.query = "baz=qux"
  62. mutableURLRequest.url = urlComponents.url
  63. let parameters = ["foo": "bar"]
  64. // When
  65. let urlRequest = try encoding.encode(mutableURLRequest, with: parameters)
  66. // Then
  67. XCTAssertEqual(urlRequest.url?.query, "baz=qux&foo=bar")
  68. }
  69. func testURLParameterEncodeTwoStringKeyStringValueParameters() throws {
  70. // Given
  71. let parameters = ["foo": "bar", "baz": "qux"]
  72. // When
  73. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  74. // Then
  75. XCTAssertEqual(urlRequest.url?.query, "baz=qux&foo=bar")
  76. }
  77. func testURLParameterEncodeStringKeyNSNumberIntegerValueParameter() throws {
  78. // Given
  79. let parameters = ["foo": NSNumber(value: 25)]
  80. // When
  81. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  82. // Then
  83. XCTAssertEqual(urlRequest.url?.query, "foo=25")
  84. }
  85. func testURLParameterEncodeStringKeyNSNumberBoolValueParameter() throws {
  86. // Given
  87. let parameters = ["foo": NSNumber(value: false)]
  88. // When
  89. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  90. // Then
  91. XCTAssertEqual(urlRequest.url?.query, "foo=0")
  92. }
  93. func testURLParameterEncodeStringKeyIntegerValueParameter() throws {
  94. // Given
  95. let parameters = ["foo": 1]
  96. // When
  97. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  98. // Then
  99. XCTAssertEqual(urlRequest.url?.query, "foo=1")
  100. }
  101. func testURLParameterEncodeStringKeyDoubleValueParameter() throws {
  102. // Given
  103. let parameters = ["foo": 1.1]
  104. // When
  105. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  106. // Then
  107. XCTAssertEqual(urlRequest.url?.query, "foo=1.1")
  108. }
  109. func testURLParameterEncodeStringKeyBoolValueParameter() throws {
  110. // Given
  111. let parameters = ["foo": true]
  112. // When
  113. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  114. // Then
  115. XCTAssertEqual(urlRequest.url?.query, "foo=1")
  116. }
  117. func testURLParameterEncodeStringKeyArrayValueParameter() throws {
  118. // Given
  119. let parameters = ["foo": ["a", 1, true]]
  120. // When
  121. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  122. // Then
  123. XCTAssertEqual(urlRequest.url?.query, "foo%5B%5D=a&foo%5B%5D=1&foo%5B%5D=1")
  124. }
  125. func testURLParameterEncodeArrayNestedDictionaryValueParameterWithIndex() throws {
  126. // Given
  127. let encoding = URLEncoding(arrayEncoding: .indexInBrackets)
  128. let parameters = ["foo": ["a", 1, true, ["bar": 2], ["qux": 3], ["quy": ["quz": 3]]]]
  129. // When
  130. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  131. // Then
  132. XCTAssertEqual(urlRequest.url?.query, "foo%5B0%5D=a&foo%5B1%5D=1&foo%5B2%5D=1&foo%5B3%5D%5Bbar%5D=2&foo%5B4%5D%5Bqux%5D=3&foo%5B5%5D%5Bquy%5D%5Bquz%5D=3")
  133. }
  134. func testURLParameterEncodeStringKeyArrayValueParameterWithoutBrackets() throws {
  135. // Given
  136. let encoding = URLEncoding(arrayEncoding: .noBrackets)
  137. let parameters = ["foo": ["a", 1, true]]
  138. // When
  139. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  140. // Then
  141. XCTAssertEqual(urlRequest.url?.query, "foo=a&foo=1&foo=1")
  142. }
  143. func testURLParameterEncodeStringKeyArrayValueParameterWithCustomClosure() throws {
  144. // Given
  145. let encoding = URLEncoding(arrayEncoding: .custom { key, index in
  146. "\(key).\(index + 1)"
  147. })
  148. let parameters = ["foo": ["a", 1, true]]
  149. // When
  150. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  151. // Then
  152. XCTAssertEqual(urlRequest.url?.query, "foo.1=a&foo.2=1&foo.3=1")
  153. }
  154. func testURLParameterEncodeStringKeyDictionaryValueParameter() throws {
  155. // Given
  156. let parameters = ["foo": ["bar": 1]]
  157. // When
  158. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  159. // Then
  160. XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D=1")
  161. }
  162. func testURLParameterEncodeStringKeyNestedDictionaryValueParameter() throws {
  163. // Given
  164. let parameters = ["foo": ["bar": ["baz": 1]]]
  165. // When
  166. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  167. // Then
  168. XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D%5Bbaz%5D=1")
  169. }
  170. func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameter() throws {
  171. // Given
  172. let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]]
  173. // When
  174. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  175. // Then
  176. let expectedQuery = "foo%5Bbar%5D%5Bbaz%5D%5B%5D=a&foo%5Bbar%5D%5Bbaz%5D%5B%5D=1&foo%5Bbar%5D%5Bbaz%5D%5B%5D=1"
  177. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  178. }
  179. func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameterWithoutBrackets() throws {
  180. // Given
  181. let encoding = URLEncoding(arrayEncoding: .noBrackets)
  182. let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]]
  183. // When
  184. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  185. // Then
  186. let expectedQuery = "foo%5Bbar%5D%5Bbaz%5D=a&foo%5Bbar%5D%5Bbaz%5D=1&foo%5Bbar%5D%5Bbaz%5D=1"
  187. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  188. }
  189. func testURLParameterLiteralBoolEncodingWorksAndDoesNotAffectNumbers() throws {
  190. // Given
  191. let encoding = URLEncoding(boolEncoding: .literal)
  192. let parameters: [String: Any] = [ // Must still encode to numbers
  193. "a": 1,
  194. "b": 0,
  195. "c": 1.0,
  196. "d": 0.0,
  197. "e": NSNumber(value: 1),
  198. "f": NSNumber(value: 0),
  199. "g": NSNumber(value: 1.0),
  200. "h": NSNumber(value: 0.0),
  201. // Must encode to literals
  202. "i": true,
  203. "j": false,
  204. "k": NSNumber(value: true),
  205. "l": NSNumber(value: false)
  206. ]
  207. // When
  208. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  209. // Then
  210. XCTAssertEqual(urlRequest.url?.query, "a=1&b=0&c=1&d=0&e=1&f=0&g=1&h=0&i=true&j=false&k=true&l=false")
  211. }
  212. // MARK: Tests - All Reserved / Unreserved / Illegal Characters According to RFC 3986
  213. func testThatReservedCharactersArePercentEscapedMinusQuestionMarkAndForwardSlash() throws {
  214. // Given
  215. let generalDelimiters = ":#[]@"
  216. let subDelimiters = "!$&'()*+,;="
  217. let parameters = ["reserved": "\(generalDelimiters)\(subDelimiters)"]
  218. // When
  219. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  220. // Then
  221. let expectedQuery = "reserved=%3A%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"
  222. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  223. }
  224. func testThatReservedCharactersQuestionMarkAndForwardSlashAreNotPercentEscaped() throws {
  225. // Given
  226. let parameters = ["reserved": "?/"]
  227. // When
  228. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  229. // Then
  230. XCTAssertEqual(urlRequest.url?.query, "reserved=?/")
  231. }
  232. func testThatUnreservedNumericCharactersAreNotPercentEscaped() throws {
  233. // Given
  234. let parameters = ["numbers": "0123456789"]
  235. // When
  236. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  237. // Then
  238. XCTAssertEqual(urlRequest.url?.query, "numbers=0123456789")
  239. }
  240. func testThatUnreservedLowercaseCharactersAreNotPercentEscaped() throws {
  241. // Given
  242. let parameters = ["lowercase": "abcdefghijklmnopqrstuvwxyz"]
  243. // When
  244. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  245. // Then
  246. XCTAssertEqual(urlRequest.url?.query, "lowercase=abcdefghijklmnopqrstuvwxyz")
  247. }
  248. func testThatUnreservedUppercaseCharactersAreNotPercentEscaped() throws {
  249. // Given
  250. let parameters = ["uppercase": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  251. // When
  252. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  253. // Then
  254. XCTAssertEqual(urlRequest.url?.query, "uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  255. }
  256. func testThatIllegalASCIICharactersArePercentEscaped() throws {
  257. // Given
  258. let parameters = ["illegal": " \"#%<>[]\\^`{}|"]
  259. // When
  260. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  261. // Then
  262. let expectedQuery = "illegal=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7C"
  263. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  264. }
  265. // MARK: Tests - Special Character Queries
  266. func testURLParameterEncodeStringWithAmpersandKeyStringWithAmpersandValueParameter() throws {
  267. // Given
  268. let parameters = ["foo&bar": "baz&qux", "foobar": "bazqux"]
  269. // When
  270. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  271. // Then
  272. XCTAssertEqual(urlRequest.url?.query, "foo%26bar=baz%26qux&foobar=bazqux")
  273. }
  274. func testURLParameterEncodeStringWithQuestionMarkKeyStringWithQuestionMarkValueParameter() throws {
  275. // Given
  276. let parameters = ["?foo?": "?bar?"]
  277. // When
  278. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  279. // Then
  280. XCTAssertEqual(urlRequest.url?.query, "?foo?=?bar?")
  281. }
  282. func testURLParameterEncodeStringWithSlashKeyStringWithQuestionMarkValueParameter() throws {
  283. // Given
  284. let parameters = ["foo": "/bar/baz/qux"]
  285. // When
  286. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  287. // Then
  288. XCTAssertEqual(urlRequest.url?.query, "foo=/bar/baz/qux")
  289. }
  290. func testURLParameterEncodeStringWithSpaceKeyStringWithSpaceValueParameter() throws {
  291. // Given
  292. let parameters = [" foo ": " bar "]
  293. // When
  294. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  295. // Then
  296. XCTAssertEqual(urlRequest.url?.query, "%20foo%20=%20bar%20")
  297. }
  298. func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameter() throws {
  299. // Given
  300. let parameters = ["+foo+": "+bar+"]
  301. // When
  302. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  303. // Then
  304. XCTAssertEqual(urlRequest.url?.query, "%2Bfoo%2B=%2Bbar%2B")
  305. }
  306. func testURLParameterEncodeStringKeyPercentEncodedStringValueParameter() throws {
  307. // Given
  308. let parameters = ["percent": "%25"]
  309. // When
  310. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  311. // Then
  312. XCTAssertEqual(urlRequest.url?.query, "percent=%2525")
  313. }
  314. func testURLParameterEncodeStringKeyNonLatinStringValueParameter() throws {
  315. // Given
  316. let parameters = ["french": "français",
  317. "japanese": "日本語",
  318. "arabic": "العربية",
  319. "emoji": "😃"]
  320. // When
  321. let urlRequest = try encoding.encode(urlRequest, with: parameters)
  322. // Then
  323. let expectedParameterValues = ["arabic=%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9",
  324. "emoji=%F0%9F%98%83",
  325. "french=fran%C3%A7ais",
  326. "japanese=%E6%97%A5%E6%9C%AC%E8%AA%9E"]
  327. let expectedQuery = expectedParameterValues.joined(separator: "&")
  328. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  329. }
  330. func testURLParameterEncodeStringForRequestWithPrecomposedQuery() throws {
  331. // Given
  332. let url = URL(string: "https://example.com/movies?hd=[1]")!
  333. let parameters = ["page": "0"]
  334. // When
  335. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  336. // Then
  337. XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&page=0")
  338. }
  339. func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameterForRequestWithPrecomposedQuery() throws {
  340. // Given
  341. let url = URL(string: "https://example.com/movie?hd=[1]")!
  342. let parameters = ["+foo+": "+bar+"]
  343. // When
  344. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  345. // Then
  346. XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&%2Bfoo%2B=%2Bbar%2B")
  347. }
  348. func testURLParameterEncodeStringWithThousandsOfChineseCharacters() throws {
  349. // Given
  350. let repeatedCount = 2000
  351. let url = URL(string: "https://example.com/movies")!
  352. let parameters = ["chinese": String(repeating: "一二三四五六七八九十", count: repeatedCount)]
  353. // When
  354. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  355. // Then
  356. var expected = "chinese="
  357. for _ in 0..<repeatedCount {
  358. expected += "%E4%B8%80%E4%BA%8C%E4%B8%89%E5%9B%9B%E4%BA%94%E5%85%AD%E4%B8%83%E5%85%AB%E4%B9%9D%E5%8D%81"
  359. }
  360. XCTAssertEqual(urlRequest.url?.query, expected)
  361. }
  362. // MARK: Tests - Varying HTTP Methods
  363. func testThatURLParameterEncodingEncodesGETParametersInURL() throws {
  364. // Given
  365. var mutableURLRequest = urlRequest
  366. mutableURLRequest.httpMethod = HTTPMethod.get.rawValue
  367. let parameters = ["foo": 1, "bar": 2]
  368. // When
  369. let urlRequest = try encoding.encode(mutableURLRequest, with: parameters)
  370. // Then
  371. XCTAssertEqual(urlRequest.url?.query, "bar=2&foo=1")
  372. XCTAssertNil(urlRequest.value(forHTTPHeaderField: "Content-Type"), "Content-Type should be nil")
  373. XCTAssertNil(urlRequest.httpBody, "HTTPBody should be nil")
  374. }
  375. func testThatURLParameterEncodingEncodesPOSTParametersInHTTPBody() throws {
  376. // Given
  377. var mutableURLRequest = urlRequest
  378. mutableURLRequest.httpMethod = HTTPMethod.post.rawValue
  379. let parameters = ["foo": 1, "bar": 2]
  380. // When
  381. let urlRequest = try encoding.encode(mutableURLRequest, with: parameters)
  382. // Then
  383. XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "Content-Type"), "application/x-www-form-urlencoded; charset=utf-8")
  384. XCTAssertNotNil(urlRequest.httpBody, "HTTPBody should not be nil")
  385. XCTAssertEqual(urlRequest.httpBody?.asString, "bar=2&foo=1")
  386. }
  387. func testThatURLEncodedInURLParameterEncodingEncodesPOSTParametersInURL() throws {
  388. // Given
  389. var mutableURLRequest = urlRequest
  390. mutableURLRequest.httpMethod = HTTPMethod.post.rawValue
  391. let parameters = ["foo": 1, "bar": 2]
  392. // When
  393. let urlRequest = try URLEncoding.queryString.encode(mutableURLRequest, with: parameters)
  394. // Then
  395. XCTAssertEqual(urlRequest.url?.query, "bar=2&foo=1")
  396. XCTAssertNil(urlRequest.value(forHTTPHeaderField: "Content-Type"))
  397. XCTAssertNil(urlRequest.httpBody, "HTTPBody should be nil")
  398. }
  399. }
  400. // MARK: -
  401. final class JSONParameterEncodingTestCase: ParameterEncodingTestCase {
  402. // MARK: Properties
  403. let encoding = JSONEncoding.default
  404. // MARK: Tests
  405. func testJSONParameterEncodeNilParameters() throws {
  406. // Given, When
  407. let request = try encoding.encode(urlRequest, with: nil)
  408. // Then
  409. XCTAssertNil(request.url?.query, "query should be nil")
  410. XCTAssertNil(request.value(forHTTPHeaderField: "Content-Type"))
  411. XCTAssertNil(request.httpBody, "HTTPBody should be nil")
  412. }
  413. func testJSONParameterEncodeComplexParameters() throws {
  414. // Given
  415. let parameters: [String: Any] = ["foo": "bar",
  416. "baz": ["a", 1, true],
  417. "qux": ["a": 1,
  418. "b": [2, 2],
  419. "c": [3, 3, 3]]]
  420. // When
  421. let request = try encoding.encode(urlRequest, with: parameters)
  422. // Then
  423. XCTAssertNil(request.url?.query)
  424. XCTAssertNotNil(request.value(forHTTPHeaderField: "Content-Type"))
  425. XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json")
  426. XCTAssertNotNil(request.httpBody)
  427. XCTAssertEqual(try request.httpBody?.asJSONObject() as? NSObject,
  428. parameters as NSObject,
  429. "Decoded request body and parameters should be equal.")
  430. }
  431. func testJSONParameterEncodeArray() throws {
  432. // Given
  433. let array = ["foo", "bar", "baz"]
  434. // When
  435. let request = try encoding.encode(urlRequest, withJSONObject: array)
  436. // Then
  437. XCTAssertNil(request.url?.query)
  438. XCTAssertNotNil(request.value(forHTTPHeaderField: "Content-Type"))
  439. XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json")
  440. XCTAssertNotNil(request.httpBody)
  441. XCTAssertEqual(try request.httpBody?.asJSONObject() as? NSObject,
  442. array as NSObject,
  443. "Decoded request body and parameters should be equal.")
  444. }
  445. func testJSONParameterEncodeParametersRetainsCustomContentType() throws {
  446. // Given
  447. let request = Endpoint(headers: [.contentType("application/custom-json-type+json")]).urlRequest
  448. let parameters = ["foo": "bar"]
  449. // When
  450. let urlRequest = try encoding.encode(request, with: parameters)
  451. // Then
  452. XCTAssertNil(urlRequest.url?.query)
  453. XCTAssertEqual(urlRequest.headers["Content-Type"], "application/custom-json-type+json")
  454. }
  455. func testJSONParameterEncodeParametersThrowsErrorWithInvalidValue() {
  456. // Given
  457. struct Value {}
  458. let value = Value()
  459. // When
  460. let result = Result { try encoding.encode(urlRequest, with: ["key": value]) }
  461. // Then
  462. XCTAssertTrue(result.failure?.asAFError?.isJSONEncodingFailed == true)
  463. }
  464. func testJSONParameterEncodeObjectThrowsErrorWithInvalidValue() {
  465. // Given
  466. struct Value {}
  467. let value = Value()
  468. // When
  469. let result = Result { try encoding.encode(urlRequest, withJSONObject: value) }
  470. // Then
  471. XCTAssertTrue(result.failure?.asAFError?.isJSONEncodingFailed == true)
  472. }
  473. }