jmd-scripts
Version:
CLI for common scripts for my projects
122 lines (101 loc) • 3.35 kB
JavaScript
;
var _jestInCase = _interopRequireDefault(require("jest-in-case"));
var _serializers = require("./helpers/serializers");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
expect.addSnapshotSerializer(_serializers.unquoteSerializer);
(0, _jestInCase.default)('validate', ({
setup = () => () => {}
}) => {
// beforeEach
const {
sync: crossSpawnSyncMock
} = require('cross-spawn');
const originalExit = process.exit;
process.exit = jest.fn();
process.env.SCRIPTS_PRECOMMIT = 'false';
const teardown = setup();
try {
// tests
crossSpawnSyncMock.mockClear();
require('../validate');
expect(crossSpawnSyncMock).toHaveBeenCalledTimes(1);
const [firstCall] = crossSpawnSyncMock.mock.calls;
const [script, calledArgs] = firstCall;
expect([script, ...calledArgs].join(' ')).toMatchSnapshot();
} catch (error) {
throw error;
} finally {
teardown();
} // afterEach
process.exit = originalExit;
jest.resetModules();
}, {
'calls concurrently with all scripts': {
setup: withDefaultSetup(setupWithScripts())
},
[`does not include "lint" if it doesn't have that script`]: {
setup: withDefaultSetup(setupWithScripts(['test', 'build', 'flow']))
},
[`does not include "test" if it doesn't have that script`]: {
setup: withDefaultSetup(setupWithScripts(['lint', 'build', 'flow']))
},
[`does not include "build" if it doesn't have that script`]: {
setup: withDefaultSetup(setupWithScripts(['test', 'lint', 'flow']))
},
[`does not include "flow" if it doesn't have that script`]: {
setup: withDefaultSetup(setupWithScripts(['test', 'build', 'lint']))
},
'allows you to specify your own npm scripts': {
setup: setupWithArgs(['specialbuild,specialtest,speciallint'])
},
[`doesn't use test or lint if it's in precommit`]: {
setup: withDefaultSetup(() => {
const previousVal = process.env.SCRIPTS_PRECOMMIT;
process.env.SCRIPTS_PRECOMMIT = 'true';
return function () {
process.env.SCRIPTS_PRECOMMIT = previousVal;
};
})
}
});
function setupWithScripts(scripts = ['test', 'lint', 'build', 'flow']) {
return function () {
const utils = require('../../utils');
const originalIfScript = utils.ifScript;
utils.ifScript = (script, t, f) => scripts.includes(script) ? t : f;
return function () {
utils.ifScript = originalIfScript;
};
};
}
function setupWithArgs(args = []) {
return function () {
const utils = require('../../utils');
const originalResolveBin = utils.resolveBin;
utils.resolveBin = (modName, {
executable = modName
} = {}) => executable;
const originalArgv = process.argv;
process.argv = ['node', '../format', ...args];
return function () {
process.argv = originalArgv;
utils.resolveBin = originalResolveBin;
};
};
}
function withDefaultSetup(setupFn) {
return function () {
const utils = require('../../utils');
utils.resolveBin = (modName, {
executable = modName
} = {}) => executable;
const argsTeardown = setupWithArgs()();
const teardownScripts = setupWithScripts()();
const teardownFn = setupFn();
return function () {
argsTeardown();
teardownFn();
teardownScripts();
};
};
}