@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
157 lines (130 loc) • 5.17 kB
text/typescript
import { diskUtil, HASH_SPRUCE_DIR } from '@sprucelabs/spruce-skill-utils'
import { test, assert } from '@sprucelabs/test-utils'
import AbstractCliTest from '../../../tests/AbstractCliTest'
export default class SettingUpASkill extends AbstractCliTest {
protected static async failsWithBadParams() {
const cli = await this.Cli()
await assert.doesThrowAsync(async () => {
await cli.installFeatures({
features: [
{
// @ts-ignore
code: 'skill',
options: {
// @ts-ignore
name2: 'test',
description: 'This is such a good skill!',
},
},
],
})
}, 'name')
}
protected static async failsHealthCheckWithNothingInstalled() {
const cli = await this.Cli()
const health = await cli.checkHealth()
assert.isEqual(health.skill.status, 'failed')
assert.doesInclude(health, {
'skill.errors[].options.code': 'SKILL_NOT_INSTALLED',
})
}
protected static async getsAFailedHealthCheckWhenIndexFileIsMoved() {
const cli = await this.installSkill()
diskUtil.moveFile(
this.resolvePath('src', 'index.ts'),
this.resolvePath('src', 'index2.ts')
)
const health = await cli.checkHealth()
assert.isEqual(health.skill.status, 'failed')
assert.doesInclude(health, {
'skill.errors[].options.code': 'BOOT_ERROR',
})
}
private static async installSkill() {
const fixture = this.FeatureFixture()
const cli = await fixture.installCachedFeatures('skills')
return cli
}
protected static async getsAGoodHealthCheckAndNothingElse() {
const cli = await this.installSkill()
const hashSpruceDir = this.resolveHashSprucePath()
assert.isTrue(diskUtil.doesDirExist(hashSpruceDir))
const health = await cli.checkHealth()
if (health.skill?.errors && health.skill.errors.length > 0) {
assert.fail(health.skill.errors?.[0].message)
}
assert.isEqualDeep(health, { skill: { status: 'passed' } })
}
protected static async reportsProperInstallResults() {
const cli = await this.Cli()
const results = await cli.installFeatures({
features: [
{
code: 'skill',
options: {
name: 'Transfer file check skill',
description: 'For tracking files copied count',
},
},
],
})
assert.isTruthy(results.files)
assert.isAbove(results.files.length, 0)
const generateFiles = results.files.filter(
(file) => file.action === 'generated'
)
assert.isEqual(generateFiles.length, results.files.length)
assert.isTruthy(results.packagesInstalled)
assert.isAbove(results.packagesInstalled.length, 0)
const hiddenFiles = results.files.filter((file) => file.name[0] === '.')
assert.isAbove(hiddenFiles.length, 0)
this.assertDevDependenciesExist()
this.assertSkillNameIsSaved()
}
private static assertSkillNameIsSaved() {
const env = this.Service('env')
assert.isTruthy(env.get('SKILL_NAME'))
assert.isEqual(env.get('SKILL_NAME'), 'Transfer file check skill')
}
protected static async canAcceptOptionalDestination() {
const cli = await this.Cli()
const results = await cli.installFeatures({
features: [
{
code: 'skill',
options: {
name: 'Transfer file check skill',
description: 'For tracking files copied count',
destination: 'taco',
},
},
],
})
assert.isTrue(diskUtil.doesDirExist(this.resolvePath('taco')))
assert.isFalse(diskUtil.doesDirExist(this.resolvePath('.env')))
assert.isTrue(diskUtil.doesDirExist(this.resolvePath('taco', '.env')))
assert.isFalse(diskUtil.doesFileExist(this.resolvePath('package.json')))
assert.isFalse(diskUtil.doesFileExist(this.resolvePath('src')))
assert.isFalse(diskUtil.doesFileExist(this.resolvePath('node_modules')))
assert.isFalse(
diskUtil.doesFileExist(this.resolvePath(HASH_SPRUCE_DIR))
)
assert.isTrue(
diskUtil.doesFileExist(this.resolvePath('taco', 'package.json'))
)
const first = results.files?.[0]
assert.isTruthy(first)
assert.doesInclude(first.path, 'taco')
}
protected static assertDevDependenciesExist() {
const pkg = this.Service('pkg')
const devDependencies = pkg.get('devDependencies')
assert.isTruthy(devDependencies)
}
}