Skip to content

Commit

Permalink
fix(cli): Throw error if unable to parse Mocha options file
Browse files Browse the repository at this point in the history
Code now throws an error for any problems (except nonexistent default "test/mocha.opts"). Includes
tests.

Fixes mochajs#3363 Fixes mochajs#2576
  • Loading branch information
plroebuck committed May 12, 2018
1 parent 668b541 commit 2f91c61
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 12 deletions.
32 changes: 21 additions & 11 deletions bin/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

const fs = require('fs');
const path = require('path');

/**
* Export `getOptions`.
Expand All @@ -24,10 +25,12 @@ function getOptions() {
return;
}

const optsPath =
process.argv.indexOf('--opts') === -1
? 'test/mocha.opts'
: process.argv[process.argv.indexOf('--opts') + 1];
const optsIndex = process.argv.indexOf('--opts');
const optsPathSpecified = optsIndex !== -1;
const defaultOptsPath = path.join('test', 'mocha.opts');
const optsPath = optsPathSpecified
? process.argv[optsIndex + 1]
: defaultOptsPath;

try {
const opts = fs
Expand All @@ -38,12 +41,19 @@ function getOptions() {
.filter(Boolean)
.map(value => value.replace(/%20/g, ' '));

process.argv = process.argv
.slice(0, 2)
.concat(opts.concat(process.argv.slice(2)));
} catch (ignore) {
// NOTE: should console.error() and throw the error
if (opts.length > 0) {
process.argv = process.argv
.slice(0, 2)
.concat(opts.concat(process.argv.slice(2)));
}
} catch (err) {
// Default options file may not exist - rethrow anything else
if (optsPathSpecified || err.code !== 'ENOENT') {
console.error(`failed to load Mocha options file: ${optsPath}`);
throw err;
}
} finally {
// Despite its name, signifies loading was attempted and should not be again
process.env.LOADED_MOCHA_OPTS = '1';
}

process.env.LOADED_MOCHA_OPTS = true;
}
5 changes: 5 additions & 0 deletions test/integration/fixtures/options/opts.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

describe('opts', function () {
it('should display this spec', function () {});
});
2 changes: 1 addition & 1 deletion test/integration/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ function invokeMocha(args, fn, cwd) {
}

function resolveFixturePath(fixture) {
return path.join('./test/integration/fixtures', fixture);
return path.join('test', 'integration', 'fixtures', fixture);
}

function getSummary(res) {
Expand Down
36 changes: 36 additions & 0 deletions test/integration/options.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,42 @@ describe('options', function() {
});
});

describe('--opts', function() {
var testFile = path.join('options', 'opts.fixture.js');

it('works despite nonexistent default options file', function(done) {
args = [];
run(testFile, args, function(err, res) {
if (err) {
return done(err);
}
expect(res, 'to have passed').and('to have passed test count', 1);
return done();
});
});

it('should throw an error due to nonexistent options file', function(done) {
args = ['--opts', 'nosuchoptionsfile', testFile];
directInvoke(
args,
function(err, res) {
if (err) {
return done(err);
}
expect(
res.output,
'to contain',
'failed to load Mocha options file',
'ENOENT:'
);
expect(res.code, 'to be', 1); // failed
return done();
},
path.join(__dirname, 'fixtures')
);
});
});

describe('--exclude', function() {
/*
* Runs mocha in {path} with the given args.
Expand Down

0 comments on commit 2f91c61

Please sign in to comment.