mountebank-test
Version:
Over the wire test doubles
63 lines (52 loc) • 1.81 kB
JavaScript
;
var helpers = require('../util/helpers'),
errors = require('../util/errors'),
Q = require('q');
function wait (responsePromise, milliseconds) {
return responsePromise.delay(milliseconds);
}
function decorate (originalRequest, responsePromise, fn, logger) {
return responsePromise.then(function (response) {
/* jshint evil: true */
var request = helpers.clone(originalRequest),
injected = '(' + fn + ')(request, response, logger);';
if (request.isDryRun === true) {
return response;
}
try {
// Support functions that mutate response in place and those
// that return a new response
var result = eval(injected);
if (!result) {
result = response;
}
return Q(result);
}
catch (error) {
logger.error('injection X=> ' + error);
logger.error(' full source: ' + JSON.stringify(injected));
logger.error(' request: ' + JSON.stringify(request));
logger.error(' response: ' + JSON.stringify(response));
return Q.reject(errors.InjectionError('invalid decorator injection', { source: injected, data: error.message }));
}
});
}
function execute (request, response, behaviors, logger) {
var result = Q(response);
if (!behaviors) {
return result;
}
logger.debug('using stub response behavior ' + JSON.stringify(behaviors));
if (behaviors.wait) {
result = wait(result, behaviors.wait);
}
if (behaviors.decorate) {
result = decorate(request, result, behaviors.decorate, logger);
}
return result;
}
module.exports = {
wait: wait,
decorate: decorate,
execute: execute
};