shunter
Version:
A Node.js application built to read JSON and translate it into HTML
158 lines (136 loc) • 5.36 kB
JavaScript
;
// to run just these tests:
// ./node_modules/.bin/mocha --opts ./tests/mocha.opts ./tests/server/core/logging.js
var assert = require('proclaim');
var winston = require('winston');
var Syslog = require('winston-syslog').Syslog;
var defaultConfig = require('../../../lib/config')('development', {}, {});
Object.freeze(defaultConfig);
describe('Logging config,', function () {
var systemUnderTest = require('../../../lib/logging');
var testConfig;
function getTransport(logger, type) {
return logger.transports.find(function (element) {
return element instanceof type;
});
}
beforeEach(function () {
testConfig = {
argv: {
syslog: true,
logging: 'info'
},
env: {
host: function () {
return 'some.host.name';
}
},
log: require('../mocks/log'),
path: {
root: '/location-of-userland-files',
shunterRoot: './'
},
structure: {
logging: 'logging',
loggingTransports: 'transports'
},
syslogAppName: 'foo'
};
});
describe('With default logging config,', function () {
it('Should offer getLogger() in its API', function () {
var loggingInstance = systemUnderTest(defaultConfig);
assert.isFunction(loggingInstance.getLogger);
});
it('Should load the winston console transport by default', function () {
var logger = systemUnderTest(defaultConfig).getLogger();
var thisTransport = getTransport(logger, winston.transports.Console);
assert.isTrue(thisTransport instanceof winston.transports.Console);
});
it('Should not load the winston syslog transport by default', function () {
var logger = systemUnderTest(defaultConfig).getLogger();
var thisTransport = getTransport(logger, Syslog);
assert.isNotObject(thisTransport);
});
});
describe('With an argv log level for console transport provided,', function () {
it('Should respect the provided log level', function () {
testConfig.argv.logging = 'someValueUniqueToThisTest';
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, winston.transports.Console);
assert.strictEqual(thisTransport.level, 'someValueUniqueToThisTest');
});
});
describe('With syslog,', function () {
it('Should load the winston syslog transport if requested', function () {
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, Syslog);
assert.isTrue(thisTransport instanceof Syslog);
});
it('Should ensure the winston syslog level is "debug"', function () {
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, Syslog);
assert.strictEqual(thisTransport.level, 'debug');
});
it('Should not load syslog if !argv.syslog', function () {
delete testConfig.argv.syslog;
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, Syslog);
assert.isNotObject(thisTransport);
});
it('Should not load syslog if !syslogAppName', function () {
delete testConfig.syslogAppName;
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, Syslog);
assert.isNotObject(thisTransport);
});
});
// A user can provide their own completely custom logger instance when the app
// is created. This instance is stored in the config object.
describe('With user-provided logger instance,', function () {
var format = winston.format;
var userLoggerInstance = winston.createLogger({
transports: [
new (winston.transports.Console)({
format: format.combine(
format.colorize(),
format.timestamp()
),
level: 'RUN_AROUND_SCREAMING'
})
]
});
it('First confirms the Console transport level is the default "info"', function () {
var logger = systemUnderTest(testConfig).getLogger();
var thisTransport = getTransport(logger, winston.transports.Console);
assert.strictEqual(thisTransport.level, 'info');
});
it('Can override Console transport level via dynamic logger instance', function () {
var thisConfig = testConfig;
thisConfig.log = userLoggerInstance;
var validatedConfigObject = require('../../../lib/config')(thisConfig.env, thisConfig, {});
var thisTransport = getTransport(validatedConfigObject.log, winston.transports.Console);
assert.strictEqual(thisTransport.level, 'RUN_AROUND_SCREAMING');
});
});
describe('With file-based user-provided logging transports,', function () {
var thisLogger;
beforeEach(function () {
var thisConfig = testConfig;
thisConfig.path.root = './tests/server/mock-data';
// there should be two transport files in that^ dir, and only one should be valid
thisLogger = systemUnderTest(thisConfig).getLogger();
});
it('Can override our default config via provided files', function () {
var thisTransport = getTransport(thisLogger, winston.transports.Console);
assert.strictEqual(thisTransport.level, 'THIS_IS_FINE');
});
it('Should not use user transport files that do not expose a function', function () {
// a basic check for mangled transport files
var thisTransport = getTransport(thisLogger, Syslog);
assert.isNotObject(thisTransport);
// One dropped transport out of two should leave one valid transport
assert.strictEqual(Object.keys(thisLogger.transports).length, 1);
});
});
});