mountebank-test
Version:
Over the wire test doubles
110 lines (90 loc) • 3.35 kB
JavaScript
;
var Q = require('q'),
Domain = require('domain'),
errors = require('../util/errors'),
helpers = require('../util/helpers');
function createErrorHandler (deferred) {
return function errorHandler (error) {
if (error.errno === 'EADDRINUSE') {
deferred.reject(errors.ResourceConflictError('The port is already in use'));
}
else if (error.errno === 'EACCES') {
deferred.reject(errors.InsufficientAccessError());
}
else {
deferred.reject(error);
}
};
}
function create (Protocol, request) {
var deferred = Q.defer(),
domain = Domain.create(),
errorHandler = createErrorHandler(deferred);
domain.on('error', errorHandler);
domain.run(function () {
Protocol.create(request).done(function (server) {
var url = '/imposters/' + server.port;
if (request.stubs) {
request.stubs.forEach(server.addStub);
}
function addDetailsTo (result) {
Object.keys(server.metadata).forEach(function (key) {
result[key] = server.metadata[key];
});
result.requests = server.requests;
result.stubs = helpers.clone(server.stubs);
}
function removeNonEssentialInformationFrom (result) {
result.stubs.forEach(function (stub) {
if (stub.matches) {
delete stub.matches;
}
});
delete result.requests;
delete result._links;
}
function removeProxiesFrom (result) {
result.stubs.forEach(function (stub) {
stub.responses = stub.responses.filter(function (response) {
return !response.hasOwnProperty('proxy');
});
});
result.stubs = result.stubs.filter(function (stub) {
return stub.responses.length > 0;
});
}
function toJSON (options) {
// I consider the order of fields represented important. They won't matter for parsing,
// but it makes a nicer user experience for developers viewing the JSON to keep the most
// relevant information at the top
var result = {
protocol: Protocol.name,
port: server.port
};
options = options || {};
if (!options.list) {
addDetailsTo(result);
}
result._links = {self: {href: url}};
if (options.replayable) {
removeNonEssentialInformationFrom(result);
}
if (options.removeProxies) {
removeProxiesFrom(result);
}
return result;
}
deferred.resolve({
port: server.port,
url: url,
toJSON: toJSON,
addStub: server.addStub,
stop: server.close
});
});
});
return deferred.promise;
}
module.exports = {
create: create
};