aws-cfm-utils
Version:
AWS utils to deploy cloudformation stack/templates
208 lines (205 loc) • 11.3 kB
JavaScript
;
const assert = require('assert');
const sinon = require('sinon');
const { cliopts } = require('../../lib/cli_options.js');
describe('arg', function() {
describe('parse', function() {
it('required minimum', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name']);
assert.equal(argv['stackName'], 'name');
});
it('global', function() {
const argv = cliopts(['/node', 'index.js', '--region', 'eu-west-2', '--profile', 'profile', '--stack-name', 'name']);
assert.equal(argv['region'], 'eu-west-2');
assert.equal(argv['profile'], 'profile');
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['suspend-scheduled-actions'], true);
});
it('common', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--suspend-scheduled-actions', 'false', '--template-url', 'url', '--parameters', 'ParameterKey=key,UsePreviousValue=true', 'ParameterKey=key,ParameterValue=value', '--capabilities', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND', '--stack-events', '--resource-types', 'type1', 'type2', '--role-arn', 'arn', '--stack-policy-url', 'url', '--notification-arns', 'arn1', 'arn2']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['template-url'], 'url');
assert.deepEqual(argv['parameters'], ['ParameterKey=key,UsePreviousValue=true', 'ParameterKey=key,ParameterValue=value']);
assert.deepEqual(argv['capabilities'], ['CAPABILITY_NAMED_IAM', 'CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']);
assert.deepEqual(argv['resource-types'], ['type1', 'type2']);
assert.equal(argv['role-arn'], 'arn');
assert.equal(argv['stack-policy-url'], 'url');
assert.deepEqual(argv['notification-arns'], ['arn1', 'arn2']);
assert.equal(argv['stack-events'], true);
assert.equal(argv['suspend-scheduled-actions'], false);
});
describe('create', function() {
it('create', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--timeout-in-minutes', '10', '--on-failure', 'DO_NOTHING', '--enable-termination-protection']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['disable-rollback'], undefined);
assert.equal(argv['timeout-in-minutes'], 10);
assert.equal(argv['on-failure'], 'DO_NOTHING');
assert.equal(argv['enable-termination-protection'], true);
});
it('--enable-termination-protection', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--enable-termination-protection']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['enable-termination-protection'], true);
});
it('--no-enable-termination-protection', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--no-enable-termination-protection']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['enable-termination-protection'], false);
});
it('--disable-rollback', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--disable-rollback']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['disable-rollback'], true);
});
it('--no-disable-rollback', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--no-disable-rollback']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['disable-rollback'], false);
});
it('--suspend-scheduled-actions', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--suspend-scheduled-actions']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['suspend-scheduled-actions'], true);
});
it('--suspend-scheduled-actions is set to false', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--suspend-scheduled-actions', 'false']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['suspend-scheduled-actions'], false);
});
it('--suspend-scheduled-actions is set to true without argument', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['suspend-scheduled-actions'], true);
});
});
describe('update', function() {
it('update', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--stack-policy-during-update-body', 'body', '--stack-policy-during-update-url', 'url']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['use-previous-template'], undefined);
assert.equal(argv['stack-policy-during-update-body'], 'body');
assert.equal(argv['stack-policy-during-update-url'], 'url');
assert.equal(argv['stack-events'], undefined);
});
it('--use-previous-template', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--use-previous-template']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['use-previous-template'], true);
});
it('--no-use-previous-template', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--no-use-previous-template']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['use-previous-template'], false);
});
});
describe('additional', function() {
it('takes --stack-events', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--stack-events']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['stack-events'], true);
});
it('does not take --stack-events', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['stack-events'], undefined);
});
it('takes --refresh-rate', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name', '--refresh-rate', '50']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['refresh-rate'], 50);
});
it('does not take --refresh-rate', function() {
const argv = cliopts(['/node', 'index.js', '--stack-name', 'name']);
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['refresh-rate'], 15);
});
});
});
describe('other', function() {
before(function() {
sinon.stub(console, 'error').callsFake(function(warning) { throw new Error(warning) })
});
after(function() { console.error.restore() });
describe('credentials', function() {
it('takes profile and no region', function() {
const argv = cliopts(['/node', 'index.js', '--profile', 'yourprofilname', '--stack-name', 'name']);
assert.equal(argv['region'], 'eu-west-1');
assert.equal(argv['profile'], 'yourprofilname');
assert.equal(argv['stack-name'], 'name');
});
it('takes AWS keys credentials', function() {
const argv = cliopts(['/node', 'index.js', '--accesskeyid', 'AWS_KEY_ID', '--secretkey', 'AWS_SECRET_KEY', '--stack-name', 'name']);
assert.equal(argv['region'], 'eu-west-1');
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['accesskeyid'], 'AWS_KEY_ID');
assert.equal(argv['secretkey'], 'AWS_SECRET_KEY');
});
it('takes AWS keys credentials and sessiontoken', function() {
const argv = cliopts(['/node', 'index.js', '--accesskeyid', 'AWS_KEY_ID', '--secretkey', 'AWS_SECRET_KEY', '--stack-name', 'name', '--sessiontoken', 'random_£$%!2341STR']);
assert.equal(argv['region'], 'eu-west-1');
assert.equal(argv['stack-name'], 'name');
assert.equal(argv['accesskeyid'], 'AWS_KEY_ID');
assert.equal(argv['secretkey'], 'AWS_SECRET_KEY');
assert.equal(argv['sessiontoken'], 'random_£$%!2341STR');
});
it('errors when accesskeyid is passed without secretkey', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--accesskeyid', 'AWS_KEY_ID']);
}, Error);
});
it('errors when secretkey is passed without accesskeyid', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--secretkey', 'AWS_SECRET_KEY']);
}, Error);
});
it('errors when sessiontoken is passed without accesskeyid and secretkey', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--sessiontoken', 'random_£$%!2341STR']);
}, Error);
});
it('errors when sessiontoken is passed without secretkey', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--secretkey', 'AWS_SECRET_KEY', '--sessiontoken', 'random_£$%!2341STR']);
}, Error);
});
it('errors when sessiontoken is passed without accesskeyid', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--accesskeyid', 'AWS_KEY_ID', '--sessiontoken', 'random_£$%!2341STR']);
}, Error);
});
});
describe('conflicting values', function() {
it('errors when profile and AWS access keys are passed', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--profile', 'yourprofilname', '--accesskeyid', 'AWS_KEY_ID', '--secretkey', 'AWS_SECRET_KEY']);
}, Error);
});
it('errors when profile and AWS access keys are passed with sessiontoken', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--profile', 'yourprofilname', '--accesskeyid', 'AWS_KEY_ID', '--secretkey', 'AWS_SECRET_KEY', '--sessiontoken', 'random_£$%!2341STR']);
}, Error);
});
it('errors when profile and sessiontoken is passed in without AWS access keys', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--profile', 'yourprofilname', '--sessiontoken', 'random_£$%!2341STR']);
}, Error);
});
it('errors when template-url and template-body are passed', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--template-url', 'url', '--template-body', 'body']);
}, Error);
});
it('errors when template-url and template-body are passed', function() {
assert.throws(function() {
cliopts(['/node', 'index.js', '--stack-name', 'name', '--stack-policy-body', 'policy-body', '--stack-policy-url', 'policy-url']);
}, Error);
});
it('errors when no arguments are passed', function() {
assert.throws(function() {
cliopts(['/node', 'index.js']);
}, Error);
});
});
});
});