UNPKG

mocha-bamboo-spec-reporter

Version:

A mocha reporter to allow Atlassian Bamboo to parse results

97 lines (83 loc) 2.2 kB
var Base = require('mocha').reporters.Base , Spec = require('mocha').reporters.Spec , path = require('path') , fs = require('fs') , mkdirp = require('mkdirp') , inherits = require('util').inherits , filename = process.env.MOCHA_FILE || 'mocha.json'; inherits(BambooJSONReporter, Base); exports = module.exports = BambooJSONReporter; /** * Initialize a new `JSON` reporter. * * @param {Runner} runner * @param {Object} options * @api public */ function BambooJSONReporter(runner, options) { var self = this; if (options && options.reporterOptions && options.reporterOptions.spec) { Spec.call(this, runner); } else { Base.call(this, runner); } var tests = [] , failures = [] , passes = [] , skipped = []; if (options && options.reporterOptions && options.reporterOptions.output) { filename = options.reporterOptions.output; } runner.on('test end', function(test){ tests.push(test); }); runner.on('pending', function(test) { skipped.push(test); }); runner.on('pass', function(test){ passes.push(test); }); runner.on('fail', function(test){ failures.push(test); }); runner.on('end', function(){ var obj = { stats: self.stats , failures: failures.map(clean) , passes: passes.map(clean) , skipped: skipped.map(clean) }; mkdirp.sync(path.dirname(path.resolve(process.cwd(), filename))); fs.writeFileSync(filename, JSON.stringify(obj, null, 2), 'utf-8'); }); runner.on('start', function() { if (fs.existsSync(filename)) { fs.unlinkSync(filename); // if we die at some point, we don't want bamboo to have a stale results file lying around... } }); } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @param {Object} test * @return {Object} * @api private */ function clean(test) { var o = { title: test.title , fullTitle: test.fullTitle() , duration: test.duration }; if (test.hasOwnProperty("err")) { if (test.err.stack) { o.error = test.err.stack.toString(); } else if (test.err.message) { o.error = test.err.message; } } return o; }