From 82307fbf9bfa7cd72042facd1d42fb108257100c Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Sat, 16 Feb 2019 22:21:01 -0600 Subject: [PATCH] Fix `.globals` to remove falsy values (#3737) * Removed falsy values from `.globals` using filter for "undefined"/empty string values. * Added tests for `.globals` * Reordered "mocha.spec.js" option tests lexically * Changed `describe` titles from `.method` to `#method` for Mocha prototypes. * Renamed suite title 'error handling' as '#reporter()' * Reparented '#reporter("xunit")#run(fn)' test suite inside '#run()' test suite. --- lib/mocha.js | 4 +- test/unit/mocha.spec.js | 242 ++++++++++++++++++++++++---------------- 2 files changed, 150 insertions(+), 96 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index 9707f4c66d..2b2dc13341 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -543,7 +543,9 @@ Mocha.prototype._growl = growl.notify; * mocha.globals(['jQuery', 'MyLib']); */ Mocha.prototype.globals = function(globals) { - this.options.globals = (this.options.globals || []).concat(globals); + this.options.globals = (this.options.globals || []) + .concat(globals) + .filter(Boolean); return this; }; diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index 73c74f6b8b..e9065c03e8 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -5,7 +5,7 @@ var Mocha = require('../../lib/mocha'); var sinon = require('sinon'); describe('Mocha', function() { - var opts = {reporter: function() {}}; // no output + var opts = {reporter: utils.noop}; // no output var sandbox; beforeEach(function() { @@ -41,88 +41,59 @@ describe('Mocha', function() { }); }); - describe('.run(fn)', function() { - it('should not raise errors if callback was not provided', function() { - sandbox.stub(Mocha.Runner.prototype, 'run'); + describe('#allowUncaught()', function() { + it('should set the allowUncaught option to true', function() { var mocha = new Mocha(opts); - expect(function() { - mocha.run(); - }, 'not to throw'); + mocha.allowUncaught(); + expect(mocha.options, 'to have property', 'allowUncaught', true); }); - it('should execute the callback when complete', function(done) { + it('should be chainable', function() { var mocha = new Mocha(opts); - sandbox.stub(Mocha.Runner.prototype, 'run').callsArg(0); - mocha.run(done); - }); - }); - - describe('.reporter("xunit").run(fn)', function() { - it('should not raise errors if callback was not provided', function() { - var mocha = new Mocha(); - expect(function() { - try { - mocha.reporter('xunit').run(); - } catch (e) { - console.log(e); - expect.fail(e.message); - } - }, 'not to throw'); + expect(mocha.allowUncaught(), 'to be', mocha); }); }); - describe('.invert()', function() { - it('should set the invert option to true', function() { + describe('#bail()', function() { + it('should set the suite._bail to true if there is no arguments', function() { var mocha = new Mocha(opts); - mocha.invert(); - expect(mocha.options, 'to have property', 'invert', true); + mocha.bail(); + expect(mocha.suite._bail, 'to be', true); }); it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.invert(), 'to be', mocha); + expect(mocha.bail(), 'to be', mocha); }); }); - describe('.ignoreLeaks()', function() { - it('should set the ignoreLeaks option to true when param equals true', function() { - var mocha = new Mocha(opts); - mocha.ignoreLeaks(true); - expect(mocha.options, 'to have property', 'ignoreLeaks', true); - }); - - it('should set the ignoreLeaks option to false when param equals false', function() { - var mocha = new Mocha(opts); - mocha.ignoreLeaks(false); - expect(mocha.options, 'to have property', 'ignoreLeaks', false); - }); - - it('should set the ignoreLeaks option to false when the param is undefined', function() { + describe('#checkLeaks()', function() { + it('should set the ignoreLeaks option to false', function() { var mocha = new Mocha(opts); - mocha.ignoreLeaks(); + mocha.checkLeaks(); expect(mocha.options, 'to have property', 'ignoreLeaks', false); }); it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.ignoreLeaks(), 'to be', mocha); + expect(mocha.checkLeaks(), 'to be', mocha); }); }); - describe('.checkLeaks()', function() { - it('should set the ignoreLeaks option to false', function() { + describe('#delay()', function() { + it('should set the delay option to true', function() { var mocha = new Mocha(opts); - mocha.checkLeaks(); - expect(mocha.options, 'to have property', 'ignoreLeaks', false); + mocha.delay(); + expect(mocha.options, 'to have property', 'delay', true); }); it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.checkLeaks(), 'to be', mocha); + expect(mocha.delay(), 'to be', mocha); }); }); - describe('.fullTrace()', function() { + describe('#fullTrace()', function() { it('should set the fullStackTrace option to true', function() { var mocha = new Mocha(opts); mocha.fullTrace(); @@ -135,7 +106,53 @@ describe('Mocha', function() { }); }); - describe('.growl()', function() { + describe('#globals()', function() { + it('should be an empty array initially', function() { + var mocha = new Mocha(); + expect(mocha.options.globals, 'to be empty'); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.globals(), 'to be', mocha); + }); + + describe('when argument is invalid', function() { + it('should not modify the whitelist when given empty string', function() { + var mocha = new Mocha(opts); + mocha.globals(''); + expect(mocha.options.globals, 'to be empty'); + }); + + it('should not modify the whitelist when given empty array', function() { + var mocha = new Mocha(opts); + mocha.globals([]); + expect(mocha.options.globals, 'to be empty'); + }); + }); + + describe('when argument is valid', function() { + var elem = 'foo'; + var elem2 = 'bar'; + + it('should add string to the whitelist', function() { + var mocha = new Mocha(opts); + mocha.globals(elem); + expect(mocha.options.globals, 'to contain', elem); + expect(mocha.options.globals, 'to have length', 1); + }); + + it('should add contents of string array to the whitelist', function() { + var mocha = new Mocha(opts); + var elems = [elem, elem2]; + mocha.globals(elems); + expect(mocha.options.globals, 'to contain', elem, elem2); + expect(mocha.options.globals, 'to have length', elems.length); + }); + }); + }); + + describe('#growl()', function() { describe('if capable of notifications', function() { it('should set the growl option to true', function() { var mocha = new Mocha(opts); @@ -164,32 +181,45 @@ describe('Mocha', function() { }); }); - describe('.useInlineDiffs()', function() { - it('should set the useInlineDiffs option to true when param equals true', function() { + describe('#ignoreLeaks()', function() { + it('should set the ignoreLeaks option to true when param equals true', function() { var mocha = new Mocha(opts); - mocha.useInlineDiffs(true); - expect(mocha.options, 'to have property', 'useInlineDiffs', true); + mocha.ignoreLeaks(true); + expect(mocha.options, 'to have property', 'ignoreLeaks', true); }); - it('should set the useInlineDiffs option to false when param equals false', function() { + it('should set the ignoreLeaks option to false when param equals false', function() { var mocha = new Mocha(opts); - mocha.useInlineDiffs(false); - expect(mocha.options, 'to have property', 'useInlineDiffs', false); + mocha.ignoreLeaks(false); + expect(mocha.options, 'to have property', 'ignoreLeaks', false); }); - it('should set the useInlineDiffs option to false when the param is undefined', function() { + it('should set the ignoreLeaks option to false when the param is undefined', function() { var mocha = new Mocha(opts); - mocha.useInlineDiffs(); - expect(mocha.options, 'to have property', 'useInlineDiffs', false); + mocha.ignoreLeaks(); + expect(mocha.options, 'to have property', 'ignoreLeaks', false); }); it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.useInlineDiffs(), 'to be', mocha); + expect(mocha.ignoreLeaks(), 'to be', mocha); + }); + }); + + describe('#invert()', function() { + it('should set the invert option to true', function() { + var mocha = new Mocha(opts); + mocha.invert(); + expect(mocha.options, 'to have property', 'invert', true); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.invert(), 'to be', mocha); }); }); - describe('.noHighlighting()', function() { + describe('#noHighlighting()', function() { // :NOTE: Browser-only option... it('should set the noHighlighting option to true', function() { var mocha = new Mocha(opts); @@ -203,57 +233,79 @@ describe('Mocha', function() { }); }); - describe('.allowUncaught()', function() { - it('should set the allowUncaught option to true', function() { - var mocha = new Mocha(opts); - mocha.allowUncaught(); - expect(mocha.options, 'to have property', 'allowUncaught', true); + describe('#reporter()', function() { + it('should throw reporter error if an invalid reporter is given', function() { + var updatedOpts = {reporter: 'invalidReporter', reporterOptions: {}}; + var throwError = function() { + // eslint-disable-next-line no-new + new Mocha(updatedOpts); + }; + expect(throwError, 'to throw', { + message: "invalid reporter 'invalidReporter'", + code: 'ERR_MOCHA_INVALID_REPORTER', + reporter: 'invalidReporter' + }); }); it('should be chainable', function() { var mocha = new Mocha(opts); - expect(mocha.allowUncaught(), 'to be', mocha); + expect(mocha.reporter(), 'to be', mocha); }); }); - describe('.delay()', function() { - it('should set the delay option to true', function() { + describe('#run(fn)', function() { + it('should execute the callback when complete', function(done) { var mocha = new Mocha(opts); - mocha.delay(); - expect(mocha.options, 'to have property', 'delay', true); + sandbox.stub(Mocha.Runner.prototype, 'run').callsArg(0); + mocha.run(done); }); - it('should be chainable', function() { + it('should not raise errors if callback was not provided', function() { + sandbox.stub(Mocha.Runner.prototype, 'run'); var mocha = new Mocha(opts); - expect(mocha.delay(), 'to be', mocha); + expect(function() { + mocha.run(); + }, 'not to throw'); + }); + + describe('#reporter("xunit")#run(fn)', function() { + // :TBD: Why does specifying reporter differentiate this test from preceding one + it('should not raise errors if callback was not provided', function() { + var mocha = new Mocha(); + expect(function() { + try { + mocha.reporter('xunit').run(); + } catch (e) { + console.log(e); + expect.fail(e.message); + } + }, 'not to throw'); + }); }); }); - describe('.bail()', function() { - it('should set the suite._bail to true if there is no arguments', function() { + describe('#useInlineDiffs()', function() { + it('should set the useInlineDiffs option to true when param equals true', function() { var mocha = new Mocha(opts); - mocha.bail(); - expect(mocha.suite._bail, 'to be', true); + mocha.useInlineDiffs(true); + expect(mocha.options, 'to have property', 'useInlineDiffs', true); }); - it('should be chainable', function() { + it('should set the useInlineDiffs option to false when param equals false', function() { var mocha = new Mocha(opts); - expect(mocha.bail(), 'to be', mocha); + mocha.useInlineDiffs(false); + expect(mocha.options, 'to have property', 'useInlineDiffs', false); }); - }); - describe('error handling', function() { - it('should throw reporter error if an invalid reporter is given', function() { - var updatedOpts = {reporter: 'invalidReporter', reporterOptions: {}}; - var throwError = function() { - // eslint-disable-next-line no-new - new Mocha(updatedOpts); - }; - expect(throwError, 'to throw', { - message: "invalid reporter 'invalidReporter'", - code: 'ERR_MOCHA_INVALID_REPORTER', - reporter: 'invalidReporter' - }); + it('should set the useInlineDiffs option to false when the param is undefined', function() { + var mocha = new Mocha(opts); + mocha.useInlineDiffs(); + expect(mocha.options, 'to have property', 'useInlineDiffs', false); + }); + + it('should be chainable', function() { + var mocha = new Mocha(opts); + expect(mocha.useInlineDiffs(), 'to be', mocha); }); }); });