@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
167 lines (135 loc) • 5.1 kB
text/typescript
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
import { test, assert } from '@sprucelabs/test-utils'
import CommandServiceImpl from '../../../services/CommandService'
import PkgService from '../../../services/PkgService'
import AbstractCliTest from '../../../tests/AbstractCliTest'
import uiAssert from '../../../tests/utilities/uiAssert.utility'
export default class UpgradingANodeModuleTest extends AbstractCliTest {
private static pkg: PkgService
protected static async beforeEach() {
await super.beforeEach()
await this.FeatureFixture().installCachedFeatures('everythingInNode')
this.pkg = this.Service('pkg')
const featureInstaller = this.featureInstaller
featureInstaller.markAsPermanentlySkipped('skill')
}
protected static async buildErrorsGetPassedThroughToResults() {
CommandServiceImpl.fakeCommand(/yarn (add|install)/gis, { code: 0 })
CommandServiceImpl.fakeCommand(/yarn clean.build/gis, { code: 1 })
CommandServiceImpl.fakeCommand(/yarn build.dev/gis, { code: 0 })
await this.emitter.on('feature.did-execute', () => {
return {
errors: undefined,
}
})
const results = await this.Action('node', 'upgrade').execute({})
assert.isTruthy(results.errors)
}
protected static async upgradingWritesExpectedFiles() {
CommandServiceImpl.fakeCommand(/build/gis, { code: 0 })
const shouldNotBeFound = [
'src/.spruce/skill.ts',
'src/.spruce/features',
]
diskUtil.deleteDir(this.resolveHashSprucePath('features'))
const results = await this.upgrade()
assert.isFalsy(results.errors)
for (const search of shouldNotBeFound) {
const doesExist = diskUtil.doesFileExist(this.resolvePath(search))
assert.isFalse(doesExist, `Should not have found ${search}`)
}
}
protected static async shouldReWriteNodeDirsAndSkipIndex() {
for (const file of ['tsconfig.json', 'src/index.ts']) {
const tsConfig = this.resolvePath(file)
diskUtil.writeFile(tsConfig, 'beenChanged')
}
this.fakeYarn()
const promise = this.upgrade()
await uiAssert.assertRendersConfirmWriteFile(this.ui)
assert.isEqual(
diskUtil.readFile(this.resolvePath('src/index.ts')),
'beenChanged'
)
await promise
}
protected static async resolvePathAliasesIsADevDependencyInNodeModules() {
this.assertResolvePathAliasesIsDevDependency()
await this.upgrade()
this.assertResolvePathAliasesIsDevDependency()
}
protected static async movesResolvePathAliasesToDevDependencyOnUpgrade() {
const version = this.pkg.get([
'devDependencies',
'@sprucelabs/resolve-path-aliases',
])
this.pkg.unset(['devDependencies', '@sprucelabs/resolve-path-aliases'])
this.pkg.set({
path: ['dependencies', '@sprucelabs/resolve-path-aliases'],
value: version,
})
await this.upgrade()
this.assertResolvePathAliasesIsDevDependency()
}
protected static async removesBuildFromScriptsIfMatchesBrokenBuild() {
this.pkg.set({
path: ['scripts', 'build'],
value: 'yarn run build.tsc --sourceMap ; yarn run resolve-paths',
})
this.fakeYarn()
await this.upgrade()
const build = this.pkg.get(['scripts', 'build'])
assert.isFalsy(
build,
'Should not have build script since it matches broken build'
)
}
protected static async doesNotRemoveBuildFromScriptsIfDoesNotMatchBrokenBuild() {
const value = 'yarn run build.tsc --sourceMap'
this.pkg.set({
path: ['scripts', 'build'],
value,
})
this.fakeYarn()
await this.upgrade()
const build = this.pkg.get(['scripts', 'build'])
assert.isEqual(
build,
value,
'Should have build script since it does not match broken build'
)
}
private static fakeYarn() {
CommandServiceImpl.fakeCommand(/yarn/gi, {
code: 0,
})
}
private static assertResolvePathAliasesIsDevDependency() {
const devVersion = this.pkg.get([
'devDependencies',
'@sprucelabs/resolve-path-aliases',
])
assert.isTruthy(
devVersion,
'Should have resolve path aliases as a dev dependency'
)
const prodVersion = this.pkg.get([
'dependencies',
'@sprucelabs/resolve-path-aliases',
])
assert.isFalsy(
prodVersion,
'Should not have resolve path aliases as a prod dependency'
)
}
private static async upgrade() {
return await this.Action('node', 'upgrade').execute({})
}
}