yargs-promise
Version:
Use the headless yargs parser with promises
181 lines (161 loc) • 4.73 kB
JavaScript
const yargs = require('yargs');
const YargsPromise = require('./index');
describe('YargsPromise', () => {
let parser;
let customContextMethod;
beforeEach(() => {
customContextMethod = jest.fn();
parser = new YargsPromise(yargs, {customContextMethod, foo: 'bar'});
});
afterEach(() => {
yargs.reset();
});
it('resolves built in data from commands without handler like help', done => {
parser.command('hello <name>', 'hello world parser').help();
return parser
.parse('hello --help')
.then(({argv, data}) => {
expect(argv['_']).toEqual(['hello']);
expect(data).toContain('Show help');
done();
})
.catch(err => {
done.fail(err);
});
});
it('can resolve returned promises from command handler argv.resolve', done => {
parser.command(
'hello <name>',
'hello world parser',
() => {},
argv => {
argv.resolve(
new Promise((resolve, reject) => {
resolve('response data');
})
);
}
);
return parser
.parse('hello world')
.then(({argv, data}) => {
expect(argv['_']).toEqual(['hello']);
expect(data).toContain('response data');
return done();
})
.catch(err => done.fail(err));
});
it('can reject returned promises from command handler argv.reject', done => {
parser.command(
'hello <name>',
'hello world parser',
() => {},
argv => {
argv.reject(
new Promise((resolve, reject) => {
resolve('response data');
})
);
}
);
return parser
.parse('hello world')
.then(() => done.fail('Should not be reached'))
.catch(data => {
expect(data.argv['_']).toEqual(['hello']);
expect(data.error).toEqual('response data');
return done();
});
});
it('resolves parsed argv from commands without handlers', done => {
parser.command('hello <name>');
return parser
.parse('hello world')
.then(({argv, data}) => {
expect(argv['_']).toEqual(['hello']);
expect(argv.name).toEqual('world');
return done();
})
.catch(err => done.fail(err));
});
it('rejects errors from built in validation errors', done => {
parser.command('hello <name>');
return parser
.parse('hello')
.then(() => done.fail('Should not be reached'))
.catch(({error, argv}) => {
expect(argv['_']).toEqual(['hello']);
expect(error.message).toEqual(
'Not enough non-option arguments: got 0, need at least 1'
);
return done();
})
.catch(error => done.fail(error));
});
it('resolves custom data via context.reject in command handler', done => {
parser.command(
'hello <name>',
'hello world command',
() => {},
argv => {
return argv.resolve('custom handler', argv);
}
);
return parser
.parse('hello world')
.then(({data, argv}) => {
expect(data).toEqual('custom handler');
expect(argv['_']).toEqual(['hello']);
expect(argv.name).toEqual('world');
return done();
})
.catch(error => done.fail(error));
});
it('rejects custom data via context.reject in command handler', done => {
parser.command(
'hello <name>',
'hello world command',
() => {},
argv => {
if (argv._[1]) {
return argv.reject('Custom too many arguments');
}
return argv.resolve('hello', argv);
}
);
return parser
.parse('hello world 123')
.then(() => done.fail('Should not be reached'))
.catch(({error, argv}) => {
expect(argv['_'][1]).toEqual(123);
expect(error).toEqual('Custom too many arguments');
return done();
})
.catch(err => done.fail(err));
});
it('supports merging custom context', done => {
parser.command(
'hello <name>',
'hello world command',
() => {},
argv => {
argv.customContextMethod('yargs!!!');
return argv.resolve('custom handler', argv);
}
);
return parser
.parse('hello world')
.then(({data, argv}) => {
expect(data).toEqual('custom handler');
expect(argv['_']).toEqual(['hello']);
expect(argv.name).toEqual('world');
// custom prop foo
expect(argv.foo).toEqual('bar');
// custom method
expect(customContextMethod.mock.calls.length).toEqual(1);
expect(customContextMethod.mock.calls[0]).toEqual(['yargs!!!']);
return done();
})
.catch(error => done.fail(error));
});
});