Skip to content

Commit

Permalink
Fix .globals to remove falsy values (#3737)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
plroebuck committed Feb 17, 2019
1 parent 56dc28e commit 82307fb
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 96 deletions.
4 changes: 3 additions & 1 deletion lib/mocha.js
Expand Up @@ -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;
};

Expand Down
242 changes: 147 additions & 95 deletions test/unit/mocha.spec.js
Expand Up @@ -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() {
Expand Down Expand Up @@ -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();
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
});
});
});

0 comments on commit 82307fb

Please sign in to comment.