| // 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") |
| } |
| } |
| } |