@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
180 lines (149 loc) • 5.63 kB
text/typescript
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
import { test, assert } from '@sprucelabs/test-utils'
import { errorAssert } from '@sprucelabs/test-utils'
import '@sprucelabs/spruce-store-plugin'
import CommandServiceImpl from '../../../services/CommandService'
import AbstractSkillTest from '../../../tests/AbstractSkillTest'
import testUtil from '../../../tests/utilities/test.utility'
export default class CreatingDataStoresTest extends AbstractSkillTest {
protected static skillCacheKey = 'stores'
()
protected static async hasCreateStoreAction() {
assert.isFunction(this.Action('store', 'create').execute)
}
()
protected static async getsNoStoresBackFromHealthCheck() {
const health = await this.cli.checkHealth({
shouldRunOnSourceFiles: true,
})
assert.isFalsy(health.skill.errors)
//@ts-ignore
assert.isTruthy(health.store)
//@ts-ignore
assert.isFalsy(health.store.errors)
//@ts-ignore
assert.isArray(health.store.stores)
//@ts-ignore
assert.isLength(health.store.stores, 0)
}
()
protected static async generatesValidStoreFile() {
const results = await this.Action('store', 'create').execute({
nameReadable: 'Person',
nameReadablePlural: 'People',
namePascal: 'Person',
})
assert.isFalsy(results.errors)
const path = testUtil.assertFileByNameInGeneratedFiles(
'People.store.ts',
results.files
)
await this.Service('typeChecker').check(path)
}
()
protected static async generatesAMapFile() {
const file = this.resolveHashSprucePath('stores', 'stores.ts')
assert.isTrue(diskUtil.doesFileExist(file))
await this.Service('typeChecker').check(file)
}
()
protected static async getsOneStoresBackFromHealthCheck() {
const health = await this.cli.checkHealth({
shouldRunOnSourceFiles: true,
})
//@ts-ignore
assert.isTruthy(health.store)
//@ts-ignore
assert.isFalsy(health.store.errors)
//@ts-ignore
assert.isLength(health.store.stores, 1)
//@ts-ignore
assert.isEqual(health.store.stores[0].name, 'People')
}
()
protected static async canGenerateASecondStoreFile() {
const results = await this.Action('store', 'create').execute({
nameReadable: 'Bid',
nameReadablePlural: 'Bids',
namePascal: 'Bid',
})
assert.isFalsy(results.errors)
const path = testUtil.assertFileByNameInGeneratedFiles(
'Bids.store.ts',
results.files
)
await this.Service('typeChecker').check(path)
}
()
protected static async getsSecondStoresBackFromHealthCheck() {
const health = await this.cli.checkHealth({
shouldRunOnSourceFiles: true,
})
//@ts-ignore
assert.isTruthy(health.store)
//@ts-ignore
assert.isFalsy(health.store.errors)
//@ts-ignore
assert.isLength(health.store.stores, 2)
//@ts-ignore
assert.isEqual(health.store.stores[0].name, 'Bids')
//@ts-ignore
assert.isEqual(health.store.stores[1].name, 'People')
}
()
protected static async errorsWhenGeneratingAStoreWithTheSameName() {
const results = await this.Action('store', 'create').execute({
nameReadable: 'Bid',
nameReadablePlural: 'Bids',
namePascal: 'Bid',
})
assert.isTruthy(results.errors)
errorAssert.assertError(results.errors[0], 'STORE_EXISTS')
}
()
protected static async storeFactoryAndStoresAreTyped() {
const results = await this.Action('store', 'create').execute({
nameReadable: 'Product',
nameReadablePlural: 'Products',
namePascal: 'Product',
})
const path = testUtil.assertFileByNameInGeneratedFiles(
'Products.store.ts',
results.files
)
const storeContents = diskUtil
.readFile(path)
.replace(
'type ProductsStoreOptions = UniversalStoreOptions',
'type ProductsStoreOptions = UniversalStoreOptions & {hello: string}'
)
diskUtil.writeFile(path, storeContents)
const testFile = this.resolveTestPath('store-test.ts.hbs')
const testContents = diskUtil.readFile(testFile)
const dest = this.resolvePath('src', 'test.ts')
diskUtil.writeFile(dest, testContents)
await this.Service('typeChecker').check(dest)
}
()
protected static async doesNotCreateAbstractTestFileBecauseTestIsNotInstalled() {
assert.isFalse(
diskUtil.doesFileExist(CreatingDataStoresTest.getAbstractTestPath())
)
}
()
protected static async upgradeRestoresDataStoreTypes() {
CommandServiceImpl.fakeCommand('yarn rebuild', {
code: 0,
})
CommandServiceImpl.fakeCommand(/yarn add/gis, {
code: 0,
})
const storesFile = this.resolveHashSprucePath('stores/stores.types.ts')
diskUtil.deleteFile(storesFile)
await this.Action('node', 'upgrade').execute({})
assert.isTrue(diskUtil.doesFileExist(storesFile))
}
private static getAbstractTestPath(): string {
return this.resolvePath('src', 'tests', 'AbstractDataStoreTest.ts')
}
}