160 lines
6.0 KiB
JavaScript
160 lines
6.0 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* CJS parity test — Workstream Inventory Builder generator.
|
|
*
|
|
* For every fixture, asserts that the compiled SDK ESM module and the
|
|
* generated CJS artifact produce byte-identical output.
|
|
*/
|
|
|
|
const { describe, test, before } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
// ─── Shared fixtures ──────────────────────────────────────────────────────────
|
|
|
|
function minimalInputs(overrides = {}) {
|
|
return {
|
|
name: 'my-ws',
|
|
projectDir: '/project',
|
|
workstreamDir: '/project/.planning/workstreams/my-ws',
|
|
phaseDirNames: [],
|
|
activeWorkstreamName: null,
|
|
phaseFilesCounts: [],
|
|
roadmapPhaseCount: 0,
|
|
stateProjection: { status: 'unknown', current_phase: null, last_activity: null },
|
|
filesExist: { roadmap: false, state: false, requirements: false },
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
const FIXTURES = [
|
|
{
|
|
label: 'empty inventory: no phase dirs, no STATE.md',
|
|
inputs: minimalInputs(),
|
|
},
|
|
{
|
|
label: 'one phase in_progress (partial plan completion)',
|
|
inputs: minimalInputs({
|
|
phaseDirNames: ['01-alpha'],
|
|
phaseFilesCounts: [{ directory: '01-alpha', planCount: 3, summaryCount: 1 }],
|
|
roadmapPhaseCount: 1,
|
|
stateProjection: { status: 'executing', current_phase: '01-alpha', last_activity: '2026-05-01' },
|
|
filesExist: { roadmap: true, state: true, requirements: false },
|
|
}),
|
|
},
|
|
{
|
|
label: 'one phase complete (summary_count >= plan_count)',
|
|
inputs: minimalInputs({
|
|
phaseDirNames: ['01-alpha'],
|
|
phaseFilesCounts: [{ directory: '01-alpha', planCount: 2, summaryCount: 2 }],
|
|
roadmapPhaseCount: 1,
|
|
stateProjection: { status: 'milestone complete', current_phase: null, last_activity: '2026-04-01' },
|
|
filesExist: { roadmap: true, state: true, requirements: true },
|
|
}),
|
|
},
|
|
{
|
|
label: 'one phase pending (plan_count is 0)',
|
|
inputs: minimalInputs({
|
|
phaseDirNames: ['01-alpha'],
|
|
phaseFilesCounts: [{ directory: '01-alpha', planCount: 0, summaryCount: 0 }],
|
|
roadmapPhaseCount: 1,
|
|
stateProjection: { status: 'planning', current_phase: null, last_activity: null },
|
|
}),
|
|
},
|
|
{
|
|
label: 'multiple phases with mixed statuses',
|
|
inputs: minimalInputs({
|
|
phaseDirNames: ['01-alpha', '02-beta', '03-gamma'],
|
|
phaseFilesCounts: [
|
|
{ directory: '01-alpha', planCount: 2, summaryCount: 2 },
|
|
{ directory: '02-beta', planCount: 3, summaryCount: 1 },
|
|
{ directory: '03-gamma', planCount: 0, summaryCount: 0 },
|
|
],
|
|
roadmapPhaseCount: 3,
|
|
stateProjection: { status: 'executing', current_phase: '02-beta', last_activity: '2026-05-10' },
|
|
filesExist: { roadmap: true, state: true, requirements: false },
|
|
}),
|
|
},
|
|
{
|
|
label: 'progress_percent clamps to 100 when completedPhases > roadmapPhaseCount',
|
|
inputs: minimalInputs({
|
|
phaseDirNames: ['01-alpha', '02-beta', '03-gamma'],
|
|
phaseFilesCounts: [
|
|
{ directory: '01-alpha', planCount: 1, summaryCount: 1 },
|
|
{ directory: '02-beta', planCount: 1, summaryCount: 1 },
|
|
{ directory: '03-gamma', planCount: 1, summaryCount: 1 },
|
|
],
|
|
roadmapPhaseCount: 1,
|
|
stateProjection: { status: 'milestone complete', current_phase: null, last_activity: null },
|
|
filesExist: { roadmap: true, state: true, requirements: false },
|
|
}),
|
|
},
|
|
{
|
|
label: 'active workstream marker: active: true when activeWorkstreamName === name',
|
|
inputs: minimalInputs({
|
|
name: 'my-ws',
|
|
activeWorkstreamName: 'my-ws',
|
|
}),
|
|
},
|
|
{
|
|
label: 'active: false when activeWorkstreamName is a different workstream',
|
|
inputs: minimalInputs({
|
|
name: 'my-ws',
|
|
activeWorkstreamName: 'other-ws',
|
|
}),
|
|
},
|
|
];
|
|
|
|
const IS_COMPLETED_FIXTURES = [
|
|
{ status: 'milestone complete', expected: true },
|
|
{ status: 'Milestone Complete', expected: true },
|
|
{ status: 'archived', expected: true },
|
|
{ status: 'Archived', expected: true },
|
|
{ status: 'executing', expected: false },
|
|
{ status: 'planning', expected: false },
|
|
{ status: 'unknown', expected: false },
|
|
{ status: '', expected: false },
|
|
];
|
|
|
|
// ─── Test suite ───────────────────────────────────────────────────────────────
|
|
|
|
describe('workstream-inventory-builder generator parity (ESM dist vs generated CJS)', () => {
|
|
let sdkBuild, cjsModule;
|
|
|
|
before(async () => {
|
|
// Dynamic import of the ESM SDK dist (use pathToFileURL since we're in CJS context)
|
|
const path = require('path');
|
|
const { pathToFileURL } = require('url');
|
|
const distPath = path.resolve(__dirname, '..', 'sdk', 'dist', 'workstream', 'builder.js');
|
|
sdkBuild = await import(pathToFileURL(distPath).href);
|
|
// CJS require of the generated artifact
|
|
cjsModule = require('../get-shit-done/bin/lib/workstream-inventory-builder.generated.cjs');
|
|
});
|
|
|
|
describe('buildWorkstreamInventory', () => {
|
|
for (const fixture of FIXTURES) {
|
|
test(fixture.label, () => {
|
|
const sdkResult = sdkBuild.buildWorkstreamInventory(fixture.inputs);
|
|
const cjsResult = cjsModule.buildWorkstreamInventory(fixture.inputs);
|
|
assert.deepStrictEqual(
|
|
cjsResult,
|
|
sdkResult,
|
|
`Parity failure for fixture "${fixture.label}"`,
|
|
);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('isCompletedInventory', () => {
|
|
for (const { status, expected } of IS_COMPLETED_FIXTURES) {
|
|
test(`isCompletedInventory("${status}") === ${expected}`, () => {
|
|
const sdkResult = sdkBuild.isCompletedInventory(status);
|
|
const cjsResult = cjsModule.isCompletedInventory(status);
|
|
assert.strictEqual(sdkResult, expected, `SDK result mismatch for "${status}"`);
|
|
assert.strictEqual(cjsResult, expected, `CJS result mismatch for "${status}"`);
|
|
assert.strictEqual(sdkResult, cjsResult, `Parity failure for "${status}"`);
|
|
});
|
|
}
|
|
});
|
|
});
|