[Swift] Handle Void responses

This commit is contained in:
Jason Gavris 2016-08-23 09:52:34 -04:00
parent c1f3c51427
commit 3a457c6a7e
12 changed files with 85 additions and 140 deletions

View File

@ -89,6 +89,26 @@ class AlamofireRequestBuilder<T>: RequestBuilder<T> {
let validatedRequest = request.validate()
switch T.self {
case is Void.Type:
validatedRequest.responseData(completionHandler: { (voidResponse) in
cleanupRequest()
if voidResponse.result.isFailure {
completion(
response: nil,
error: ErrorResponse.Error(voidResponse.response?.statusCode ?? 500, voidResponse.data, voidResponse.result.error!)
)
return
}
completion(
response: Response(
response: voidResponse.response!,
body: nil
),
error: nil
)
})
case is NSData.Type:
validatedRequest.responseData(completionHandler: { (dataResponse) in
cleanupRequest()

View File

@ -17,15 +17,15 @@ public enum ErrorResponse : ErrorType {
public class Response<T> {
public let statusCode: Int
public let header: [String: String]
public let body: T
public let body: T?
public init(statusCode: Int, header: [String: String], body: T) {
public init(statusCode: Int, header: [String: String], body: T?) {
self.statusCode = statusCode
self.header = header
self.body = body
}
public convenience init(response: NSHTTPURLResponse, body: T) {
public convenience init(response: NSHTTPURLResponse, body: T?) {
let rawHeader = response.allHeaderFields
var header = [String:String]()
for (key, value) in rawHeader {

View File

@ -89,6 +89,26 @@ class AlamofireRequestBuilder<T>: RequestBuilder<T> {
let validatedRequest = request.validate()
switch T.self {
case is Void.Type:
validatedRequest.responseData(completionHandler: { (voidResponse) in
cleanupRequest()
if voidResponse.result.isFailure {
completion(
response: nil,
error: ErrorResponse.Error(voidResponse.response?.statusCode ?? 500, voidResponse.data, voidResponse.result.error!)
)
return
}
completion(
response: Response(
response: voidResponse.response!,
body: nil
),
error: nil
)
})
case is NSData.Type:
validatedRequest.responseData(completionHandler: { (dataResponse) in
cleanupRequest()

View File

@ -17,15 +17,15 @@ public enum ErrorResponse : ErrorType {
public class Response<T> {
public let statusCode: Int
public let header: [String: String]
public let body: T
public let body: T?
public init(statusCode: Int, header: [String: String], body: T) {
public init(statusCode: Int, header: [String: String], body: T?) {
self.statusCode = statusCode
self.header = header
self.body = body
}
public convenience init(response: NSHTTPURLResponse, body: T) {
public convenience init(response: NSHTTPURLResponse, body: T?) {
let rawHeader = response.allHeaderFields
var header = [String:String]()
for (key, value) in rawHeader {

View File

@ -72,19 +72,12 @@ class PetAPITests: XCTestCase {
let expectation = self.expectationWithDescription("testDeletePet")
PetAPI.deletePet(petId: 1000) { (error) in
// The server gives us no data back so Alamofire parsing fails - at least
// verify that is the error we get here
guard let error = error else {
guard error == nil else {
XCTFail("error deleting pet")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error deleting pet")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)

View File

@ -74,19 +74,12 @@ class StoreAPITests: XCTestCase {
let expectation = self.expectationWithDescription("testDeleteOrder")
StoreAPI.deleteOrder(orderId: "1000") { (error) in
// The server gives us no data back so Alamofire parsing fails - at least
// verify that is the error we get here
guard let error = error else {
guard error == nil else {
XCTFail("error deleting order")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error deleting order")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)

View File

@ -50,19 +50,12 @@ class UserAPITests: XCTestCase {
let expectation = self.expectationWithDescription("testLogout")
UserAPI.logoutUser { (error) in
// The server gives us no data back so Alamofire parsing fails - at least
// verify that is the error we get here
guard let error = error else {
guard error == nil else {
XCTFail("error logging out")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error logging out")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
@ -82,19 +75,12 @@ class UserAPITests: XCTestCase {
newUser.userStatus = 0
UserAPI.createUser(body: newUser) { (error) in
// The server gives us no data back so Alamofire parsing fails - at least
// verify that is the error we get here
guard let error = error else {
guard error == nil else {
XCTFail("error creating user")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error creating user")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
@ -128,19 +114,12 @@ class UserAPITests: XCTestCase {
let expectation = self.expectationWithDescription("testDeleteUser")
UserAPI.deleteUser(username: "test@test.com") { (error) in
// The server gives us no data back so Alamofire parsing fails - at least
// verify that is the error we get here
guard let error = error else {
guard error == nil else {
XCTFail("error deleting user")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error deleting user")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)

View File

@ -89,6 +89,26 @@ class AlamofireRequestBuilder<T>: RequestBuilder<T> {
let validatedRequest = request.validate()
switch T.self {
case is Void.Type:
validatedRequest.responseData(completionHandler: { (voidResponse) in
cleanupRequest()
if voidResponse.result.isFailure {
completion(
response: nil,
error: ErrorResponse.Error(voidResponse.response?.statusCode ?? 500, voidResponse.data, voidResponse.result.error!)
)
return
}
completion(
response: Response(
response: voidResponse.response!,
body: nil
),
error: nil
)
})
case is NSData.Type:
validatedRequest.responseData(completionHandler: { (dataResponse) in
cleanupRequest()

View File

@ -17,15 +17,15 @@ public enum ErrorResponse : ErrorType {
public class Response<T> {
public let statusCode: Int
public let header: [String: String]
public let body: T
public let body: T?
public init(statusCode: Int, header: [String: String], body: T) {
public init(statusCode: Int, header: [String: String], body: T?) {
self.statusCode = statusCode
self.header = header
self.body = body
}
public convenience init(response: NSHTTPURLResponse, body: T) {
public convenience init(response: NSHTTPURLResponse, body: T?) {
let rawHeader = response.allHeaderFields
var header = [String:String]()
for (key, value) in rawHeader {

View File

@ -61,24 +61,8 @@ class PetAPITests: XCTestCase {
func test3DeletePet() {
let expectation = self.expectationWithDescription("testDeletePet")
PetAPI.deletePet(petId: 1000).always {
// expectation.fulfill()
}.always {
// Noop for now
}.error { errorType -> Void in
// The server gives us no data back so alamofire parsing fails - at least
// verify that is the error we get here
guard let error = errorType as? ErrorResponse else {
XCTFail("error logging out")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error logging out")
}
PetAPI.deletePet(petId: 1000).then {
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
}

View File

@ -62,23 +62,7 @@ class StoreAPITests: XCTestCase {
func test3DeleteOrder() {
let expectation = self.expectationWithDescription("testDeleteOrder")
StoreAPI.deleteOrder(orderId: "1000").then {
expectation.fulfill()
}.always {
// Noop for now
}.error { errorType -> Void in
// The server gives us no data back so alamofire parsing fails - at least
// verify that is the error we get here
guard let error = errorType as? ErrorResponse else {
XCTFail("error deleting order")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error deleting order")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
}

View File

@ -52,23 +52,7 @@ class UserAPITests: XCTestCase {
func testLogout() {
let expectation = self.expectationWithDescription("testLogout")
UserAPI.logoutUser().then {
expectation.fulfill()
}.always {
// Noop for now
}.error { errorType -> Void in
// The server gives us no data back so alamofire parsing fails - at least
// verify that is the error we get here
guard let error = errorType as? ErrorResponse else {
XCTFail("error logging out")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error logging out")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
}
@ -85,23 +69,7 @@ class UserAPITests: XCTestCase {
newUser.username = "test@test.com"
newUser.userStatus = 0
UserAPI.createUser(body: newUser).then {
expectation.fulfill()
}.always {
// Noop for now
}.error { errorType -> Void in
// The server gives us no data back so alamofire parsing fails - at least
// verify that is the error we get here
guard let error = errorType as? ErrorResponse else {
XCTFail("error creating user")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error creating user")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
}
@ -127,23 +95,7 @@ class UserAPITests: XCTestCase {
func test3DeleteUser() {
let expectation = self.expectationWithDescription("testDeleteUser")
UserAPI.deleteUser(username: "test@test.com").then {
expectation.fulfill()
}.always {
// Noop for now
}.error { errorType -> Void in
// The server gives us no data back so alamofire parsing fails - at least
// verify that is the error we get here
guard let error = errorType as? ErrorResponse else {
XCTFail("error deleting user")
return
}
switch error {
case ErrorResponse.Error(200, _, _):
expectation.fulfill()
default:
XCTFail("error deleting user")
}
expectation.fulfill()
}
self.waitForExpectationsWithTimeout(testTimeout, handler: nil)
}