@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
161 lines (139 loc) • 4.29 kB
text/typescript
import os from 'os'
import pathUtil from 'path'
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
import { assert } from '@sprucelabs/test-utils'
import dotenv from 'dotenv'
import { GeneratedFile } from '../../types/cli.types'
import durationUtil from '../../utilities/duration.utility'
dotenv.config({ quiet: true })
function hasArg(regex: RegExp) {
return !!process.argv?.find((arg) => arg.search(regex) > -1)
}
const testUtil = {
shouldClearCache() {
return hasArg(/clear.*?cache/gi)
},
isCacheEnabled() {
return !hasArg(/no.*?cache/gi)
},
resolveTestDir(cacheKey = '') {
return diskUtil.resolvePath(
this.getTestRootDir(),
'spruce-cli',
cacheKey
)
},
shouldCleanupTestSkillDirs() {
return process.env.CLEANUP_TEST_SKILL_DIRS !== 'false'
},
shouldCleanupAfterEach() {
return (
this.shouldCleanupTestSkillDirs() &&
process.env.CLEANUP_TEST_SKILL_DIRS_ON === 'afterEach'
)
},
shouldCleanupAfterAll() {
return (
this.shouldCleanupTestSkillDirs() &&
process.env.CLEANUP_TEST_SKILL_DIRS_ON !== 'afterEach'
)
},
getTestRootDir() {
return process.env.TEST_CACHE_ROOT_DIR ?? pathUtil.join(os.tmpdir())
},
assertCountsByAction(
files: GeneratedFile[] | undefined,
options: {
generated: number
updated: number
skipped: number
}
) {
const generated = (files ?? []).filter(
(f) => f.action === 'generated'
).length
const updated = (files ?? []).filter(
(f) => f.action === 'updated'
).length
const skipped = (files ?? []).filter(
(f) => f.action === 'skipped'
).length
assert.isEqual(
generated,
options.generated,
`Generated the wrong number of files. Got ${generated} but expected ${options.generated}.`
)
assert.isEqual(
updated,
options.updated,
`Updated the wrong number of files. Got ${updated} but expected ${options.updated}.`
)
assert.isEqual(
skipped,
options.skipped,
`Skipped the wrong number of files. Got ${skipped} but expected ${options.skipped}.`
)
},
assertFileByNameInGeneratedFiles(
name: string | RegExp,
files: GeneratedFile[] | undefined
): string {
const file = (files ?? []).find((f) => f.name.search(name) > -1)?.path
assert.isTruthy(
file,
`file named '${name}' not found in generated files.\n\n${JSON.stringify(
files ?? [],
null,
2
)}`
)
return file
},
assertFileByPathInGeneratedFiles(
path: string | RegExp,
files: GeneratedFile[] | undefined
): string {
const file = (files ?? []).find((f) => f.path.search(path) > -1)?.path
assert.isTruthy(
file,
`file with path '${path}' not found in generated files.\n\n${JSON.stringify(
files ?? [],
null,
2
)}`
)
return file
},
startTime: 0,
startLogTimer() {
this.startTime = new Date().getTime()
},
log(...args: any[]) {
//@ts-ignore
const prefix = global.activeTest
? //@ts-ignore
`${global.activeTest?.file}::${global.activeTest?.test} :: `
: ''
if (process.env.TEST_LOG_FILTER) {
const match = prefix.search(
new RegExp(process.env.TEST_LOG_FILTER, 'igm')
)
if (match < 0) {
return
}
}
process.stderr.write(
prefix + this.getTimeSpentFormatted() + ': ' + args.join(' ')
)
},
getTimeSpent() {
const now = new Date().getTime()
const delta = now - this.startTime
return delta
},
getTimeSpentFormatted() {
const spent = this.getTimeSpent()
return durationUtil.msToFriendly(spent)
},
}
export default testUtil