ParameterEncodingTests.swift 21 KB

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