@zkochan/pnpm
Version:
A fast implementation of npm install
817 lines (584 loc) • 17.5 kB
JavaScript
var test = require('tape');
var nash = require('../lib/index');
var command = require('../lib/command');
var commands = require('../lib/commands');
var flags = require('../lib/flags');
var flag = require('../lib/flag');
var wrappers = require('../lib/wrappers');
test('cli: defaults', function (t) {
var cli = nash();
t.deepEqual(cli.internals.commands, commands(), 'blank command collection');
t.deepEqual(cli.internals.flags, flags(), 'blank flag collection');
t.deepEqual(cli.internals.beforeAlls, wrappers(), 'blank beforeAlls collection');
t.deepEqual(cli.internals.afterAlls, wrappers(), 'blank afterAlls collection');
t.end();
});
test('cli: instance options', function (t) {
var options = {
key1: 'value1',
key2: 'value2'
};
var cli = nash(options);
t.deepEqual(cli.options, options, 'adds options to instance');
t.end();
});
test('cli: extends EventEmitter', function (t) {
var EventEmitter = require('events').EventEmitter;
var cli = nash();
t.ok(cli.emit, 'emit');
t.ok(cli.addListener, 'addListener');
t.ok(cli.on, 'on');
t.ok(cli.once, 'once');
t.ok(cli.removeListener, 'removeListener');
t.ok(cli.removeAllListeners, 'removeAllListeners');
t.ok(cli.listeners, 'listeners');
t.end();
});
test('cli: command', function (t) {
var cli = nash();
var cmd = cli.command('test', 't');
var handler = function () {/* handler */};
cmd.handler(handler);
t.deepEqual(cli.internals.commands.all(), [cmd], 'adds command to collection');
t.deepEqual(cli.command('test', 't').name(), command('test', 't').name(), 'creates instance of command');
t.equal(cli.command('test').handler().toString(), handler.bind(cmd).toString(), 'return command if already defined');
t.end();
});
test('cli: flags', function (t) {
var handler = function () {/* handler */};
var cli = nash();
var flg = cli.flag('--test', '-t');
flg.handler(handler);
t.deepEqual(cli.internals.flags.all(), [flg], 'adds flag to collection');
t.deepEqual(cli.flag('--test', '-t').name(), flag('--test', '-t').name(), 'creates instance of flag');
t.equal(cli.flag('-t').handler().toString(), handler.bind(flg).toString(), 'return flag if already defined');
t.end();
});
test.skip('cli: flag default value', function (t) {
var cli = nash();
cli.flag('--default', '-d').default('default value');
cli.flag('--another', '-a').default('another default value');
cli.default()
.handler(function (done) {
t.equal(cli.argv.d, 'my value', 'default value');
// t.equal(cli.argv.default, 'my value', 'default value');
// t.equal(cli.argv.a, 'another default value', 'default value');
// t.equal(cli.argv.another, 'another default value', 'default value');
done();
});
cli.run(['', '', 'some', '-d', 'my value'], function () {
t.end();
});
});
test('cli: runs flags', function (t) {
var cli = nash();
var flagCalled1 = false;
var flagCalled2 = false;
var cliOverrideFlagCalled = false;
var flagOverrideCalled = false;
// Set up override flag
var overrideFlag = flag('-o')
.override()
.handler(function (val, done) {
flagOverrideCalled = true;
done();
});
cli.flag('-f')
.handler(function (val, done) {
flagCalled1 = true;
t.equal(val, 'test value1', 'passes value 1');
done();
});
cli.flag('-t')
.handler(function (val, done) {
flagCalled2 = true;
t.equal(val, 'test value2', 'passes value 2');
done();
});
cli.flag('-o')
.handler(function (val, done) {
cliOverrideFlagCalled = true;
done();
});
cli.runFlags({
f: 'test value1',
t: 'test value2',
o: true
}, function (err) {
t.ok(flagCalled1, 'ran flag 1 handler');
t.ok(flagCalled2, 'ran flag 2 handler');
t.notOk(cliOverrideFlagCalled, 'did not call cli flag');
t.ok(flagOverrideCalled, 'called flag override');
t.end();
},
// Flag override values
[overrideFlag]
);
});
test('cli: runs a single flag', function (t) {
t.plan(2);
var cli = nash();
var ranFlag = false;
cli.flag('-t')
.handler(function (data, done) {
t.equal(data, 'data', 'passed data into flag');
ranFlag = true;
done();
});
cli.runFlag('t', 'data', function () {
t.ok(ranFlag, 'ran flag');
});
});
test('cli: run method is chainable', function (t) {
var cli = nash();
t.deepEqual(cli.run(), cli, 'returns object');
t.end();
});
test('cli: runs command', function (t) {
var cli = nash();
var handlerCalled = false;
var commandFlagCalled = false;
var callstack = [];
cli.beforeAll(function (data, flags, done) {
callstack.push('beforeAll');
done();
});
cli.afterAll(function (data, flags, done) {
callstack.push('afterAll');
done();
});
cli.flag('-t')
.handler(function (val, done) {
callstack.push('flag');
done();
});
cli.command('test')
.handler(function (data, flags, done) {
callstack.push('command');
handlerCalled = true;
done();
})
.flag('-t')
.handler(function (val, done) {
commandFlagCalled = true;
done();
});
cli.run(['', '', 'test', '-t'], function () {
t.ok(handlerCalled, 'runs the command');
t.deepEqual(callstack, ['beforeAll', 'flag', 'command', 'afterAll'], 'execution order');
t.ok(commandFlagCalled, 'calls cli and command flags if not overridden');
callstack = [];
handlerCalled = false;
cli.command('test')
.handler(function (data, flags, done) {
handlerCalled = true;
t.equal(data[0], 'data', 'passes data to handler');
done();
});
cli.run(['', '', 'test', 'data'], function () {
t.ok(handlerCalled, 'runs the command with data');
t.end();
});
});
});
test('cli: command level flags can override cli level flags', function (t) {
var cli = nash();
var cliFlagCalled = false;
var commandFlagCalled = false;
var commandFlagCallCount = 0;
cli.flag('-t')
.handler(function (val, done) {
cliFlagCalled = true;
done();
});
cli.command('test')
.flag('-t')
.override()
.handler(function (val, done) {
commandFlagCallCount += 1;
commandFlagCalled = true;
done();
});
cli.run(['', '', 'test', '-t'], function () {
t.ok(commandFlagCalled, 'command flag');
t.notOk(cliFlagCalled, 'cli flag');
t.equal(commandFlagCallCount, 1, 'flag only called once');
t.end();
});
});
test('cli: task level flags can override cli level flags', function (t) {
var cli = nash();
var cliFlagCalled = false;
var taskFlagCalled = false;
var taskFlagCallCount = 0;
cli.flag('-t')
.handler(function (val, done) {
cliFlagCalled = true;
done();
});
cli.command('test')
.task('task')
.flag('-t')
.override()
.handler(function (val, done) {
taskFlagCallCount += 1;
taskFlagCalled = true;
done();
});
cli.run(['', '', 'test:task', '-t'], function () {
t.ok(taskFlagCalled, 'command flag');
t.notOk(cliFlagCalled, 'cli flag');
t.equal(taskFlagCallCount, 1, 'flag only called once');
t.end();
});
});
test('cli: sets argv on cli level', function (t) {
var cli = nash();
cli.run(['', '', 'command', '-f', 'value'], function () {
t.deepEqual(cli.argv, { _: [ 'command' ], f: 'value' }, 'argv set on proto');
t.end();
});
});
test('cli: runs command task', function (t) {
var cli = nash();
var taskRan = false;
cli.command('test')
.task('task')
.handler(function (data, flags, done) {
t.equal(data[0], 'data', 'passes data to task handler');
taskRan = true;
done();
});
cli.run(['', '', 'test:task', 'data'], function () {
t.ok(taskRan, 'ran the task');
t.end();
});
});
test('cli: runs beforeAlls', function (t) {
var cli = nash();
var beforeAllRan1 = false;
var beforeAllRan2 = false;
var beforeAllRan3 = false;
var chained = cli
.beforeAll(function (data, flags, done) {
beforeAllRan1 = true;
t.deepEqual(this, cli, 'bound to cli object');
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
})
.beforeAll(
function (data, flags, done) {
beforeAllRan2 = true;
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
},
function (data, flags, done) {
beforeAllRan3 = true;
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
}
);
cli.runBeforeAlls(['data'], {t: 'flagged'}, function () {
t.ok(beforeAllRan1, 'all methods ran');
t.ok(beforeAllRan2, 'all methods ran');
t.ok(beforeAllRan3, 'all methods ran');
t.deepEqual(chained, cli, 'chainable');
t.end();
});
});
test('cli: runs afterAlls', function (t) {
var cli = nash();
var afterAllRan1 = false;
var afterAllRan2 = false;
var afterAllRan3 = false;
var chained = cli
.afterAll(function (data, flags, done) {
afterAllRan1 = true;
t.deepEqual(this, cli, 'bound to cli object');
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
})
.afterAll(
function (data, flags, done) {
afterAllRan2 = true;
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
},
function (data, flags, done) {
afterAllRan3 = true;
t.deepEqual(data, ['data'], 'passed in data');
t.deepEqual(flags, {t: 'flagged'}, 'passed in flags');
done();
}
);
cli.runAfterAlls(['data'], {t: 'flagged'}, function () {
t.ok(afterAllRan1, 'all methods ran');
t.ok(afterAllRan2, 'all methods ran');
t.ok(afterAllRan3, 'all methods ran');
t.deepEqual(chained, cli, 'chainable');
t.end();
});
});
test('cli: finds a command', function (t) {
var cli = nash();
var cmd = cli.command('test');
t.deepEqual(cli.findCommand('test'), cmd, 'by command name');
t.end();
});
test('cli: finds a command task', function (t) {
var cli = nash();
var task = cli.command('test').task('task');
t.deepEqual(cli.findCommandTask('test', 'task'), task, 'by command name and command task name');
t.notOk(cli.findCommandTask('test', 'notTask'), 'no task found');
t.end();
});
test('cli: default command', function (t) {
var cli = nash();
var commandCalledCount = 0;
cli.default()
.handler(function (data, flags, done) {
commandCalledCount += 1;
done();
});
cli.run([], function () {
t.equal(commandCalledCount, 1, 'command ran first time');
var defaultCommand = cli.default();
cli.run([], function () {
t.equal(commandCalledCount, 2, 'ran same default command');
t.end();
});
});
});
test('cli: one argument gets passed to default command', function (t) {
t.plan(1);
var cli = nash();
cli.default()
.handler(function (data, flags, done) {
t.equal(data[0], 'arg1', 'argument 1 passed');
done();
});
cli.run(['', '', 'arg1']);
});
test('cli: two arguments get passed to default command', function (t) {
t.plan(2);
var cli = nash();
cli.default()
.handler(function (data, flags, done) {
t.equal(data[0], 'arg1', 'argument 1 passed');
t.equal(data[1], 'arg2', 'argument 2 passed');
done();
});
cli.run(['', '', 'arg1', 'arg2']);
});
test('cli: global flags work with default command', function (t) {
t.plan(2);
var cli = nash();
var commandCalled = false;
var flagCalled = false;
cli.flag('--help', '-h')
.handler(function (val, done) {
flagCalled = true;
done();
});
cli.default()
.handler(function (data, flags, done) {
commandCalled = true;
done();
});
cli.run(['', '', '-h'], function () {
t.ok(commandCalled, 'command ran');
t.ok(flagCalled, 'flag ran');
});
});
test('cli: decorates commands', function (t) {
t.plan(3);
var cli = nash();
var chained = cli.decorate('command', 'test', function (val) {
t.equal(val, 'value', 'passed value in to decorator');
return this;
});
cli.decorate('command', 'another', function () {
this._something = 'another';
});
t.deepEqual(chained, cli, 'chainable');
var cmd = cli.command('testing');
cmd.test('value');
cmd.another();
t.equal(cmd._something, 'another', 'can set data on the command');
});
test('cli: decorates flags', function (t) {
t.plan(1);
var cli = nash();
cli.decorate('flag', 'test', function (val) {
t.equal(val, 'data', 'passed data into decorator');
});
var flg = flag('-t');
flg.test('data');
});
test('cli: register an array of plugins', function (t) {
t.plan(3);
var cli = nash();
var commandCalled = false;
var ranBeforeAll = false;
var plugin1 = function (cli, options, done) {
cli.beforeAll(function (data, flags, done) {
ranBeforeAll = true;
done();
});
cli.command('test')
.handler(function (data, flags, done) {
commandCalled = true;
done();
});
t.deepEqual(options, {key: 'value'}, 'passed options into plugin');
done();
};
cli.register([
{
register: plugin1,
options: {
key: 'value'
}
}
], function () {
cli.run(['', '', 'test'], function () {
t.ok(commandCalled, 'ran command from plugin');
t.ok(ranBeforeAll, 'ran before all from plugin');
});
});
});
test('cli: register a single plugin', function (t) {
t.plan(3);
var cli = nash();
var commandCalled = false;
var ranBeforeAll = false;
var plugin1 = function (cli, options, done) {
cli.beforeAll(function (data, flags, done) {
ranBeforeAll = true;
done();
});
cli.command('test')
.handler(function (data, flags, done) {
commandCalled = true;
done();
});
t.deepEqual(options, {key: 'value'}, 'passed options into plugin');
done();
};
cli.register({
register: plugin1,
options: {
key: 'value'
}
}, function () {
cli.run(['', '', 'test'], function () {
t.ok(commandCalled, 'ran command from plugin');
t.ok(ranBeforeAll, 'ran before all from plugin');
});
});
});
test('cli: registers plugin with no options', function (t) {
t.plan(2);
var cli = nash();
var commandCalled = false;
var ranBeforeAll = false;
var plugin1 = function (cli, options, done) {
cli.beforeAll(function (data, flags, done) {
ranBeforeAll = true;
done();
});
cli.command('test')
.handler(function (data, flags, done) {
commandCalled = true;
done();
});
done();
};
cli.register({register: plugin1}, function () {
cli.run(['', '', 'test'], function () {
t.ok(commandCalled, 'ran command from plugin');
t.ok(ranBeforeAll, 'ran before all from plugin');
});
});
});
test('cli: registers multiple plugins as an array', function (t) {
t.plan(3);
var cli = nash();
var commandCalled = false;
var command2Called = false;
var ranBeforeAll = false;
var plugin1 = function (cli, options, done) {
cli.beforeAll(function (data, flags, done) {
ranBeforeAll = true;
done();
});
cli.command('test')
.handler(function (data, flags, done) {
commandCalled = true;
done();
});
done();
};
var plugin2 = function (cli, options, done) {
cli.command('test2')
.handler(function (data, flags, done) {
command2Called = true;
done();
});
done();
};
cli.register([
{
register: plugin1,
options: {key: 'value'}
},
{
register: plugin2,
options: {key: 'value'}
}
], function () {
cli.run(['', '', 'test'], function () {
cli.run(['', '', 'test2'], function () {
t.ok(commandCalled, 'ran command from plugin');
t.ok(ranBeforeAll, 'ran before all from plugin');
t.ok(command2Called, 'ran command 2 from plugin');
});
});
});
});
test('cli: getters/setters', function (t) {
var cli = nash();
t.ok(typeof cli.set === 'function', 'setter exists');
cli.set('key', 'value');
t.ok(typeof cli.get === 'function', 'getter exists');
t.equal(cli.get('key'), 'value', 'getter');
cli.set({
key1: 'value1',
key2: 'value2'
});
t.equal(cli.get('key1'), 'value1', 'set first value');
t.equal(cli.get('key2'), 'value2', 'set second value');
t.end();
});
test('cli: process data', function (t) {
var cli = nash();
cli.default()
.handler(function (data, flags, done) {
t.equal(cli.process.command, 'command', 'command');
t.equal(cli.process.task, 'task', 'task');
t.deepEqual(cli.process.data, ['data'], 'data');
t.deepEqual(cli.process.flags, {flag: 'flag', f: 'flag'}, 'flags');
cli.process.newValue = 'new value';
t.notOk(cli.process.newValue, 'immutable');
done();
});
cli.flag('-f', '--flag');
cli.run(['', '', 'command:task', 'data', '--flag', 'flag'], function () {
t.end();
});
});