* feat(plan-phase): add ADR ingest express path for approved enhancement #3209 * fix(review): address coderabbit doc note and brittle section-number assertion
102 lines
3.2 KiB
JavaScript
102 lines
3.2 KiB
JavaScript
const { test, describe } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
const {
|
|
parseAdrMarkdown,
|
|
shouldRejectAdrStatus,
|
|
} = require('../get-shit-done/bin/lib/adr-parser.cjs');
|
|
|
|
describe('adr-parser', () => {
|
|
test('maps common ADR header synonyms into canonical fields', () => {
|
|
const markdown = [
|
|
'# ADR-0010: Deepening Roadmap',
|
|
'',
|
|
'## Status',
|
|
'Accepted',
|
|
'',
|
|
'## Background',
|
|
'We need a safer ingest path.',
|
|
'',
|
|
'## Decision',
|
|
'- Add `--ingest` flag.',
|
|
'',
|
|
'## Considered Options',
|
|
'- Keep only `--prd`.',
|
|
'',
|
|
'## Out of Scope',
|
|
'- Remote URL ingest.',
|
|
'',
|
|
'## Future Work',
|
|
'- Add URL ingestion later.',
|
|
'',
|
|
'## Dependencies',
|
|
'- ADR-0002',
|
|
'',
|
|
'## Consequences',
|
|
'- Positive: fewer manual transforms.',
|
|
'- Negative: parser maintenance overhead.',
|
|
].join('\n');
|
|
|
|
const out = parseAdrMarkdown(markdown, { sourcePath: 'docs/adr/0010.md' });
|
|
|
|
assert.equal(out.title, 'ADR-0010: Deepening Roadmap');
|
|
assert.equal(out.status, 'accepted');
|
|
assert.equal(out.source_path, 'docs/adr/0010.md');
|
|
assert.ok(out.context.includes('safer ingest path'));
|
|
assert.deepEqual(out.decisions, ['Add `--ingest` flag.']);
|
|
assert.deepEqual(out.options_considered, ['Keep only `--prd`.']);
|
|
assert.deepEqual(out.out_of_scope, ['Remote URL ingest.']);
|
|
assert.deepEqual(out.deferred, ['Add URL ingestion later.']);
|
|
assert.deepEqual(out.dependencies, ['ADR-0002']);
|
|
});
|
|
|
|
test('splits umbrella consequences into positive and negative streams', () => {
|
|
const markdown = [
|
|
'# ADR',
|
|
'',
|
|
'## Consequences',
|
|
'- Positive: rollout is faster.',
|
|
'- Negative: complexity increases.',
|
|
'- Success: clear metrics.',
|
|
'- Drawback: migration toil.',
|
|
].join('\n');
|
|
|
|
const out = parseAdrMarkdown(markdown, { sourcePath: 'docs/adr/0001.md' });
|
|
|
|
assert.deepEqual(out.consequences_positive, [
|
|
'Positive: rollout is faster.',
|
|
'Success: clear metrics.',
|
|
]);
|
|
assert.deepEqual(out.consequences_negative, [
|
|
'Negative: complexity increases.',
|
|
'Drawback: migration toil.',
|
|
]);
|
|
});
|
|
|
|
test('tracks update/amendment sections as overrides', () => {
|
|
const markdown = [
|
|
'# ADR',
|
|
'',
|
|
'## Decision',
|
|
'- First decision.',
|
|
'',
|
|
'## Update — locked design',
|
|
'- Supersede with second decision.',
|
|
].join('\n');
|
|
|
|
const out = parseAdrMarkdown(markdown, { sourcePath: 'docs/adr/0002.md' });
|
|
assert.ok(out.updates.length >= 1);
|
|
assert.ok(out.updates[0].heading.toLowerCase().includes('update'));
|
|
assert.ok(out.updates[0].entries.includes('Supersede with second decision.'));
|
|
});
|
|
|
|
test('reject-status helper blocks superseded/rejected/deprecated', () => {
|
|
assert.equal(shouldRejectAdrStatus('superseded'), true);
|
|
assert.equal(shouldRejectAdrStatus('rejected'), true);
|
|
assert.equal(shouldRejectAdrStatus('deprecated'), true);
|
|
assert.equal(shouldRejectAdrStatus('accepted'), false);
|
|
assert.equal(shouldRejectAdrStatus('proposed'), false);
|
|
assert.equal(shouldRejectAdrStatus(''), false);
|
|
});
|
|
});
|