docs: publish legacy feature catalogue
Build and publish 3D Architecture Wizzard documentation / build (pull_request) Successful in 22s
Build and publish 3D Architecture Wizzard documentation / build (pull_request) Successful in 22s
This commit is contained in:
@@ -26,16 +26,28 @@ test('sharp light and dark UI contract is explicit', () => {
|
||||
assert.match(css, /\[data-theme='dark'\]/);
|
||||
});
|
||||
|
||||
test('approved Epic catalogue is complete, governed, and reader-linked', () => {
|
||||
test('approved Epic and Feature catalogue is complete, governed, and reader-linked', () => {
|
||||
const sidebar = read('sidebarsScope.ts');
|
||||
const overview = read('scope/overview.md');
|
||||
const roadmap = read('scope/roadmap.md');
|
||||
const matrix = read('src/data/scopeIssues.ts');
|
||||
const matrixComponent = read('src/components/ScopeIssueMatrix.tsx');
|
||||
assert.match(matrixComponent, /item\.parent\?\.recordUrl/);
|
||||
assert.match(matrixComponent, /item\.requiredChildren/);
|
||||
assert.match(matrixComponent, /item\.dependencies/);
|
||||
assert.ok(sidebar.indexOf("'overview'") < sidebar.indexOf("'roadmap'"));
|
||||
assert.ok(sidebar.indexOf("label: 'Ideas'") < sidebar.indexOf("label: 'Questions'"));
|
||||
assert.ok(sidebar.indexOf("label: 'Questions'") < sidebar.indexOf("label: 'Epics'"));
|
||||
assert.match(overview, /<ScopeIssueMatrix \/>/);
|
||||
assert.match(roadmap, /All Epics remain in `IN_BACKLOG`/);
|
||||
assert.match(roadmap, /All Epics and Features remain in `IN_BACKLOG`/);
|
||||
|
||||
const expectedFeatureCounts = [8, 4, 5, 3, 2, 3, 2, 2, 1, 2];
|
||||
const packageJson = JSON.parse(read('package.json'));
|
||||
for (const script of ['data:index', 'data:validate', 'data:check']) assert.ok(packageJson.scripts[script], script);
|
||||
for (const path of ['data/scope/database.yml', 'data/scope/epics/index.yml', 'data/scope/features/index.yml', 'data/scope/indexes/epic-features.yml']) assert.ok(existsSync(path), path);
|
||||
const featureIndex = JSON.parse(read('data/scope/features/index.yml'));
|
||||
assert.equal(featureIndex.items.length, 32);
|
||||
const allRequiredFeatures = [];
|
||||
for (let number = 1; number <= 10; number += 1) {
|
||||
const id = `3DARCH-EP-${number}`;
|
||||
const slug = id.toLowerCase();
|
||||
@@ -45,10 +57,42 @@ test('approved Epic catalogue is complete, governed, and reader-linked', () => {
|
||||
const record = JSON.parse(read(`data/scope/epics/${slug}.yml`));
|
||||
assert.equal(record.id, id);
|
||||
assert.equal(record.status, 'IN_BACKLOG');
|
||||
assert.equal(record.status_source, 'EXACT');
|
||||
assert.equal(record.status_source, 'DERIVED');
|
||||
assert.equal(record.approval.approved_for_solution, false);
|
||||
assert.ok(record.legacy_evidence.length > 0);
|
||||
assert.equal(record.required_features.length, expectedFeatureCounts[number - 1]);
|
||||
allRequiredFeatures.push(...record.required_features);
|
||||
assert.ok(matrix.includes(`\"id\": \"${id}\"`));
|
||||
}
|
||||
assert.doesNotMatch(matrix, /type: \"Feature\"|type: \"Task\"|type: \"Idea\"/);
|
||||
|
||||
assert.equal(allRequiredFeatures.length, 32);
|
||||
assert.equal(new Set(allRequiredFeatures).size, 32);
|
||||
for (let number = 1; number <= 32; number += 1) {
|
||||
const id = `3DARCH-FT-${number}`;
|
||||
const slug = id.toLowerCase();
|
||||
assert.ok(existsSync(`data/scope/features/${slug}.yml`), id);
|
||||
const feature = JSON.parse(read(`data/scope/features/${slug}.yml`));
|
||||
assert.equal(feature.id, id);
|
||||
assert.equal(feature.type, 'Feature');
|
||||
assert.equal(feature.status, 'IN_BACKLOG');
|
||||
assert.equal(feature.status_source, 'EXACT');
|
||||
assert.equal(feature.approval.approved_for_solution, false);
|
||||
assert.equal(feature.approval.approved_for_implementation, false);
|
||||
assert.equal(feature.catalogue_decision.decision, 'Approved for documentation');
|
||||
assert.equal(feature.last_transition.event, 'Catalogue registration');
|
||||
assert.match(feature.last_transition.at, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
|
||||
assert.equal(new Set([feature.description, feature.user_problem, feature.expected_value, feature.scope]).size, 4);
|
||||
assert.ok(/^3DARCH-EP-(?:[1-9]|10)$/.test(feature.epic_id));
|
||||
assert.ok(feature.acceptance_outcomes.length >= 3);
|
||||
assert.ok(feature.legacy_evidence.length > 0);
|
||||
assert.ok(allRequiredFeatures.includes(id));
|
||||
assert.ok(existsSync(`scope/epics/${feature.epic_id.toLowerCase()}/features/${slug}.md`), `${id} reader page`);
|
||||
const featurePage = read(`scope/epics/${feature.epic_id.toLowerCase()}/features/${slug}.md`);
|
||||
assert.match(featurePage, /## Human approval/);
|
||||
assert.match(featurePage, /## Delivery status evidence/);
|
||||
assert.ok(existsSync(`scope/epics/${feature.epic_id.toLowerCase()}/features/${slug}/tasks.md`), `${id} Tasks group`);
|
||||
assert.ok(matrix.includes(`\"id\": \"${id}\"`));
|
||||
assert.ok(sidebar.includes(`epics/${feature.epic_id.toLowerCase()}/features/${slug}`));
|
||||
}
|
||||
assert.doesNotMatch(matrix, /\"type\": \"Task\"|\"type\": \"Idea\"/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user