Created
March 9, 2017 14:24
-
-
Save wwe-johndpope/573b52bfa6d7dae377f6c222b6db91f0 to your computer and use it in GitHub Desktop.
Sample stubbing of mock data from json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// HTTPStub.swift | |
// Karhoo | |
// | |
// Created by John Pope on 9/14/16. | |
// Copyright © 2016 Karhoo Ltd. All rights reserved. | |
// | |
import Foundation | |
import UIKit | |
import OHHTTPStubs | |
struct KHAPIError { | |
private static let domain = KarhooAPIErrorDomain | |
static let BadRequest = NSError(domain: domain, code: 400, userInfo: ["NSLocalizedDescription":"Bad Request"]) | |
static let Unauthorized = NSError(domain: domain, code: 401, userInfo: ["NSLocalizedDescription":"Unauthorized Request"]) | |
static let NotFound = NSError(domain: domain, code: 404, userInfo: ["NSLocalizedDescription":"Data Not Found"]) | |
static let RateLimitExceeded = NSError(domain: domain, code: 429, userInfo: ["NSLocalizedDescription":"Rate Limit Exceeded"]) | |
static let NoResponse = NSError(domain: domain, code: 444, userInfo: ["NSLocalizedDescription":"No Response"]) | |
static let InternalServerError = NSError(domain: domain, code: 500, userInfo: ["NSLocalizedDescription":"Internal Server Error"]) | |
static let ServiceUnavailable = NSError(domain: domain, code: 503, userInfo: ["NSLocalizedDescription":"Service Unavailable"]) | |
static let Unknown = NSError(domain: domain, code: 520, userInfo: ["NSLocalizedDescription":"Unknown Error"]) | |
static let ErrorGettingTrip = NSError(domain: domain, code: 62, userInfo: ["NSLocalizedDescription":"Error getting Trip"]) | |
static let ErrorPreBookNotPossible = NSError(domain: domain, code: 107, userInfo: ["NSLocalizedDescription":"PrebookNotPossibleTitle"]) | |
static func FromCode(code: Int) -> NSError { | |
switch(code) { | |
case 400: | |
return BadRequest | |
case 401: | |
return Unauthorized | |
case 404: | |
return NotFound | |
case 429: | |
return RateLimitExceeded | |
case 444: | |
return NoResponse | |
case 500: | |
return InternalServerError | |
case 503: | |
return ServiceUnavailable | |
default: | |
return Unknown | |
} | |
} | |
} | |
// TODO - allow with or without external appendage | |
struct END_POINT { | |
static let ACTIVITIES = "/external/activities" | |
static let GET_TRIP_DETAILS = "/external/trips/get_trip_details" | |
static let CHECK_SESSION = "/external/passengers/check_session" | |
static let TRIPS_GET_HISTORY = "/external/trips/get_history" | |
static let LOGOUT = "/external/users/logout" | |
static let LOGIN = "/external/passengers/login" | |
static let REVERSE_GEOCODE = "/external/places/reverse_geocode" | |
static let CARS = "/external/cars" | |
static let BLING = "/external/cars/bling" | |
static let GET_CARDS = "/external/cards/get_cards" | |
static let GET_LOCAL_SUPPLIERS = "/external/passengers/get_local_suppliers" | |
static let VERIFY_EMAIL = "/external/passengers/verify_email" | |
static let CLIENT_CONFIG = "/external/client/configuration" | |
static let CANCEL_TRIP = "/external/trips/cancel_trip" | |
static let BOOK_TRIPS = "/external/trips" | |
static let THREAT_MATRIX = "/external/fraud/threatmetrix" | |
} | |
@objc class HTTPStub: NSObject { | |
static var enableRandomTimeouts = false | |
static var enableFailedTrips = false | |
static var enableNoRidesAvailableSimulation = false | |
static var isAuthenticated = true | |
static let enableHttpStubbing = HTTPStub() | |
override init() { | |
HTTPStub.stubHTTP() // N.B. when enabling do a clean | |
} | |
class func randomCarDetails() -> OHHTTPStubsResponse { | |
let CONTENT_TYPE = "Content-Type" | |
let APPLICATION_JSON = "application/json" | |
let header = [CONTENT_TYPE: APPLICATION_JSON] | |
let random = Int(arc4random_uniform(5)) | |
if (random == 0) { | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("cars.json", self)!, | |
statusCode:200, headers:header) | |
} | |
if (random == 1) { | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("cars.json", self)!, | |
statusCode:204, headers:header) // no cars available | |
} | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("cars.json", self)!, statusCode:200, headers:header) | |
} | |
class func stubHTTP() { | |
let CONTENT_TYPE = "Content-Type" | |
let APPLICATION_JSON = "application/json" | |
let header = [CONTENT_TYPE: APPLICATION_JSON] | |
let host = NetworkingConfigurationProvider.currentNetworkingConfiguration().KarhooAPIBaseURL | |
// TODO - handle /external with or without | |
OHHTTPStubs.setEnabled(true) | |
OHHTTPStubs.onStubActivation { (request: NSURLRequest, stub: OHHTTPStubsDescriptor, response: OHHTTPStubsResponse) in | |
print("[OHHTTPStubs] Request to \(request.URL!) has been stubbed") | |
} | |
OHHTTPStubs.removeAllStubs() | |
if let karhooHost = NSURL(string:host)?.host { | |
stub(isHost(karhooHost)) { request in | |
print("url:", request.URL!.path!) | |
// Sprinkle random time outs | |
if (HTTPStub.enableRandomTimeouts) { | |
let random = Int(arc4random_uniform(20)) | |
if (random == 1) { | |
let notConnectedError = NSError(domain:NSURLErrorDomain, code:Int(CFNetworkErrors.CFURLErrorNotConnectedToInternet.rawValue), userInfo:nil) | |
return OHHTTPStubsResponse(error:notConnectedError) | |
} | |
if (random == 2) { | |
let timeOutError = NSError(domain:NSURLErrorDomain, code:Int(CFNetworkErrors.CFURLErrorTimedOut.rawValue), userInfo:nil) | |
return OHHTTPStubsResponse(error:timeOutError) | |
} | |
if (random == 3) { | |
let timeOutError = NSError(domain:NSURLErrorDomain, code:Int(HTTP_CODE_TIMEOUT.rawValue), userInfo:nil) | |
return OHHTTPStubsResponse(error:timeOutError) | |
} | |
} | |
switch request.URL!.path! { | |
case END_POINT.THREAT_MATRIX: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("trips.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.BOOK_TRIPS: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("trips.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.CANCEL_TRIP: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("cancel_trip_failed.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.CLIENT_CONFIG: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("configuration.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.VERIFY_EMAIL: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("verify_email_failed.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.ACTIVITIES: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("activities.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.GET_CARDS: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("get_cards.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.GET_TRIP_DETAILS: | |
if(HTTPStub.enableFailedTrips) { | |
return OHHTTPStubsResponse(error:KHAPIError.ErrorGettingTrip) | |
} else { | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("get_trip_details.json", self)!, statusCode:200, headers:header) | |
} | |
case END_POINT.CARS: | |
if (HTTPStub.enableNoRidesAvailableSimulation) { | |
return self.randomCarDetails() | |
} else { | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("cars.json", self)!, | |
statusCode:200, headers:header) | |
} | |
case END_POINT.CHECK_SESSION: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("check_session.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.TRIPS_GET_HISTORY: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("get_history.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.LOGOUT: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("logout.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.LOGIN: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("login.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.REVERSE_GEOCODE: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("reverse_geocode.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.BLING: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("bling.json", self)!, | |
statusCode:200, headers:header) | |
case END_POINT.GET_LOCAL_SUPPLIERS: | |
return OHHTTPStubsResponse(fileAtPath: OHPathForFile("get_local_suppliers.json", self)!, | |
statusCode:200, headers:header) | |
default: | |
print("WARNING - couldn't find stub.... url", request.URL!.path!) | |
let response = OHHTTPStubsResponse(fileAtPath: OHPathForFile("logout.json", self)!, | |
statusCode:200, headers:header) | |
return response | |
} | |
} | |
} | |
if(HTTPStub.isAuthenticated) { | |
// this is stubbed too | |
SessionManager.sharedInstance.login("[email protected]", password: "test", success: {(user: User?) in | |
print("INFO: forcing user login:", user) | |
}, failure: {(error: NSError?) in | |
print("error: ", error) | |
}) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment