mountebank-test
Version:
Over the wire test doubles
153 lines (138 loc) • 6.01 kB
JavaScript
'use strict';
var express = require('express'),
cors = require('cors'),
errorHandler = require('errorhandler'),
path = require('path'),
fs = require('fs'),
middleware = require('./util/middleware'),
HomeController = require('./controllers/homeController'),
ImpostersController = require('./controllers/impostersController'),
ImposterController = require('./controllers/imposterController'),
LogsController = require('./controllers/logsController'),
ConfigController = require('./controllers/configController'),
FeedController = require('./controllers/feedController'),
Imposter = require('./models/imposter'),
winston = require('winston'),
thisPackage = require('../package.json'),
releases = require('../releases.json'),
ScopedLogger = require('./util/scopedLogger'),
util = require('util');
function initializeLogfile (filename) {
// Ensure new logfile on startup so the /logs only shows for this process
var extension = path.extname(filename),
pattern = new RegExp(extension + '$'),
newFilename = filename.replace(pattern, '1' + extension);
if (fs.existsSync(filename)) {
fs.renameSync(filename, newFilename);
}
}
function create (options) {
var app = express(),
imposters = {},
protocols = {
tcp: require('./models/tcp/tcpServer').initialize(options.allowInjection, options.mock, options.debug),
http: require('./models/http/httpServer').initialize(options.allowInjection, options.mock, options.debug),
https: require('./models/https/httpsServer').initialize(options.allowInjection, options.mock, options.debug),
soap: require('./models/soap/soapServer').initialize(options.allowInjection, options.mock, options.debug),
smtp: require('./models/smtp/smtpServer').initialize(options.mock, options.debug),
foo: require('./models/foo/fooServer').initialize(options.allowInjection, options.mock, options.debug)
},
logger = ScopedLogger.create(winston, util.format('[mb:%s] ', options.port)),
homeController = HomeController.create(releases),
impostersController = ImpostersController.create(protocols, imposters, Imposter, logger),
imposterController = ImposterController.create(imposters),
logsController = LogsController.create(options.logfile),
configController = ConfigController.create(thisPackage.version, options),
feedController = FeedController.create(releases, options),
validateImposterExists = middleware.createImposterValidator(imposters),
welcome = util.format('mountebank v%s (node %s) now taking orders - point your browser to http://localhost:%s for help',
thisPackage.version, process.version, options.port);
logger.remove(logger.transports.Console);
if (process.stdout.isTTY) {
logger.add(logger.transports.Console, { colorize: true, level: options.loglevel });
}
initializeLogfile (options.logfile);
logger.add(logger.transports.File, {
filename: options.logfile,
timestamp: true,
level: options.loglevel,
maxsize: 10000000,
maxFiles: 1
});
app.use(middleware.useAbsoluteUrls(options.port));
app.use(middleware.logger(logger, ':method :url'));
app.use(middleware.globals({ heroku: options.heroku, port: options.port, version: thisPackage.version }));
app.use(middleware.defaultIEtoHTML);
app.use(middleware.json(logger));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, '../node_modules')));
app.use(errorHandler());
if(options.allowCORS) {
app.use(cors());
}
app.disable('etag');
app.disable('x-powered-by');
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.set('json spaces', 2);
app.get('/', homeController.get);
app.get('/imposters', impostersController.get);
app.post('/imposters', impostersController.post);
app.delete('/imposters', impostersController.del);
app.put('/imposters', impostersController.put);
app.get('/imposters/:id', validateImposterExists, imposterController.get);
app.delete('/imposters/:id', imposterController.del);
app.get('/logs', logsController.get);
app.get('/config', configController.get);
app.get('/feed', feedController.getFeed);
app.get('/releases', feedController.getReleases);
app.get('/releases/:version', feedController.getRelease);
app.get('/sitemap', function (request, response) {
response.type('text/plain');
response.render('sitemap', { releases: releases });
});
[
'/support',
'/contributing',
'/license',
'/faqs',
'/thoughtworks',
'/docs/examples',
'/docs/gettingStarted',
'/docs/install',
'/docs/glossary',
'/docs/commandLine',
'/docs/clientLibraries',
'/docs/api/overview',
'/docs/api/contracts',
'/docs/api/mocks',
'/docs/api/stubs',
'/docs/api/predicates',
'/docs/api/xpath',
'/docs/api/proxies',
'/docs/api/injection',
'/docs/api/behaviors',
'/docs/api/errors',
'/docs/protocols/http',
'/docs/protocols/https',
'/docs/protocols/tcp',
'/docs/protocols/smtp'
].forEach(function (endpoint) {
app.get(endpoint, function (request, response) {
response.render(endpoint.substring(1));
});
});
app.listen(options.port);
logger.info(welcome);
if (!process.stdout.isTTY) {
// needed for a number of functional tests (e.g. httpInjectionTest.js)
// that need to wait for a new mb process to start without a TTY
console.log(welcome);
}
return {
close: function () { logger.info('Adios - see you soon?'); }
};
}
module.exports = {
create: create
};