| // ParameterEncodingTests.swift |
| // |
| // Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/) |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a copy |
| // of this software and associated documentation files (the "Software"), to deal |
| // in the Software without restriction, including without limitation the rights |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| // copies of the Software, and to permit persons to whom the Software is |
| // furnished to do so, subject to the following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included in |
| // all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| // THE SOFTWARE. |
| |
| import Alamofire |
| import Foundation |
| import XCTest |
| |
| class ParameterEncodingTestCase: BaseTestCase { |
| let URLRequest = NSURLRequest(URL: NSURL(string: "https://example.com/")!) |
| } |
| |
| // MARK: - |
| |
| class URLParameterEncodingTestCase: ParameterEncodingTestCase { |
| let encoding: ParameterEncoding = .URL |
| |
| // MARK: Tests - Parameter Types |
| |
| func testURLParameterEncodeNilParameters() { |
| // Given |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: nil) |
| |
| // Then |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| } |
| |
| func testURLParameterEncodeEmptyDictionaryParameter() { |
| // Given |
| let parameters: [String: AnyObject] = [:] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| } |
| |
| func testURLParameterEncodeOneStringKeyStringValueParameter() { |
| // Given |
| let parameters = ["foo": "bar"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo=bar", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeOneStringKeyStringValueParameterAppendedToQuery() { |
| // Given |
| let mutableURLRequest = self.URLRequest.URLRequest |
| let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false)! |
| URLComponents.query = "baz=qux" |
| mutableURLRequest.URL = URLComponents.URL |
| |
| let parameters = ["foo": "bar"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "baz=qux&foo=bar", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeTwoStringKeyStringValueParameters() { |
| // Given |
| let parameters = ["foo": "bar", "baz": "qux"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "baz=qux&foo=bar", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyIntegerValueParameter() { |
| // Given |
| let parameters = ["foo": 1] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo=1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyDoubleValueParameter() { |
| // Given |
| let parameters = ["foo": 1.1] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo=1.1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyBoolValueParameter() { |
| // Given |
| let parameters = ["foo": true] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo=1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyArrayValueParameter() { |
| // Given |
| let parameters = ["foo": ["a", 1, true]] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo%5B%5D=a&foo%5B%5D=1&foo%5B%5D=1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyDictionaryValueParameter() { |
| // Given |
| let parameters = ["foo": ["bar": 1]] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo%5Bbar%5D=1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyNestedDictionaryValueParameter() { |
| // Given |
| let parameters = ["foo": ["bar": ["baz": 1]]] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo%5Bbar%5D%5Bbaz%5D=1", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameter() { |
| // Given |
| let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| 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" |
| XCTAssertEqual(URLRequest.URL?.query ?? "", expectedQuery, "query is incorrect") |
| } |
| |
| // MARK: Tests - All Reserved / Unreserved / Illegal Characters According to RFC 3986 |
| |
| func testThatReservedCharactersArePercentEscapedMinusQuestionMarkAndForwardSlash() { |
| // Given |
| let generalDelimiters = ":#[]@" |
| let subDelimiters = "!$&'()*+,;=" |
| let parameters = ["reserved": "\(generalDelimiters)\(subDelimiters)"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| let expectedQuery = "reserved=%3A%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D" |
| XCTAssertEqual(URLRequest.URL?.query ?? "", expectedQuery, "query is incorrect") |
| } |
| |
| func testThatReservedCharactersQuestionMarkAndForwardSlashAreNotPercentEscaped() { |
| // Given |
| let parameters = ["reserved": "?/"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "reserved=?/", "query is incorrect") |
| } |
| |
| func testThatUnreservedNumericCharactersAreNotPercentEscaped() { |
| // Given |
| let parameters = ["numbers": "0123456789"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "numbers=0123456789", "query is incorrect") |
| } |
| |
| func testThatUnreservedLowercaseCharactersAreNotPercentEscaped() { |
| // Given |
| let parameters = ["lowercase": "abcdefghijklmnopqrstuvwxyz"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "lowercase=abcdefghijklmnopqrstuvwxyz", "query is incorrect") |
| } |
| |
| func testThatUnreservedUppercaseCharactersAreNotPercentEscaped() { |
| // Given |
| let parameters = ["uppercase": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ", "query is incorrect") |
| } |
| |
| func testThatIllegalASCIICharactersArePercentEscaped() { |
| // Given |
| let parameters = ["illegal": " \"#%<>[]\\^`{}|"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| let expectedQuery = "illegal=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7C" |
| XCTAssertEqual(URLRequest.URL?.query ?? "", expectedQuery, "query is incorrect") |
| } |
| |
| // MARK: Tests - Special Character Queries |
| |
| func testURLParameterEncodeStringWithAmpersandKeyStringWithAmpersandValueParameter() { |
| // Given |
| let parameters = ["foo&bar": "baz&qux", "foobar": "bazqux"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo%26bar=baz%26qux&foobar=bazqux", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithQuestionMarkKeyStringWithQuestionMarkValueParameter() { |
| // Given |
| let parameters = ["?foo?": "?bar?"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "?foo?=?bar?", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithSlashKeyStringWithQuestionMarkValueParameter() { |
| // Given |
| let parameters = ["foo": "/bar/baz/qux"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "foo=/bar/baz/qux", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithSpaceKeyStringWithSpaceValueParameter() { |
| // Given |
| let parameters = [" foo ": " bar "] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "%20foo%20=%20bar%20", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameter() { |
| // Given |
| let parameters = ["+foo+": "+bar+"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "%2Bfoo%2B=%2Bbar%2B", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyPercentEncodedStringValueParameter() { |
| // Given |
| let parameters = ["percent": "%25"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "percent=%2525", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringKeyNonLatinStringValueParameter() { |
| // Given |
| let parameters = [ |
| "french": "français", |
| "japanese": "日本語", |
| "arabic": "العربية", |
| "emoji": "😃" |
| ] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| let expectedParameterValues = [ |
| "arabic=%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9", |
| "emoji=%F0%9F%98%83", |
| "french=fran%C3%A7ais", |
| "japanese=%E6%97%A5%E6%9C%AC%E8%AA%9E" |
| ] |
| |
| let expectedQuery = expectedParameterValues.joinWithSeparator("&") |
| XCTAssertEqual(URLRequest.URL?.query ?? "", expectedQuery, "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringForRequestWithPrecomposedQuery() { |
| // Given |
| let URL = NSURL(string: "https://example.com/movies?hd=[1]")! |
| let parameters = ["page": "0"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(NSURLRequest(URL: URL), parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "hd=%5B1%5D&page=0", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameterForRequestWithPrecomposedQuery() { |
| // Given |
| let URL = NSURL(string: "https://example.com/movie?hd=[1]")! |
| let parameters = ["+foo+": "+bar+"] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(NSURLRequest(URL: URL), parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "hd=%5B1%5D&%2Bfoo%2B=%2Bbar%2B", "query is incorrect") |
| } |
| |
| func testURLParameterEncodeStringWithThousandsOfChineseCharacters() { |
| // Given |
| let repeatedCount = 2_000 |
| let URL = NSURL(string: "https://example.com/movies")! |
| let parameters = ["chinese": String(count: repeatedCount, repeatedString: "一二三四五六七八九十")] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(NSURLRequest(URL: URL), parameters: parameters) |
| |
| // Then |
| var expected = "chinese=" |
| for _ in 0..<repeatedCount { |
| 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" |
| } |
| XCTAssertEqual(URLRequest.URL?.query ?? "", expected, "query is incorrect") |
| } |
| |
| // MARK: Tests - Varying HTTP Methods |
| |
| func testThatURLParameterEncodingEncodesGETParametersInURL() { |
| // Given |
| let mutableURLRequest = self.URLRequest.URLRequest |
| mutableURLRequest.HTTPMethod = Method.GET.rawValue |
| let parameters = ["foo": 1, "bar": 2] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "bar=2&foo=1", "query is incorrect") |
| XCTAssertNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should be nil") |
| XCTAssertNil(URLRequest.HTTPBody, "HTTPBody should be nil") |
| } |
| |
| func testThatURLParameterEncodingEncodesPOSTParametersInHTTPBody() { |
| // Given |
| let mutableURLRequest = self.URLRequest.URLRequest |
| mutableURLRequest.HTTPMethod = Method.POST.rawValue |
| let parameters = ["foo": 1, "bar": 2] |
| |
| // When |
| let (URLRequest, _) = encoding.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual( |
| URLRequest.valueForHTTPHeaderField("Content-Type") ?? "", |
| "application/x-www-form-urlencoded; charset=utf-8", |
| "Content-Type should be application/x-www-form-urlencoded" |
| ) |
| XCTAssertNotNil(URLRequest.HTTPBody, "HTTPBody should not be nil") |
| |
| if let |
| HTTPBody = URLRequest.HTTPBody, |
| decodedHTTPBody = String(data: HTTPBody, encoding: NSUTF8StringEncoding) |
| { |
| XCTAssertEqual(decodedHTTPBody, "bar=2&foo=1", "HTTPBody is incorrect") |
| } else { |
| XCTFail("decoded http body should not be nil") |
| } |
| } |
| |
| func testThatURLEncodedInURLParameterEncodingEncodesPOSTParametersInURL() { |
| // Given |
| let mutableURLRequest = self.URLRequest.URLRequest |
| mutableURLRequest.HTTPMethod = Method.POST.rawValue |
| let parameters = ["foo": 1, "bar": 2] |
| |
| // When |
| let (URLRequest, _) = ParameterEncoding.URLEncodedInURL.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertEqual(URLRequest.URL?.query ?? "", "bar=2&foo=1", "query is incorrect") |
| XCTAssertNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should be nil") |
| XCTAssertNil(URLRequest.HTTPBody, "HTTPBody should be nil") |
| } |
| } |
| |
| // MARK: - |
| |
| class JSONParameterEncodingTestCase: ParameterEncodingTestCase { |
| // MARK: Properties |
| |
| let encoding: ParameterEncoding = .JSON |
| |
| // MARK: Tests |
| |
| func testJSONParameterEncodeNilParameters() { |
| // Given |
| // When |
| let (URLRequest, error) = encoding.encode(self.URLRequest, parameters: nil) |
| |
| // Then |
| XCTAssertNil(error, "error should be nil") |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| XCTAssertNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should be nil") |
| XCTAssertNil(URLRequest.HTTPBody, "HTTPBody should be nil") |
| } |
| |
| func testJSONParameterEncodeComplexParameters() { |
| // Given |
| let parameters = [ |
| "foo": "bar", |
| "baz": ["a", 1, true], |
| "qux": [ |
| "a": 1, |
| "b": [2, 2], |
| "c": [3, 3, 3] |
| ] |
| ] |
| |
| // When |
| let (URLRequest, error) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(error, "error should be nil") |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| XCTAssertNotNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should not be nil") |
| XCTAssertEqual( |
| URLRequest.valueForHTTPHeaderField("Content-Type") ?? "", |
| "application/json", |
| "Content-Type should be application/json" |
| ) |
| XCTAssertNotNil(URLRequest.HTTPBody, "HTTPBody should not be nil") |
| |
| if let HTTPBody = URLRequest.HTTPBody { |
| do { |
| let JSON = try NSJSONSerialization.JSONObjectWithData(HTTPBody, options: .AllowFragments) |
| |
| if let JSON = JSON as? NSObject { |
| XCTAssertEqual(JSON, parameters as NSObject, "HTTPBody JSON does not equal parameters") |
| } else { |
| XCTFail("JSON should be an NSObject") |
| } |
| } catch { |
| XCTFail("JSON should not be nil") |
| } |
| } else { |
| XCTFail("JSON should not be nil") |
| } |
| } |
| |
| func testJSONParameterEncodeParametersRetainsCustomContentType() { |
| // Given |
| let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "https://example.com/")!) |
| mutableURLRequest.setValue("application/custom-json-type+json", forHTTPHeaderField: "Content-Type") |
| |
| let parameters = ["foo": "bar"] |
| |
| // When |
| let (URLRequest, error) = encoding.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(error) |
| XCTAssertNil(URLRequest.URL?.query) |
| XCTAssertEqual(URLRequest.valueForHTTPHeaderField("Content-Type"), "application/custom-json-type+json") |
| } |
| } |
| |
| // MARK: - |
| |
| class PropertyListParameterEncodingTestCase: ParameterEncodingTestCase { |
| // MARK: Properties |
| |
| let encoding: ParameterEncoding = .PropertyList(.XMLFormat_v1_0, 0) |
| |
| // MARK: Tests |
| |
| func testPropertyListParameterEncodeNilParameters() { |
| // Given |
| // When |
| let (URLRequest, error) = encoding.encode(self.URLRequest, parameters: nil) |
| |
| // Then |
| XCTAssertNil(error, "error should be nil") |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| XCTAssertNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should be nil") |
| XCTAssertNil(URLRequest.HTTPBody, "HTTPBody should be nil") |
| } |
| |
| func testPropertyListParameterEncodeComplexParameters() { |
| // Given |
| let parameters = [ |
| "foo": "bar", |
| "baz": ["a", 1, true], |
| "qux": [ |
| "a": 1, |
| "b": [2, 2], |
| "c": [3, 3, 3] |
| ] |
| ] |
| |
| // When |
| let (URLRequest, error) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(error, "error should be nil") |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| XCTAssertNotNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should not be nil") |
| XCTAssertEqual( |
| URLRequest.valueForHTTPHeaderField("Content-Type") ?? "", |
| "application/x-plist", |
| "Content-Type should be application/x-plist" |
| ) |
| XCTAssertNotNil(URLRequest.HTTPBody, "HTTPBody should not be nil") |
| |
| if let HTTPBody = URLRequest.HTTPBody { |
| do { |
| let plist = try NSPropertyListSerialization.propertyListWithData( |
| HTTPBody, |
| options: NSPropertyListReadOptions.Immutable, |
| format: nil |
| ) |
| if let plist = plist as? NSObject { |
| XCTAssertEqual(plist, parameters as NSObject, "HTTPBody plist does not equal parameters") |
| } else { |
| XCTFail("plist should be an NSObject") |
| } |
| } catch { |
| XCTFail("plist should not be nil") |
| } |
| } |
| } |
| |
| func testPropertyListParameterEncodeDateAndDataParameters() { |
| // Given |
| let date: NSDate = NSDate() |
| let data: NSData = "data".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! |
| |
| let parameters = [ |
| "date": date, |
| "data": data |
| ] |
| |
| // When |
| let (URLRequest, error) = encoding.encode(self.URLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(error, "error should be nil") |
| XCTAssertNil(URLRequest.URL?.query, "query should be nil") |
| XCTAssertNotNil(URLRequest.valueForHTTPHeaderField("Content-Type"), "Content-Type should not be nil") |
| XCTAssertEqual( |
| URLRequest.valueForHTTPHeaderField("Content-Type") ?? "", |
| "application/x-plist", |
| "Content-Type should be application/x-plist" |
| ) |
| XCTAssertNotNil(URLRequest.HTTPBody, "HTTPBody should not be nil") |
| |
| if let HTTPBody = URLRequest.HTTPBody { |
| do { |
| let plist = try NSPropertyListSerialization.propertyListWithData( |
| HTTPBody, |
| options: NSPropertyListReadOptions.Immutable, |
| format: nil |
| ) |
| XCTAssertTrue(plist.valueForKey("date") is NSDate, "date is not NSDate") |
| XCTAssertTrue(plist.valueForKey("data") is NSData, "data is not NSData") |
| } catch { |
| XCTFail("plist should not be nil") |
| } |
| } else { |
| XCTFail("HTTPBody should not be nil") |
| } |
| } |
| |
| func testPropertyListParameterEncodeParametersRetainsCustomContentType() { |
| // Given |
| let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "https://example.com/")!) |
| mutableURLRequest.setValue("application/custom-plist-type+plist", forHTTPHeaderField: "Content-Type") |
| |
| let parameters = ["foo": "bar"] |
| |
| // When |
| let (URLRequest, error) = encoding.encode(mutableURLRequest, parameters: parameters) |
| |
| // Then |
| XCTAssertNil(error) |
| XCTAssertNil(URLRequest.URL?.query) |
| XCTAssertEqual(URLRequest.valueForHTTPHeaderField("Content-Type"), "application/custom-plist-type+plist") |
| } |
| } |
| |
| // MARK: - |
| |
| class CustomParameterEncodingTestCase: ParameterEncodingTestCase { |
| // MARK: Tests |
| |
| func testCustomParameterEncode() { |
| // Given |
| let encodingClosure: (URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?) = { URLRequest, parameters in |
| guard let parameters = parameters else { return (URLRequest.URLRequest, nil) } |
| |
| var URLString = URLRequest.URLRequest.URLString + "?" |
| |
| parameters.forEach { URLString += "\($0)=\($1)" } |
| |
| let mutableURLRequest = URLRequest.URLRequest |
| mutableURLRequest.URL = NSURL(string: URLString)! |
| |
| return (mutableURLRequest, nil) |
| } |
| |
| // When |
| let encoding: ParameterEncoding = .Custom(encodingClosure) |
| |
| // Then |
| let URL = NSURL(string: "https://example.com")! |
| let URLRequest = NSURLRequest(URL: URL) |
| let parameters: [String: AnyObject] = ["foo": "bar"] |
| |
| XCTAssertEqual( |
| encoding.encode(URLRequest, parameters: parameters).0.URLString, |
| "https://example.com?foo=bar", |
| "the encoded URL should match the expected value" |
| ) |
| } |
| } |