feat(scripts): pnpm work CLI — rebuild-state, status, next
This commit is contained in:
42
scripts/work/cli.test.mjs
Normal file
42
scripts/work/cli.test.mjs
Normal file
@@ -0,0 +1,42 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { execSync } from "node:child_process";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const CLI = path.join(__dirname, "cli.mjs");
|
||||
|
||||
function run(args) {
|
||||
try {
|
||||
return execSync(`node "${CLI}" ${args}`, { encoding: "utf8" });
|
||||
} catch (e) {
|
||||
return e.stdout + e.stderr;
|
||||
}
|
||||
}
|
||||
|
||||
describe("pnpm work cli", () => {
|
||||
it("prints usage when no subcommand is given", () => {
|
||||
const out = run("");
|
||||
expect(out).toContain("Usage:");
|
||||
expect(out).toContain("rebuild-state");
|
||||
expect(out).toContain("status");
|
||||
expect(out).toContain("next");
|
||||
});
|
||||
|
||||
it("rebuild-state writes _state.json", () => {
|
||||
const out = run("rebuild-state");
|
||||
expect(out).toContain("Rebuilt");
|
||||
expect(out).toContain("epic");
|
||||
});
|
||||
|
||||
it("status prints a tree", () => {
|
||||
const out = run("status");
|
||||
// We expect at least one epic-line marker character
|
||||
expect(out).toMatch(/[✓→○]/);
|
||||
});
|
||||
|
||||
it("next prints the next non-done story OR confirms all done", () => {
|
||||
const out = run("next");
|
||||
expect(out.length).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user