Skip to content

Commit

Permalink
#1577 Add "--exclude" Option (#3210)
Browse files Browse the repository at this point in the history
* Add --exclude as option.

* Add tests for --exclude option.

* Implement --exclude.

* Update --exclude description.

* Remove old exclude fixture.

* Add new exclude fixture.

* Fix tests for --exclude option.

* Add name to package.contributors.

* Filter new files before they're added.

* Allow multiple --exclude flags rather than using a comma-delimited list.

* Use .fixture extension for exclude fixtures.

* Use runMochaJSON (run) instead of of directInvoke.
  • Loading branch information
metalex9 authored and boneskull committed Apr 1, 2018
1 parent ffd760e commit 8e740c5
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 1 deletion.
11 changes: 10 additions & 1 deletion bin/_mocha
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
const program = require('commander');
const path = require('path');
const fs = require('fs');
const minimatch = require('minimatch');
const resolve = path.resolve;
const exists = fs.existsSync;
const Mocha = require('../');
Expand Down Expand Up @@ -205,7 +206,8 @@ program
.option('--allow-uncaught', 'enable uncaught errors to propagate')
.option('--forbid-only', 'causes test marked with only to fail the suite')
.option('--forbid-pending', 'causes pending tests and test marked with skip to fail the suite')
.option('--file <file>', 'include a file to be ran during the suite', collect, []);
.option('--file <file>', 'include a file to be ran during the suite', collect, [])
.option('--exclude <file>', 'a file or glob pattern to ignore', collect, []);

This comment has been minimized.

Copy link
@catamphetamine

catamphetamine Apr 1, 2018

@metalex9 Wow, cool bro.


program._name = 'mocha';

Expand Down Expand Up @@ -494,6 +496,13 @@ args.forEach(arg => {
throw err;
}

if (typeof newFiles !== 'undefined') {
if (typeof newFiles === 'string') {
newFiles = [newFiles];
}
newFiles = newFiles.filter(fileName => program.exclude.every(pattern => !minimatch(fileName, pattern)));
}

files = files.concat(newFiles);
});

Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"Adrian Ludwig (https://github.com/adrian-ludwig)",
"Ainthe Kitchen <a.in.the.k@gmail.com> (https://github.com/ainthek)",
"ajaykodali (https://github.com/ajaykodali)",
"Alex Bainter <alexbainter+github@gmail.com> (https://github.com/metalex9)",
"Alex Early (https://github.com/aearly)",
"Alex Pham <thedark1337@thedark1337.com> (https://github.com/thedark1337)",
"amsul (https://github.com/amsul)",
Expand Down Expand Up @@ -314,6 +315,7 @@
"glob": "7.1.2",
"growl": "1.10.3",
"he": "1.1.1",
"minimatch": "^3.0.4",
"mkdirp": "0.5.1",
"supports-color": "4.4.0"
},
Expand Down
7 changes: 7 additions & 0 deletions test/integration/fixtures/options/exclude/fail.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';

describe('exclude test fail', function () {
it('should not run this test', function () {
throw new Error('should not run');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';

describe('exclude test nested fail', function () {
it('should not run this test', function () {
throw new Error('should not run');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

describe('exclude test nested pass', function () {
it('should find this test', function () {});
});
5 changes: 5 additions & 0 deletions test/integration/fixtures/options/exclude/pass.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

describe('exclude test pass', function () {
it('should find this test', function () {});
});
53 changes: 53 additions & 0 deletions test/integration/options.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -450,4 +450,57 @@ describe('options', function () {
}, path.join(__dirname, 'fixtures', 'options', 'help'));
});
});

describe('--exclude', function () {
/*
* Runs mocha in {path} with the given args.
* Calls handleResult with the result.
*/
function runMochaTest (fixture, args, handleResult, done) {
run(fixture, args, function (err, res) {
if (err) {
done(err);
return;
}
handleResult(res);
done();
});
}

it('should exclude specific files', function (done) {
runMochaTest('options/exclude/*.fixture.js', [
'--exclude',
'test/integration/fixtures/options/exclude/fail.fixture.js'
], function (res) {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 1);
assert.equal(res.stats.failures, 0);
assert.equal(res.passes[0].title, 'should find this test');
assert.equal(res.code, 0);
}, done);
});

it('should exclude globbed files', function (done) {
runMochaTest('options/exclude/**/*.fixture.js', ['--exclude', '**/fail.fixture.js'], function (res) {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 2);
assert.equal(res.stats.failures, 0);
assert.equal(res.code, 0);
}, done);
});

it('should exclude multiple patterns', function (done) {
runMochaTest('options/exclude/**/*.fixture.js', [
'--exclude',
'test/integration/fixtures/options/exclude/fail.fixture.js',
'--exclude',
'test/integration/fixtures/options/exclude/nested/fail.fixture.js'
], function (res) {
assert.equal(res.stats.pending, 0);
assert.equal(res.stats.passes, 2);
assert.equal(res.stats.failures, 0);
assert.equal(res.code, 0);
}, done);
});
});
});

0 comments on commit 8e740c5

Please sign in to comment.