ParameterEncodingTests.swift 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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(self.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(self.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(self.urlRequest, with: parameters)
  54. // Then
  55. XCTAssertEqual(urlRequest.url?.query, "foo=bar")
  56. }
  57. func testURLParameterEncodeOneStringKeyStringValueParameterAppendedToQuery() throws {
  58. // Given
  59. var mutableURLRequest = self.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(self.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(self.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(self.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(self.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(self.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(self.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(self.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(self.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(self.urlRequest, with: parameters)
  140. // Then
  141. XCTAssertEqual(urlRequest.url?.query, "foo=a&foo=1&foo=1")
  142. }
  143. func testURLParameterEncodeStringKeyDictionaryValueParameter() throws {
  144. // Given
  145. let parameters = ["foo": ["bar": 1]]
  146. // When
  147. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  148. // Then
  149. XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D=1")
  150. }
  151. func testURLParameterEncodeStringKeyNestedDictionaryValueParameter() throws {
  152. // Given
  153. let parameters = ["foo": ["bar": ["baz": 1]]]
  154. // When
  155. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  156. // Then
  157. XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D%5Bbaz%5D=1")
  158. }
  159. func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameter() throws {
  160. // Given
  161. let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]]
  162. // When
  163. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  164. // Then
  165. 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"
  166. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  167. }
  168. func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameterWithoutBrackets() throws {
  169. // Given
  170. let encoding = URLEncoding(arrayEncoding: .noBrackets)
  171. let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]]
  172. // When
  173. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  174. // Then
  175. let expectedQuery = "foo%5Bbar%5D%5Bbaz%5D=a&foo%5Bbar%5D%5Bbaz%5D=1&foo%5Bbar%5D%5Bbaz%5D=1"
  176. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  177. }
  178. func testURLParameterLiteralBoolEncodingWorksAndDoesNotAffectNumbers() throws {
  179. // Given
  180. let encoding = URLEncoding(boolEncoding: .literal)
  181. let parameters: [String: Any] = [// Must still encode to numbers
  182. "a": 1,
  183. "b": 0,
  184. "c": 1.0,
  185. "d": 0.0,
  186. "e": NSNumber(value: 1),
  187. "f": NSNumber(value: 0),
  188. "g": NSNumber(value: 1.0),
  189. "h": NSNumber(value: 0.0),
  190. // Must encode to literals
  191. "i": true,
  192. "j": false,
  193. "k": NSNumber(value: true),
  194. "l": NSNumber(value: false)]
  195. // When
  196. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  197. // Then
  198. 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")
  199. }
  200. // MARK: Tests - All Reserved / Unreserved / Illegal Characters According to RFC 3986
  201. func testThatReservedCharactersArePercentEscapedMinusQuestionMarkAndForwardSlash() throws {
  202. // Given
  203. let generalDelimiters = ":#[]@"
  204. let subDelimiters = "!$&'()*+,;="
  205. let parameters = ["reserved": "\(generalDelimiters)\(subDelimiters)"]
  206. // When
  207. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  208. // Then
  209. let expectedQuery = "reserved=%3A%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"
  210. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  211. }
  212. func testThatReservedCharactersQuestionMarkAndForwardSlashAreNotPercentEscaped() throws {
  213. // Given
  214. let parameters = ["reserved": "?/"]
  215. // When
  216. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  217. // Then
  218. XCTAssertEqual(urlRequest.url?.query, "reserved=?/")
  219. }
  220. func testThatUnreservedNumericCharactersAreNotPercentEscaped() throws {
  221. // Given
  222. let parameters = ["numbers": "0123456789"]
  223. // When
  224. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  225. // Then
  226. XCTAssertEqual(urlRequest.url?.query, "numbers=0123456789")
  227. }
  228. func testThatUnreservedLowercaseCharactersAreNotPercentEscaped() throws {
  229. // Given
  230. let parameters = ["lowercase": "abcdefghijklmnopqrstuvwxyz"]
  231. // When
  232. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  233. // Then
  234. XCTAssertEqual(urlRequest.url?.query, "lowercase=abcdefghijklmnopqrstuvwxyz")
  235. }
  236. func testThatUnreservedUppercaseCharactersAreNotPercentEscaped() throws {
  237. // Given
  238. let parameters = ["uppercase": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  239. // When
  240. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  241. // Then
  242. XCTAssertEqual(urlRequest.url?.query, "uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  243. }
  244. func testThatIllegalASCIICharactersArePercentEscaped() throws {
  245. // Given
  246. let parameters = ["illegal": " \"#%<>[]\\^`{}|"]
  247. // When
  248. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  249. // Then
  250. let expectedQuery = "illegal=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7C"
  251. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  252. }
  253. // MARK: Tests - Special Character Queries
  254. func testURLParameterEncodeStringWithAmpersandKeyStringWithAmpersandValueParameter() throws {
  255. // Given
  256. let parameters = ["foo&bar": "baz&qux", "foobar": "bazqux"]
  257. // When
  258. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  259. // Then
  260. XCTAssertEqual(urlRequest.url?.query, "foo%26bar=baz%26qux&foobar=bazqux")
  261. }
  262. func testURLParameterEncodeStringWithQuestionMarkKeyStringWithQuestionMarkValueParameter() throws {
  263. // Given
  264. let parameters = ["?foo?": "?bar?"]
  265. // When
  266. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  267. // Then
  268. XCTAssertEqual(urlRequest.url?.query, "?foo?=?bar?")
  269. }
  270. func testURLParameterEncodeStringWithSlashKeyStringWithQuestionMarkValueParameter() throws {
  271. // Given
  272. let parameters = ["foo": "/bar/baz/qux"]
  273. // When
  274. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  275. // Then
  276. XCTAssertEqual(urlRequest.url?.query, "foo=/bar/baz/qux")
  277. }
  278. func testURLParameterEncodeStringWithSpaceKeyStringWithSpaceValueParameter() throws {
  279. // Given
  280. let parameters = [" foo ": " bar "]
  281. // When
  282. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  283. // Then
  284. XCTAssertEqual(urlRequest.url?.query, "%20foo%20=%20bar%20")
  285. }
  286. func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameter() throws {
  287. // Given
  288. let parameters = ["+foo+": "+bar+"]
  289. // When
  290. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  291. // Then
  292. XCTAssertEqual(urlRequest.url?.query, "%2Bfoo%2B=%2Bbar%2B")
  293. }
  294. func testURLParameterEncodeStringKeyPercentEncodedStringValueParameter() throws {
  295. // Given
  296. let parameters = ["percent": "%25"]
  297. // When
  298. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  299. // Then
  300. XCTAssertEqual(urlRequest.url?.query, "percent=%2525")
  301. }
  302. func testURLParameterEncodeStringKeyNonLatinStringValueParameter() throws {
  303. // Given
  304. let parameters = ["french": "français",
  305. "japanese": "日本語",
  306. "arabic": "العربية",
  307. "emoji": "😃"]
  308. // When
  309. let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
  310. // Then
  311. let expectedParameterValues = ["arabic=%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9",
  312. "emoji=%F0%9F%98%83",
  313. "french=fran%C3%A7ais",
  314. "japanese=%E6%97%A5%E6%9C%AC%E8%AA%9E"]
  315. let expectedQuery = expectedParameterValues.joined(separator: "&")
  316. XCTAssertEqual(urlRequest.url?.query, expectedQuery)
  317. }
  318. func testURLParameterEncodeStringForRequestWithPrecomposedQuery() throws {
  319. // Given
  320. let url = URL(string: "https://example.com/movies?hd=[1]")!
  321. let parameters = ["page": "0"]
  322. // When
  323. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  324. // Then
  325. XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&page=0")
  326. }
  327. func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameterForRequestWithPrecomposedQuery() throws {
  328. // Given
  329. let url = URL(string: "https://example.com/movie?hd=[1]")!
  330. let parameters = ["+foo+": "+bar+"]
  331. // When
  332. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  333. // Then
  334. XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&%2Bfoo%2B=%2Bbar%2B")
  335. }
  336. func testURLParameterEncodeStringWithThousandsOfChineseCharacters() throws {
  337. // Given
  338. let repeatedCount = 2000
  339. let url = URL(string: "https://example.com/movies")!
  340. let parameters = ["chinese": String(repeating: "一二三四五六七八九十", count: repeatedCount)]
  341. // When
  342. let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters)
  343. // Then
  344. var expected = "chinese="
  345. for _ in 0..<repeatedCount {
  346. 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"
  347. }
  348. XCTAssertEqual(urlRequest.url?.query, expected)
  349. }
  350. // MARK: Tests - Varying HTTP Methods
  351. func testThatURLParameterEncodingEncodesGETParametersInURL() throws {
  352. // Given
  353. var mutableURLRequest = self.urlRequest
  354. mutableURLRequest.httpMethod = HTTPMethod.get.rawValue
  355. let parameters = ["foo": 1, "bar": 2]
  356. // When
  357. let urlRequest = try encoding.encode(mutableURLRequest, with: parameters)
  358. // Then
  359. XCTAssertEqual(urlRequest.url?.query, "bar=2&foo=1")
  360. XCTAssertNil(urlRequest.value(forHTTPHeaderField: "Content-Type"), "Content-Type should be nil")
  361. XCTAssertNil(urlRequest.httpBody, "HTTPBody should be nil")
  362. }
  363. func testThatURLParameterEncodingEncodesPOSTParametersInHTTPBody() throws {
  364. // Given
  365. var mutableURLRequest = self.urlRequest
  366. mutableURLRequest.httpMethod = HTTPMethod.post.rawValue
  367. let parameters = ["foo": 1, "bar": 2]
  368. // When
  369. let urlRequest = try encoding.encode(mutableURLRequest, with: parameters)
  370. // Then
  371. XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "Content-Type"), "application/x-www-form-urlencoded; charset=utf-8")
  372. XCTAssertNotNil(urlRequest.httpBody, "HTTPBody should not be nil")
  373. XCTAssertEqual(urlRequest.httpBody?.asString, "bar=2&foo=1")
  374. }
  375. func testThatURLEncodedInURLParameterEncodingEncodesPOSTParametersInURL() throws {
  376. // Given
  377. var mutableURLRequest = self.urlRequest
  378. mutableURLRequest.httpMethod = HTTPMethod.post.rawValue
  379. let parameters = ["foo": 1, "bar": 2]
  380. // When
  381. let urlRequest = try URLEncoding.queryString.encode(mutableURLRequest, with: parameters)
  382. // Then
  383. XCTAssertEqual(urlRequest.url?.query, "bar=2&foo=1")
  384. XCTAssertNil(urlRequest.value(forHTTPHeaderField: "Content-Type"))
  385. XCTAssertNil(urlRequest.httpBody, "HTTPBody should be nil")
  386. }
  387. }
  388. // MARK: -
  389. final class JSONParameterEncodingTestCase: ParameterEncodingTestCase {
  390. // MARK: Properties
  391. let encoding = JSONEncoding.default
  392. // MARK: Tests
  393. func testJSONParameterEncodeNilParameters() throws {
  394. // Given, When
  395. let request = try encoding.encode(urlRequest, with: nil)
  396. // Then
  397. XCTAssertNil(request.url?.query, "query should be nil")
  398. XCTAssertNil(request.value(forHTTPHeaderField: "Content-Type"))
  399. XCTAssertNil(request.httpBody, "HTTPBody should be nil")
  400. }
  401. func testJSONParameterEncodeComplexParameters() throws {
  402. // Given
  403. let parameters: [String: Any] = ["foo": "bar",
  404. "baz": ["a", 1, true],
  405. "qux": ["a": 1,
  406. "b": [2, 2],
  407. "c": [3, 3, 3]]]
  408. // When
  409. let request = try encoding.encode(urlRequest, with: parameters)
  410. // Then
  411. XCTAssertNil(request.url?.query)
  412. XCTAssertNotNil(request.value(forHTTPHeaderField: "Content-Type"))
  413. XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json")
  414. XCTAssertNotNil(request.httpBody)
  415. XCTAssertEqual(try request.httpBody?.asJSONObject() as? NSObject,
  416. parameters as NSObject,
  417. "Decoded request body and parameters should be equal.")
  418. }
  419. func testJSONParameterEncodeArray() throws {
  420. // Given
  421. let array = ["foo", "bar", "baz"]
  422. // When
  423. let request = try encoding.encode(urlRequest, withJSONObject: array)
  424. // Then
  425. XCTAssertNil(request.url?.query)
  426. XCTAssertNotNil(request.value(forHTTPHeaderField: "Content-Type"))
  427. XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json")
  428. XCTAssertNotNil(request.httpBody)
  429. XCTAssertEqual(try request.httpBody?.asJSONObject() as? NSObject,
  430. array as NSObject,
  431. "Decoded request body and parameters should be equal.")
  432. }
  433. func testJSONParameterEncodeParametersRetainsCustomContentType() throws {
  434. // Given
  435. let request = Endpoint(headers: [.contentType("application/custom-json-type+json")]).urlRequest
  436. let parameters = ["foo": "bar"]
  437. // When
  438. let urlRequest = try encoding.encode(request, with: parameters)
  439. // Then
  440. XCTAssertNil(urlRequest.url?.query)
  441. XCTAssertEqual(urlRequest.headers["Content-Type"], "application/custom-json-type+json")
  442. }
  443. func testJSONParameterEncodeParametersThrowsErrorWithInvalidValue() {
  444. // Given
  445. struct Value {}
  446. let value = Value()
  447. // When
  448. let result = Result { try encoding.encode(urlRequest, with: ["key": value]) }
  449. // Then
  450. XCTAssertTrue(result.failure?.asAFError?.isJSONEncodingFailed == true)
  451. }
  452. func testJSONParameterEncodeObjectThrowsErrorWithInvalidValue() {
  453. // Given
  454. struct Value {}
  455. let value = Value()
  456. // When
  457. let result = Result { try encoding.encode(urlRequest, withJSONObject: value) }
  458. // Then
  459. XCTAssertTrue(result.failure?.asAFError?.isJSONEncodingFailed == true)
  460. }
  461. }