blob: 9d3b7123af56d82f652f417444ce9322ca5258a2 [file] [log] [blame]
// ResponseSerializationTests.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 ResponseSerializationTestCase: BaseTestCase {
let error = NSError(domain: Error.Domain, code: -10000, userInfo: nil)
// MARK: - Data Response Serializer Tests
func testThatDataResponseSerializerSucceedsWhenDataIsNotNil() {
// Given
let serializer = Request.dataResponseSerializer()
let data = "data".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatDataResponseSerializerFailsWhenDataIsNil() {
// Given
let serializer = Request.dataResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.DataSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatDataResponseSerializerFailsWhenErrorIsNotNil() {
// Given
let serializer = Request.dataResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, error)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatDataResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
// Given
let serializer = Request.dataResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.DataSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatDataResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
// Given
let serializer = Request.dataResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 204, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
if let data = result.value {
XCTAssertEqual(data.length, 0, "data length should be zero")
}
}
// MARK: - String Response Serializer Tests
func testThatStringResponseSerializerFailsWhenDataIsNil() {
// Given
let serializer = Request.stringResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.StringSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatStringResponseSerializerSucceedsWhenDataIsEmpty() {
// Given
let serializer = Request.stringResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, NSData(), nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() {
let serializer = Request.stringResponseSerializer()
let data = "data".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() {
let serializer = Request.stringResponseSerializer(encoding: NSUTF8StringEncoding)
let data = "data".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() {
let serializer = Request.stringResponseSerializer()
let data = "data".dataUsingEncoding(NSUTF8StringEncoding)!
let response = NSHTTPURLResponse(
URL: NSURL(string: "https://httpbin.org/get")!,
statusCode: 200,
HTTPVersion: "HTTP/1.1",
headerFields: ["Content-Type": "image/jpeg; charset=utf-8"]
)
// When
let result = serializer.serializeResponse(nil, response, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() {
// Given
let serializer = Request.stringResponseSerializer(encoding: NSUTF8StringEncoding)
let data = "random data".dataUsingEncoding(NSUTF32StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.StringSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() {
// Given
let serializer = Request.stringResponseSerializer()
let data = "random data".dataUsingEncoding(NSUTF32StringEncoding)!
let response = NSHTTPURLResponse(
URL: NSURL(string: "https://httpbin.org/get")!,
statusCode: 200,
HTTPVersion: "HTTP/1.1",
headerFields: ["Content-Type": "image/jpeg; charset=utf-8"]
)
// When
let result = serializer.serializeResponse(nil, response, data, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.StringSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatStringResponseSerializerFailsWhenErrorIsNotNil() {
// Given
let serializer = Request.stringResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, error)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatStringResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
// Given
let serializer = Request.stringResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.StringSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatStringResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
// Given
let serializer = Request.stringResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 204, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
if let string = result.value {
XCTAssertEqual(string, "", "string should be equal to empty string")
}
}
// MARK: - JSON Response Serializer Tests
func testThatJSONResponseSerializerFailsWhenDataIsNil() {
// Given
let serializer = Request.JSONResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.JSONSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatJSONResponseSerializerFailsWhenDataIsEmpty() {
// Given
let serializer = Request.JSONResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, NSData(), nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.JSONSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() {
// Given
let serializer = Request.JSONResponseSerializer()
let data = "{\"json\": true}".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() {
// Given
let serializer = Request.JSONResponseSerializer()
let data = "definitely not valid json".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, NSCocoaErrorDomain, "error domain should match expected value")
XCTAssertEqual(error.code, 3840, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() {
// Given
let serializer = Request.JSONResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, error)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatJSONResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
// Given
let serializer = Request.JSONResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.JSONSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatJSONResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
// Given
let serializer = Request.JSONResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 204, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
if let json = result.value as? NSNull {
XCTAssertEqual(json, NSNull(), "json should be equal to NSNull")
}
}
// MARK: - Property List Response Serializer Tests
func testThatPropertyListResponseSerializerFailsWhenDataIsNil() {
// Given
let serializer = Request.propertyListResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.PropertyListSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatPropertyListResponseSerializerFailsWhenDataIsEmpty() {
// Given
let serializer = Request.propertyListResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, NSData(), nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.PropertyListSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatPropertyListResponseSerializerSucceedsWhenDataIsValidPropertyListData() {
// Given
let serializer = Request.propertyListResponseSerializer()
let data = NSKeyedArchiver.archivedDataWithRootObject(["foo": "bar"])
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
}
func testThatPropertyListResponseSerializerFailsWhenDataIsInvalidPropertyListData() {
// Given
let serializer = Request.propertyListResponseSerializer()
let data = "definitely not valid plist data".dataUsingEncoding(NSUTF8StringEncoding)!
// When
let result = serializer.serializeResponse(nil, nil, data, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, NSCocoaErrorDomain, "error domain should match expected value")
XCTAssertEqual(error.code, 3840, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatPropertyListResponseSerializerFailsWhenErrorIsNotNil() {
// Given
let serializer = Request.propertyListResponseSerializer()
// When
let result = serializer.serializeResponse(nil, nil, nil, error)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, self.error.code, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatPropertyListResponseSerializerFailsWhenDataIsNilWithNon204ResponseStatusCode() {
// Given
let serializer = Request.propertyListResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isFailure, "result is failure should be true")
XCTAssertNil(result.value, "result value should be nil")
XCTAssertNotNil(result.error, "result error should not be nil")
if let error = result.error {
XCTAssertEqual(error.domain, Error.Domain, "error domain should match expected value")
XCTAssertEqual(error.code, Error.Code.PropertyListSerializationFailed.rawValue, "error code should match expected value")
} else {
XCTFail("error should not be nil")
}
}
func testThatPropertyListResponseSerializerSucceedsWhenDataIsNilWith204ResponseStatusCode() {
// Given
let serializer = Request.propertyListResponseSerializer()
let URL = NSURL(string: "https://httpbin.org/get")!
let response = NSHTTPURLResponse(URL: URL, statusCode: 204, HTTPVersion: "HTTP/1.1", headerFields: nil)
// When
let result = serializer.serializeResponse(nil, response, nil, nil)
// Then
XCTAssertTrue(result.isSuccess, "result is success should be true")
XCTAssertNotNil(result.value, "result value should not be nil")
XCTAssertNil(result.error, "result error should be nil")
if let plist = result.value as? NSNull {
XCTAssertEqual(plist, NSNull(), "plist should be equal to NSNull")
}
}
}