The message now specify if the step is required and if it allows to configure multiple plugins.
185 lines
6.0 KiB
JavaScript
185 lines
6.0 KiB
JavaScript
import path from 'path';
|
|
import test from 'ava';
|
|
import {copy, outputFile} from 'fs-extra';
|
|
import {stub} from 'sinon';
|
|
import tempy from 'tempy';
|
|
import getPlugins from '../../lib/plugins';
|
|
|
|
// Save the current working diretory
|
|
const cwd = process.cwd();
|
|
|
|
test.beforeEach(t => {
|
|
// Stub the logger functions
|
|
t.context.log = stub();
|
|
t.context.success = stub();
|
|
t.context.logger = {log: t.context.log, success: t.context.success, scope: () => t.context.logger};
|
|
});
|
|
|
|
test('Export default plugins', t => {
|
|
const plugins = getPlugins({cwd, options: {}, logger: t.context.logger}, {});
|
|
|
|
// Verify the module returns a function for each plugin
|
|
t.is(typeof plugins.verifyConditions, 'function');
|
|
t.is(typeof plugins.analyzeCommits, 'function');
|
|
t.is(typeof plugins.verifyRelease, 'function');
|
|
t.is(typeof plugins.generateNotes, 'function');
|
|
t.is(typeof plugins.prepare, 'function');
|
|
t.is(typeof plugins.publish, 'function');
|
|
t.is(typeof plugins.success, 'function');
|
|
t.is(typeof plugins.fail, 'function');
|
|
});
|
|
|
|
test('Export plugins based on config', t => {
|
|
const plugins = getPlugins(
|
|
{
|
|
cwd,
|
|
logger: t.context.logger,
|
|
options: {
|
|
verifyConditions: ['./test/fixtures/plugin-noop', {path: './test/fixtures/plugin-noop'}],
|
|
generateNotes: './test/fixtures/plugin-noop',
|
|
analyzeCommits: {path: './test/fixtures/plugin-noop'},
|
|
verifyRelease: () => {},
|
|
},
|
|
},
|
|
{}
|
|
);
|
|
|
|
// Verify the module returns a function for each plugin
|
|
t.is(typeof plugins.verifyConditions, 'function');
|
|
t.is(typeof plugins.analyzeCommits, 'function');
|
|
t.is(typeof plugins.verifyRelease, 'function');
|
|
t.is(typeof plugins.generateNotes, 'function');
|
|
t.is(typeof plugins.prepare, 'function');
|
|
t.is(typeof plugins.publish, 'function');
|
|
t.is(typeof plugins.success, 'function');
|
|
t.is(typeof plugins.fail, 'function');
|
|
});
|
|
|
|
test('Export plugins loaded from the dependency of a shareable config module', async t => {
|
|
const cwd = tempy.directory();
|
|
await copy(
|
|
'./test/fixtures/plugin-noop.js',
|
|
path.resolve(cwd, 'node_modules/shareable-config/node_modules/custom-plugin/index.js')
|
|
);
|
|
await outputFile(path.resolve(cwd, 'node_modules/shareable-config/index.js'), '');
|
|
|
|
const plugins = getPlugins(
|
|
{
|
|
cwd,
|
|
logger: t.context.logger,
|
|
options: {
|
|
verifyConditions: ['custom-plugin', {path: 'custom-plugin'}],
|
|
generateNotes: 'custom-plugin',
|
|
analyzeCommits: {path: 'custom-plugin'},
|
|
verifyRelease: () => {},
|
|
},
|
|
},
|
|
{'custom-plugin': 'shareable-config'}
|
|
);
|
|
|
|
// Verify the module returns a function for each plugin
|
|
t.is(typeof plugins.verifyConditions, 'function');
|
|
t.is(typeof plugins.analyzeCommits, 'function');
|
|
t.is(typeof plugins.verifyRelease, 'function');
|
|
t.is(typeof plugins.generateNotes, 'function');
|
|
t.is(typeof plugins.prepare, 'function');
|
|
t.is(typeof plugins.publish, 'function');
|
|
t.is(typeof plugins.success, 'function');
|
|
t.is(typeof plugins.fail, 'function');
|
|
});
|
|
|
|
test('Export plugins loaded from the dependency of a shareable config file', async t => {
|
|
const cwd = tempy.directory();
|
|
await copy('./test/fixtures/plugin-noop.js', path.resolve(cwd, 'plugin/plugin-noop.js'));
|
|
await outputFile(path.resolve(cwd, 'shareable-config.js'), '');
|
|
|
|
const plugins = getPlugins(
|
|
{
|
|
cwd,
|
|
logger: t.context.logger,
|
|
options: {
|
|
verifyConditions: ['./plugin/plugin-noop', {path: './plugin/plugin-noop'}],
|
|
generateNotes: './plugin/plugin-noop',
|
|
analyzeCommits: {path: './plugin/plugin-noop'},
|
|
verifyRelease: () => {},
|
|
},
|
|
},
|
|
{'./plugin/plugin-noop': './shareable-config.js'}
|
|
);
|
|
|
|
// Verify the module returns a function for each plugin
|
|
t.is(typeof plugins.verifyConditions, 'function');
|
|
t.is(typeof plugins.analyzeCommits, 'function');
|
|
t.is(typeof plugins.verifyRelease, 'function');
|
|
t.is(typeof plugins.generateNotes, 'function');
|
|
t.is(typeof plugins.prepare, 'function');
|
|
t.is(typeof plugins.publish, 'function');
|
|
t.is(typeof plugins.success, 'function');
|
|
t.is(typeof plugins.fail, 'function');
|
|
});
|
|
|
|
test('Use default when only options are passed for a single plugin', t => {
|
|
const analyzeCommits = {};
|
|
const generateNotes = {};
|
|
const success = () => {};
|
|
const fail = [() => {}];
|
|
|
|
const plugins = getPlugins(
|
|
{cwd, logger: t.context.logger, options: {analyzeCommits, generateNotes, success, fail}},
|
|
{}
|
|
);
|
|
|
|
// Verify the module returns a function for each plugin
|
|
t.is(typeof plugins.analyzeCommits, 'function');
|
|
t.is(typeof plugins.generateNotes, 'function');
|
|
t.is(typeof plugins.success, 'function');
|
|
t.is(typeof plugins.fail, 'function');
|
|
|
|
// Verify only the plugins defined as an object with no `path` are set to the default value
|
|
t.falsy(success.path);
|
|
t.falsy(fail.path);
|
|
});
|
|
|
|
test('Merge global options with plugin options', async t => {
|
|
const plugins = getPlugins(
|
|
{
|
|
cwd,
|
|
logger: t.context.logger,
|
|
options: {
|
|
globalOpt: 'global',
|
|
otherOpt: 'globally-defined',
|
|
verifyRelease: {path: './test/fixtures/plugin-result-config', localOpt: 'local', otherOpt: 'locally-defined'},
|
|
},
|
|
},
|
|
{}
|
|
);
|
|
|
|
const [result] = await plugins.verifyRelease();
|
|
|
|
t.deepEqual(result.pluginConfig, {localOpt: 'local', globalOpt: 'global', otherOpt: 'locally-defined'});
|
|
});
|
|
|
|
test('Throw an error if plugins configuration are invalid', t => {
|
|
const errors = [
|
|
...t.throws(() =>
|
|
getPlugins(
|
|
{
|
|
cwd,
|
|
logger: t.context.logger,
|
|
options: {verifyConditions: {}, analyzeCommits: [], verifyRelease: [{}], generateNotes: [{path: null}]},
|
|
},
|
|
{}
|
|
)
|
|
),
|
|
];
|
|
|
|
t.is(errors[0].name, 'SemanticReleaseError');
|
|
t.is(errors[0].code, 'EPLUGINCONF');
|
|
t.is(errors[1].name, 'SemanticReleaseError');
|
|
t.is(errors[1].code, 'EPLUGINCONF');
|
|
t.is(errors[2].name, 'SemanticReleaseError');
|
|
t.is(errors[2].code, 'EPLUGINCONF');
|
|
t.is(errors[3].name, 'SemanticReleaseError');
|
|
t.is(errors[3].code, 'EPLUGINCONF');
|
|
});
|