diff --git a/README.md b/README.md index 99f5a34f..e069b64c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # octoherd-script -form8ion plugin to manage script projects for octoherd +[form8ion](https://github.com/form8ion) plugin to manage script projects for +[octoherd](https://github.com/octoherd) diff --git a/src/canary-test.js b/src/canary-test.js deleted file mode 100644 index 98ac6072..00000000 --- a/src/canary-test.js +++ /dev/null @@ -1,7 +0,0 @@ -import {assert} from 'chai'; - -suite('canary test', () => { - test('that mocha is wired together correctly', () => { - assert.isTrue(true); - }); -}); diff --git a/src/scaffolder-test.js b/src/scaffolder-test.js new file mode 100644 index 00000000..0cec1458 --- /dev/null +++ b/src/scaffolder-test.js @@ -0,0 +1,28 @@ +import {promises as fs} from 'fs'; + +import any from '@travi/any'; +import sinon from 'sinon'; +import {assert} from 'chai'; + +import scaffold from './scaffolder'; + +suite('scaffold script', () => { + let sandbox; + + setup(() => { + sandbox = sinon.createSandbox(); + + sandbox.stub(fs, 'writeFile'); + }); + + teardown(() => sandbox.restore()); + + test('that the script is scaffolded', async () => { + const projectRoot = any.string(); + + const {tags} = await scaffold({projectRoot}); + + assert.calledWith(fs.writeFile, `${projectRoot}/index.js`, 'export async function script(octokit, repository) {}'); + assert.deepEqual(tags, ['octoherd-script']); + }); +}); diff --git a/src/scaffolder.js b/src/scaffolder.js index 0042b643..f09437db 100644 --- a/src/scaffolder.js +++ b/src/scaffolder.js @@ -1,3 +1,7 @@ -export default function () { - return undefined; +import {promises as fs} from 'fs'; + +export default async function ({projectRoot}) { + await fs.writeFile(`${projectRoot}/index.js`, 'export async function script(octokit, repository) {}'); + + return {tags: ['octoherd-script']}; } diff --git a/test/integration/features/scaffolder.feature b/test/integration/features/scaffolder.feature index f9140d92..be0e79f0 100644 --- a/test/integration/features/scaffolder.feature +++ b/test/integration/features/scaffolder.feature @@ -2,3 +2,5 @@ Feature: Scaffolder Scenario: Scaffold When the project is scaffolded + Then the script file is bootstrapped + And project metadata is generated diff --git a/test/integration/features/step_definitions/common-steps.mjs b/test/integration/features/step_definitions/common-steps.mjs index c675bab1..c97fa96f 100644 --- a/test/integration/features/step_definitions/common-steps.mjs +++ b/test/integration/features/step_definitions/common-steps.mjs @@ -1,12 +1,16 @@ import {dirname, resolve} from 'node:path'; import {fileURLToPath} from 'node:url'; -import {After, When} from '@cucumber/cucumber'; +import {After, Before, When} from '@cucumber/cucumber'; import stubbedFs from 'mock-fs'; const __dirname = dirname(fileURLToPath(import.meta.url)); const stubbedNodeModules = stubbedFs.load(resolve(__dirname, '..', '..', '..', '..', 'node_modules')); +Before(function () { + this.projectRoot = process.cwd(); +}) + After(function () { stubbedFs.restore(); }); @@ -19,5 +23,5 @@ When('the project is scaffolded', async function () { node_modules: stubbedNodeModules }); - await scaffold({projectRoot: process.cwd()}); + this.result = await scaffold({projectRoot: this.projectRoot}); }); diff --git a/test/integration/features/step_definitions/metadata-steps.mjs b/test/integration/features/step_definitions/metadata-steps.mjs new file mode 100644 index 00000000..cc4f7f87 --- /dev/null +++ b/test/integration/features/step_definitions/metadata-steps.mjs @@ -0,0 +1,8 @@ +import {Then} from '@cucumber/cucumber'; +import {assert} from 'chai'; + +Then('project metadata is generated', async function () { + const {tags} = this.result; + + assert.deepEqual(tags, ['octoherd-script']); +}); diff --git a/test/integration/features/step_definitions/script-steps.mjs b/test/integration/features/step_definitions/script-steps.mjs new file mode 100644 index 00000000..0c536c6b --- /dev/null +++ b/test/integration/features/step_definitions/script-steps.mjs @@ -0,0 +1,10 @@ +import {promises as fs} from 'fs'; + +import {Then} from '@cucumber/cucumber'; +import {assert} from 'chai'; + +Then('the script file is bootstrapped', async function () { + const scriptContent = await fs.readFile(`${this.projectRoot}/index.js`, 'utf-8'); + + assert.equal(scriptContent, `export async function script(octokit, repository) {}`); +});