UNPKG

kes

Version:

Making deployment to AWS using CloudFormation easier and fun

202 lines (165 loc) 5.17 kB
'use strict'; const test = require('ava'); const yaml = require('js-yaml'); const has = require('lodash.has'); const AWS = require('aws-sdk'); const { Config, utils, Kes } = require('../index'); const BetterKes = require('./override/kes'); test('should load local env variables', (t) => { const envs = utils.loadLocalEnvs('examples/lambdas/.env'); t.is(process.env.TIMEOUT, '100'); t.is(envs.TIMEOUT, '100'); }); test('should not error when env file doesnt exist', (t) => { const envs = utils.loadLocalEnvs('blahblah/.env'); t.true(envs.PATH !== undefined); }); test('Get the filename from the handler', (t) => { let r = utils.getZipName('my-lambda.zip'); t.is(r, 'my-lambda'); r = utils.getZipName('my-lambda.jpg.zip'); t.is(r, 'my-lambda'); }); test('Test reading a file as string', (t) => { let r = utils.fileToString('README.md'); t.true(r.includes('# Kes')); r = utils.fileToString('some random text'); t.is(r, 'some random text'); }); test('Test merging yaml files', (t) => { let merged = utils.mergeYamls('tests/data/file1.yaml', 'tests/data/file2.yaml'); let obj = yaml.safeLoad(merged); t.is(obj.secondKey, 'value5'); t.is(obj.forthKey.length, 3); t.is(obj.forthKey[0], 'value4'); t.is(obj.thirdKey.firstKey, 'value10'); merged = utils.mergeYamls('tests/data/file2.yaml', 'tests/data/file1.yaml'); obj = yaml.safeLoad(merged); t.is(obj.secondKey, 'value2'); t.is(obj.forthKey.length, 3); t.is(obj.forthKey[0], 'value1'); }); test('configuring aws', (t) => { utils.configureAws('us-west-2'); t.is(AWS.config.region, 'us-west-2'); utils.configureAws(null, 'myProfile'); t.is(AWS.config.credentials.profile, 'myProfile'); utils.configureAws(null, null, 'myRole'); t.is(AWS.config.credentials.params.RoleArn, 'myRole'); }); test('create a config instance', (t) => { const config = new Config({ kesFolder: 'examples/lambdas' }); t.is(config.stack, 'my-kes-project'); t.is(Object.keys(config.lambdas).length, 3); t.is(config.lambdas.func1.fullName, 'my-kes-project-func1'); // make sure envs are added even if lambdas don't include them t.is(Object.keys(config.lambdas.func1.envs).length, 0); t.is(config.lambdas.func2.envs.CUSTOM_ENV, 'myValue'); }); test('create a config instance with non default deployment', (t) => { const config = new Config({ kesFolder: 'examples/lambdas', deployment: 'kesTestDeployment', region: 'us-east-3' }); t.is(config.stack, 'kes-test-project-prod'); t.is(config.region, 'us-east-3'); }); test('test api gateway configuration', (t) => { const config = new Config({ kesFolder: 'examples/full' }); t.is(config.lambdas.length, 5); t.true(has(config, 'apiMethods')); t.true(has(config, 'apiResources')); t.true(has(config, 'apiMethodsOptions')); t.true(has(config, 'apiDependencies')); }); test('passing variables as configuration values', (t) => { const config1 = new Config({ kesFolder: 'examples/full' }); t.is(config1.sqs[0].retry, '10'); const config2 = new Config({ kesFolder: 'examples/full', deployment: 'staging' }); t.is(config2.sqs[0].retry, '20'); }); test('config with template', (t) => { const config = new Config({ kesFolder: 'examples/app_using_template', template: 'examples/template', deployment: 'kesTestDeployment' }); t.is(config.stackName, 'kes-test-using-template'); t.is(config.bucket, 'devseed-kes-deployment'); t.is(config.bucket, config.system_bucket); }); test('apiMethods will accept custom parameters', (t) => { const config = new Config({ kesFolder: 'examples/lambdas_api' }); t.true(config.apiMethods[0].extra_prop); }); test('utils.determineKesClass should load Kes overrides', (t) => { let KesOverride; try { KesOverride = utils.determineKesClass({ kesFolder: 'tests/override' }, Kes); } catch (e) { t.fail(`Unexpected error: ${e.message}`); } t.is(KesOverride.name, 'BetterKes'); try { KesOverride = utils.determineKesClass({ template: 'tests/override' }, Kes); } catch (e) { t.fail(`Unexpected error: ${e.message}`); } t.is(KesOverride.name, 'BetterKes'); try { KesOverride = utils.determineKesClass({ kesClass: 'tests/override/kes.js' }, Kes); } catch (e) { t.fail(`Unexpected error: ${e.message}`); } t.is(KesOverride.name, 'BetterKes'); }); test('utils.determineKesClass should throw errors when failing to load Kes overrides', (t) => { try { utils.determineKesClass({ kesFolder: 'tests/override-fail' }, Kes); t.fail('Expected error to be thrown'); } catch (e) { t.is(e.message, "Cannot find module './non-existent-path'"); } try { utils.determineKesClass({ template: 'tests/override-fail' }, Kes); t.fail('Expected error to be thrown'); } catch (e) { t.is(e.message, "Cannot find module './non-existent-path'"); } try { utils.determineKesClass({ kesClass: 'tests/override-fail/kes.js' }, Kes); t.fail('Expected error to be thrown'); } catch (e) { t.is(e.message, "Cannot find module './non-existent-path'"); } });