@litexa/core
Version:
Litexa, a programming language for writing Alexa skills
196 lines (157 loc) • 6.35 kB
text/coffeescript
###
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
###
{fake, match, spy} = require('sinon')
chai = require('chai')
chaiAsPromised = require('chai-as-promised')
chai.use(chaiAsPromised)
{assert, expect} = chai
fs = require 'fs'
SkillManifestGenerator = require('@src/command-line/generators/skillManifestGenerator')
describe 'SkillManifestGenerator', ->
describe '#description', ->
it 'has a class property to describe itself', ->
assert(SkillManifestGenerator.hasOwnProperty('description'), 'has a property description')
expect(SkillManifestGenerator.description).to.equal('skill manifest')
describe '#generate', ->
mockConfig = {
name: 'mock',
deployments: {
development: {
module: '@litexa/deploy-aws',
s3Configuration: {
bucketName: 'mock-litexa-assets'
},
askProfile: 'mock'
}
},
plugins: {}
}
loggerInterface = undefined
inquirer = undefined
options = undefined
beforeEach ->
options = {
root: '.',
configLanguage: 'javascript',
projectConfig: {
name: 'mock'
}
}
loggerInterface = {
log: () -> undefined
}
inquirer = {
prompt: fake.returns(Promise.resolve({storeTitleName: options.projectConfig.name}))
}
afterEach ->
for extension in ['coffee', 'js', 'json']
filename = "skill.#{extension}"
if fs.existsSync filename
fs.unlinkSync filename
it 'returns a promise', ->
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
assert.typeOf(skillManifestGenerator.generate(), 'promise', 'it returns a promise')
it "throws an error for extensions that aren't found", ->
options.configLanguage = 'unknownFormat'
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
testFn = ->
await skillManifestGenerator.generate()
assert.isRejected(testFn(), 'extension not found', 'throws an error')
it 'skips if the file already exists', ->
fs.writeFileSync 'skill.js', 'content', 'utf8'
logSpy = spy(loggerInterface, 'log')
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
data = fs.readFileSync 'skill.js', 'utf8'
assert(logSpy.calledOnceWith(match('existing skill.js found -> skipping creation')),
'informed user skipping generator')
assert(logSpy.neverCalledWith(match('creating')),
"doesn't misinform the user")
assert(data == 'content', 'did not override file')
it 'writes the manifest in JavaScript', ->
logSpy = spy(loggerInterface, 'log')
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
assert(logSpy.neverCalledWith(match('existing skill.js found -> skipping creation')),
"doesn't misinform the user")
assert(logSpy.calledWith(match('creating skill.js -> contains skill manifest and should
be version controlled')),
"informs it's writing the file and prompts user to version control it")
assert(fs.existsSync('skill.js'), 'wrote the actual file')
it 'writes the manifest in coffee', ->
options.configLanguage = 'coffee'
logSpy = spy(loggerInterface, 'log')
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
assert(logSpy.neverCalledWith(match('existing skill.coffee found -> skipping creation')),
"doesn't misinform the user")
assert(logSpy.calledWith(match('creating skill.coffee -> contains skill manifest and should
be version controlled')),
"informs it's writing the file and prompts user to version control it")
assert(fs.existsSync('skill.coffee'), 'wrote the actual file')
it 'writes the manifest in json', ->
options.configLanguage = 'json'
logSpy = spy(loggerInterface, 'log')
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
assert(logSpy.neverCalledWith(match('existing skill.json found -> skipping creation')),
"doesn't misinform the user")
assert(logSpy.calledWith(match('creating skill.json -> contains skill manifest and should
be version controlled')),
"informs it's writing the file and prompts user to version control it")
assert(fs.existsSync('skill.json'), 'wrote the actual file')
it 'prompts the user for input with a default store title', ->
options.projectConfig.name = 'sample'
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
assert(
inquirer.prompt.calledWith(
match({message: 'What would you like the skill store title of the project to be?
(default: "sample")'})
), 'prompted the user with default store title'
)
it 'prompts the user for input without a default store title', ->
options.projectConfig.name = 'AlexaEchoSkill'
skillManifestGenerator = new SkillManifestGenerator({
options,
logger: loggerInterface,
inputHandler: inquirer
})
await skillManifestGenerator.generate()
assert(
inquirer.prompt.calledWith(
match({message: 'What would you like the skill store title of the project to be?' })
), 'prompted the user without default store title'
)