test("Taskr.constructor (defaults)", t => { const taskr = new Taskr() t.true(taskr instanceof Taskr, "returns a Taskr class") t.equal(taskr.file, undefined, "`taskr.file` is `undefined`") t.equal(taskr.root, process.cwd(), "`taskr.root` is `process.cwd()`") t.true($.isEmptyObj(taskr.tasks), "`taskr.tasks` is an empty object") t.true($.isEmptyObj(taskr.plugins), "`taskr.plugins` is an empty object") t.true(Array.isArray(taskr.plugNames), "`taskr.plugNames` is an array") t.true(taskr.plugNames.length === 0, "`taskr.plugNames` is empty") t.end() })
test.serial('should fail when current branch is not the specified release branch and publishing from any branch not permitted', async t => { execaStub.createStub([ { command: 'git symbolic-ref --short HEAD', exitCode: 0, stdout: 'feature' } ]); await t.throwsAsync(run(testedModule({branch: 'release'})), {message: 'Not on `release` branch. Use --any-branch to publish anyway, or set a different release branch using --branch.'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Check current branch' && task.hasFailed())); });
/* * Helper to run the app task runner */ const appRunner = command => (argv, lando) => { const app = lando.getApp(argv._app.root); return lando.events.emit('pre-app-runner', app) .then(() => lando.events.emit('pre-command-runner', app)) .then(() => app.init().then(() => _.find(app.tasks, {command}).run(argv))); }
// If we have an app with a tooling section let's do this app.events.on('post-init', () => { if (!_.isEmpty(_.get(app, 'config.tooling', {}))) { app.log.verbose('additional tooling detected'); // Add the tasks after we init the app _.forEach(utils.getToolingTasks(app.config.tooling, app), task => { app.log.debug('adding app cli task %s', task.name); const injectable = _.has(app, 'engine') ? app : lando; app.tasks.push(buildTask(task, injectable)); }); } });
test.serial('should fail when version is invalid', async t => { await t.throwsAsync(run(testedModule('DDD', {name: 'test', version: '1.0.0'}, {yarn: false})), {message: `Version should be either ${version.SEMVER_INCREMENTS.join(', ')}, or a valid semver version.`}); t.true(SilentRenderer.tasks.some(task => task.title === 'Validate version' && task.hasFailed())); });
test.serial('should fail when git version does not match range in `package.json`', async t => { execaStub.createStub([ { command: 'git version', exitCode: 0, stdout: 'git version 1.0.0' } ]); const depRange = require('../package.json').engines.git; await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})), {message: `Please upgrade to git${depRange}`}); t.true(SilentRenderer.tasks.some(task => task.title === 'Check git version' && task.hasFailed())); });
test.serial('should fail when prerelease version of public package without dist tag given', async t => { await t.throwsAsync(run(testedModule('2.0.0-1', {name: 'test', version: '1.0.0'}, {yarn: false})), {message: 'You must specify a dist-tag using --tag when publishing a pre-release version. This prevents accidentally tagging unstable versions as "latest". https://docs.npmjs.com/cli/dist-tag'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Check for pre-release version' && task.hasFailed())); });
test.serial('private package: should skip task `verify user is authenticated`', async t => { execaStub.createStub([ { command: 'git rev-parse --quiet --verify refs/tags/v2.0.0', exitCode: 0, stdout: '' } ]); process.env.NODE_ENV = 'P'; await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', private: true}, {yarn: false})); process.env.NODE_ENV = 'test'; t.true(SilentRenderer.tasks.some(task => task.title === 'Verify user is authenticated' && task.isSkipped())); });
test.serial('private package: should skip task pinging npm registry', async t => { execaStub.createStub([ { command: 'git rev-parse --quiet --verify refs/tags/v2.0.0', exitCode: 0, stdout: '' } ]); await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', private: true}, {yarn: false})); t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && task.isSkipped())); });
test.serial('public-package published on npm registry: should fail when npm registry not pingable', async t => { execaStub.createStub([{ command: 'npm ping', exitCode: 1, exitCodeName: 'EPERM', stdout: '', stderr: 'failed' }]); await t.throwsAsync(run(testedModule('1.0.0', {name: 'test'}, {})), {message: 'Connection to npm registry failed'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && task.hasFailed())); });
test.serial('should fail when version is lower as latest version', async t => { await t.throwsAsync(run(testedModule('0.1.0', {name: 'test', version: '1.0.0'}, {yarn: false})), {message: 'New version `0.1.0` should be higher than current version `1.0.0`'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Validate version' && task.hasFailed())); });
test.serial('should fail when git tag already exists', async t => { execaStub.createStub([ { command: 'git rev-parse --quiet --verify refs/tags/v2.0.0', stdout: 'vvb' } ]); await t.throwsAsync(run(testedModule('2.0.0', {name: 'test', version: '1.0.0'}, {yarn: false})), {message: 'Git tag `v2.0.0` already exists.'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Check git tag existence' && task.hasFailed())); });
test("Taskr.constructor (defaults)", t => { const taskr = new Taskr() t.true(taskr instanceof Taskr, "returns a Taskr class") t.equal(taskr.file, undefined, "`taskr.file` is `undefined`") t.equal(taskr.root, process.cwd(), "`taskr.root` is `process.cwd()`") t.true($.isEmptyObj(taskr.tasks), "`taskr.tasks` is an empty object") t.true($.isEmptyObj(taskr.plugins), "`taskr.plugins` is an empty object") t.true(Array.isArray(taskr.plugNames), "`taskr.plugNames` is an array") t.true(taskr.plugNames.length === 0, "`taskr.plugNames` is empty") t.end() })
test.serial('should fail when release branch is not specified, current branch is not main/master and publishing from any branch not permitted', async t => { execaStub.createStub([ { command: 'git symbolic-ref --short HEAD', exitCode: 0, stdout: 'feature' } ]); await t.throwsAsync(run(testedModule({})), {message: 'Not on `main`/`master` branch. Use --any-branch to publish anyway, or set a different release branch using --branch.'}); t.true(SilentRenderer.tasks.some(task => task.title === 'Check current branch' && task.hasFailed())); });
test.serial('external registry: should skip task pinging npm registry', async t => { execaStub.createStub([ { command: 'git rev-parse --quiet --verify refs/tags/v2.0.0', exitCode: 0, stdout: '' } ]); await run(testedModule('2.0.0', {name: 'test', version: '1.0.0', publishConfig: {registry: 'http://my.io'}}, {yarn: false})); t.true(SilentRenderer.tasks.some(task => task.title === 'Ping npm registry' && task.isSkipped())); });