Skip to content

Instantly share code, notes, and snippets.

@wwe-johndpope
Created March 9, 2017 14:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wwe-johndpope/573b52bfa6d7dae377f6c222b6db91f0 to your computer and use it in GitHub Desktop.
Save wwe-johndpope/573b52bfa6d7dae377f6c222b6db91f0 to your computer and use it in GitHub Desktop.
Sample stubbing of mock data from json
//
// 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("test@karhoo.com", 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