UNPKG

mountebank-test

Version:

Over the wire test doubles

110 lines (90 loc) 3.35 kB
'use strict'; 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 };