Support for delaying responses a random amount within a specified range

This commit is contained in:
Bryce Gibson
2014-03-24 16:07:43 +11:00
parent 613fe30783
commit 0c66c02e8f
2 changed files with 68 additions and 1 deletions

View File

@@ -2,6 +2,7 @@ var express = require('express');
var path = require('path');
var FluentInterface = require('./fluent');
var corsMiddleware = require('./cors');
var _toString = Object.prototype.toString;
function createInvalidDataException(data) {
return new Error('You have to provide a JSON object with the following structure: \n' + JSON.stringify({ request : { method : '[GET|PUT|POST|DELETE]', url : '(relative URL e.g. /hello)' }, response : { code : '(HTTP Response code e.g. 200/400/500)', body : '(a JSON object)' } }, null, 4) + ' but you provided: \n' + JSON.stringify(data, null, 4));
@@ -63,6 +64,20 @@ function Interfake(o) {
app.routes[request.method][i][property] = value;
}
function determineDelay(delayInput) {
var result = 0, range, upper, lower;
if(_toString.call(delayInput) === '[object Number]') {
result = delayInput;
} else if(_toString.call(delayInput) === '[object String]') {
range = /([0-9]+)..([0-9]+)/.exec(delayInput);
upper = +range[2];
lower = +range[1];
result = Math.floor( Math.random() * (upper - lower + 1) + lower );
}
return result;
}
function createRoute(data) {
var specifiedRequest, specifiedResponse, afterSpecifiedResponse;
if (!data.request || !data.request.method || !data.request.url || !data.response || !data.response.code) {
@@ -85,9 +100,10 @@ function Interfake(o) {
app[specifiedRequest.method](specifiedRequest.url, function (req, res) {
var specifiedResponse = req.route.responseData;
var afterSpecifiedResponse = req.route.afterResponseData;
var responseDelay = specifiedResponse.delay || 0;
var responseDelay = determineDelay(specifiedResponse.delay);
debug(req.method, 'request to', req.url, 'returning', specifiedResponse.code);
debug(req.method, 'request to', req.url, 'will be delayed by', responseDelay, 'millis');
// debug('After response is', afterSpecifiedResponse);
var responseBody = specifiedResponse.body;

View File

@@ -283,6 +283,38 @@ describe('Interfake JavaScript API', function () {
done();
});
});
it('should create one GET endpoint with support for delaying the response with a delay range', function (done) {
var interfake = new Interfake();
var enoughTimeHasPassed = false;
var _this = this;
this.slow(500)
interfake.createRoute({
request: {
url: '/test',
method: 'get'
},
response: {
code: 200,
delay: "20..50",
body: {
hi: 'there'
}
}
});
interfake.listen(3000);
timer = setTimeout(function() {
enoughTimeHasPassed = true;
}, 20)
request({ url : 'http://localhost:3000/test', json : true }, function (error, response, body) {
assert.equal(response.statusCode, 200);
assert.equal(body.hi, 'there');
interfake.stop();
if(!enoughTimeHasPassed) {
throw new Error('Response wasn\'t delay for long enough');
}
done();
});
});
});
// Testing the fluent interface
@@ -480,6 +512,25 @@ describe('Interfake JavaScript API', function () {
enoughTimeHasPassed = true;
}, 50)
request.post({ url : 'http://localhost:3000/fluent', json : true }, function (error, response, body) {
interfake.stop();
if(!enoughTimeHasPassed) {
throw new Error('Response wasn\'t delay for long enough');
}
done();
});
});
it('should create one POST endpoint with a delay range', function (done) {
var interfake = new Interfake();
var enoughTimeHasPassed = false;
var _this = this;
this.slow(500)
interfake.post('/fluent').delay("20..50");
interfake.listen(3000);
setTimeout(function() {
enoughTimeHasPassed = true;
}, 20)
request.post({ url : 'http://localhost:3000/fluent', json : true }, function (error, response, body) {
interfake.stop();
if(!enoughTimeHasPassed) {