UNPKG

ask-cli

Version:

Alexa Skills Kit (ASK) Command Line Interfaces

447 lines (402 loc) 15.7 kB
const { expect } = require('chai'); const fs = require('fs'); const inquirer = require('inquirer'); const path = require('path'); const sinon = require('sinon'); const CONSTANTS = require('@src/utils/constants'); const Messenger = require('@src/view/messenger'); const JsonView = require('@src/view/json-view'); const ui = require('@src/commands/init/ui'); function validateInquirerConfig(stub, expectedConfig) { const { message, type, defaultValue, choices } = expectedConfig; expect(stub.message).equal(message); expect(stub.type).equal(type); if (defaultValue) { expect(stub.default).equal(defaultValue); } if (choices) { expect(stub.choices).deep.equal(choices); } } describe('Commands init - UI test', () => { const TEST_PROFILE = 'profile'; const TEST_ERROR = 'init error'; new Messenger({}); let infoStub; describe('# validate ui.showInitInstruction', () => { beforeEach(() => { infoStub = sinon.stub(); sinon.stub(Messenger, 'getInstance').returns({ info: infoStub }); }); afterEach(() => { sinon.restore(); }); it('| showInitInstruction display by messenger info', () => { // call ui.showInitInstruction(TEST_PROFILE); // verify expect(infoStub.args[0][0].includes(TEST_PROFILE)).equal(true); }); }); describe('# validate ui.confirmOverwrite', () => { beforeEach(() => { sinon.stub(inquirer, 'prompt'); }); afterEach(() => { sinon.restore(); }); it('| confirm overwrite from user but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.confirmOverwrite((err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: `${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG} already exists in current directory. Do you want to overwrite it? `, type: 'confirm', default: true, }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| confirm overwrite from user inputs', (done) => { // setup inquirer.prompt.resolves({ isOverwriteConfirmed: true }); // call ui.confirmOverwrite((err, response) => { // verify expect(err).equal(null); expect(response).equal(true); done(); }); }); }); describe('# validate ui.getSkillId', () => { beforeEach(() => { sinon.stub(inquirer, 'prompt'); }); afterEach(() => { sinon.restore(); }); it('| get skillId but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.getSkillId((err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Skill Id (leave empty to create one): ', type: 'input', name: 'skillId' }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| get skillId with user input succeeds', (done) => { // setup inquirer.prompt.resolves({ skillId: ' skill ' }); // call ui.getSkillId((err, response) => { // verify expect(err).equal(null); expect(response).equal('skill'); done(); }); }); }); describe('# validate ui.getSkillMetaSrc', () => { beforeEach(() => { sinon.stub(inquirer, 'prompt'); }); afterEach(() => { sinon.restore(); }); it('| get skillMeta src but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.getSkillMetaSrc((err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Skill package path: ', type: 'input', default: './skill-package', }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| get skillMeta src with user input succeeds', (done) => { // setup sinon.stub(fs, 'existsSync').returns(true); inquirer.prompt.resolves({ skillMetaSrc: 'src' }); // call ui.getSkillMetaSrc((err, response) => { // verify expect(inquirer.prompt.args[0][0][0].validate('src')).equal(true); expect(err).equal(null); expect(response).equal('src'); done(); }); }); it('| check the validate logic from inquirer and path is empty', (done) => { // setup inquirer.prompt.resolves({ skillMetaSrc: 'src' }); // call ui.getSkillMetaSrc(() => { // verify expect(inquirer.prompt.args[0][0][0].validate(' ')) .equal('Path for skill package cannot be empty.'); done(); }); }); it('| check the validate logic from inquirer and file does not exist', (done) => { // setup sinon.stub(fs, 'existsSync').returns(false); inquirer.prompt.resolves({ skillMetaSrc: 'src' }); // call ui.getSkillMetaSrc(() => { // verify expect(inquirer.prompt.args[0][0][0].validate('path')) .equal('File path does not exist.'); done(); }); }); }); describe('# validate ui.getCodeSrcForRegion', () => { const TEST_REGION = 'region'; beforeEach(() => { sinon.stub(inquirer, 'prompt'); }); afterEach(() => { sinon.restore(); }); it('| ask for code source but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.getCodeSrcForRegion(TEST_REGION, (err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: `Lambda code path for ${TEST_REGION} region (leave empty to not deploy Lambda): `, type: 'input', default: './lambda', }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| ask for code source and succeeds', (done) => { // setup sinon.stub(fs, 'existsSync').returns(true); inquirer.prompt.resolves({ skillCodeSrc: 'src' }); // call ui.getCodeSrcForRegion(TEST_REGION, (err, response) => { // verify expect(inquirer.prompt.args[0][0][0].validate('src')).equal(true); expect(err).equal(null); expect(response).equal('src'); done(); }); }); it('| ask for code source and file path not exists', (done) => { // setup sinon.stub(fs, 'existsSync').returns(false); inquirer.prompt.resolves({ skillCodeSrc: 'src' }); // call ui.getCodeSrcForRegion(TEST_REGION, () => { // verify expect(inquirer.prompt.args[0][0][0].validate('path')) .equal('File path does not exist.'); done(); }); }); }); describe('# validate ui.getSkillInfra', () => { beforeEach(() => { sinon.stub(inquirer, 'prompt'); }); afterEach(() => { sinon.restore(); }); it('| get skillInfra but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.getSkillInfra((err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Use AWS CloudFormation to deploy Lambda? ', type: 'confirm', default: true, }); validateInquirerConfig(inquirer.prompt.args[0][0][1], { message: 'Lambda runtime: ', type: 'input', default: 'nodejs10.x', }); validateInquirerConfig(inquirer.prompt.args[0][0][2], { message: 'Lambda handler: ', type: 'input', default: 'index.handler', }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| get skillInfra with user input succeeds', (done) => { // setup const TEST_ANSWER = { isUsingCfn: true, runtime: 'runtime', handler: 'handler' }; inquirer.prompt.resolves(TEST_ANSWER); // call ui.getSkillInfra((err, response) => { // verify expect(err).equal(null); expect(response).deep.equal(TEST_ANSWER); done(); }); }); }); describe('# validate ui.showPreviewAndConfirm', () => { const TEST_ROOT_PATH = 'root'; const TEST_ASK_RESOURCES_JSON = 'resources json'; const TEST_ASK_STATES_JSON = 'states json'; const TEST_ASK_RESOURCES = 'resources'; const TEST_ASK_STATES = 'states'; const TEST_RESOURCES_COFNIG = { askResources: TEST_ASK_RESOURCES, askStates: TEST_ASK_STATES }; beforeEach(() => { infoStub = sinon.stub(); sinon.stub(Messenger, 'getInstance').returns({ info: infoStub }); sinon.stub(inquirer, 'prompt'); sinon.stub(JsonView, 'toString'); JsonView.toString.withArgs(TEST_ASK_RESOURCES).returns(TEST_ASK_RESOURCES_JSON); JsonView.toString.withArgs(TEST_ASK_STATES).returns(TEST_ASK_STATES_JSON); }); afterEach(() => { sinon.restore(); }); it('| show preview and ask for confirm but error happens', (done) => { // setup inquirer.prompt.rejects(TEST_ERROR); // call ui.showPreviewAndConfirm(TEST_ROOT_PATH, TEST_RESOURCES_COFNIG, (err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Does this look correct? ', type: 'confirm', default: true, }); expect(infoStub.args[0][0]).equal(` Writing to ${path.join(TEST_ROOT_PATH, CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG)}: ${TEST_ASK_RESOURCES_JSON} Writing to ${path.join(TEST_ROOT_PATH, CONSTANTS.FILE_PATH.HIDDEN_ASK_FOLDER, CONSTANTS.FILE_PATH.ASK_STATES_JSON_CONFIG)}: ${TEST_ASK_STATES_JSON} `); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| show preview and ask for confirm with user input succeeds', (done) => { // setup inquirer.prompt.resolves({ confirmPreview: true }); // call ui.showPreviewAndConfirm(TEST_ROOT_PATH, TEST_RESOURCES_COFNIG, (err, response) => { // verify expect(err).equal(null); expect(response).equal(true); done(); }); }); }); describe('# validate ui.getProjectFolderName', () => { beforeEach(() => { infoStub = sinon.stub(); sinon.stub(inquirer, 'prompt'); sinon.stub(Messenger, 'getInstance').returns({ info: infoStub }); }); afterEach(() => { sinon.restore(); }); it('| confirm project folder name from user fails, expect error thrown', (done) => { // setup const TEST_DEFAULT_NAME = 'TEST_DEFAULT_NAME'; inquirer.prompt.rejects(TEST_ERROR); // call ui.getProjectFolderName(TEST_DEFAULT_NAME, (err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Please type in your folder name for the skill project (alphanumeric): ', type: 'input', default: TEST_DEFAULT_NAME, }); expect(err.name).equal(TEST_ERROR); expect(response).equal(undefined); done(); }); }); it('| confirm project folder name from user', (done) => { // setup const TEST_DEFAULT_NAME = 'HOSTED-SKILL_NAME@'; const TEST_FILTERED_NAME = 'HOSTEDSKILLNAME'; inquirer.prompt.resolves({ projectFolderName: TEST_FILTERED_NAME }); // call ui.getProjectFolderName(TEST_DEFAULT_NAME, (err, response) => { // verify validateInquirerConfig(inquirer.prompt.args[0][0][0], { message: 'Please type in your folder name for the skill project (alphanumeric): ', type: 'input', default: TEST_DEFAULT_NAME, name: 'projectFolderName', }); expect(err).equal(null); expect(response).equal(TEST_FILTERED_NAME); done(); }); }); it('| project folder name from user with NonAlphanumeric filter is empty, expect error thrown', (done) => { // setup const TEST_DEFAULT_NAME = 'HOSTED-SKILL_NAME@'; inquirer.prompt.resolves({ projectFolderName: TEST_DEFAULT_NAME }); // call ui.getProjectFolderName(TEST_DEFAULT_NAME, () => { // verify expect(inquirer.prompt.args[0][0][0].validate(TEST_DEFAULT_NAME)).equal(true); done(); }); }); it('| project folder name from user with NonAlphanumeric filter is valid, expect return true', (done) => { // setup const TEST_DEFAULT_NAME = '@_@'; const TEST_EMPTY_ERROR = 'Project folder name should consist of alphanumeric character(s) plus "-" only.'; inquirer.prompt.resolves({ projectFolderName: TEST_DEFAULT_NAME }); // call ui.getProjectFolderName(TEST_DEFAULT_NAME, () => { // verify expect(inquirer.prompt.args[0][0][0].validate(TEST_DEFAULT_NAME)) .equal(TEST_EMPTY_ERROR); done(); }); }); }); });