import test from 'node:test'; import assert from 'node:assert/strict'; import {readFileSync, existsSync} from 'node:fs'; const read = (path) => readFileSync(path, 'utf8'); test('portal identity and exact navigation contract', () => { const config = read('docusaurus.config.ts'); assert.match(config, /title: '3D Architecture Wizzard'/); assert.match(config, /baseUrl: '\/corp-v1-3darch\/corp-v1-3darch-documentation\/'/); const labels = [...config.matchAll(/label: '(User Tutorial|Scope|Architecture|Kanban|Ways Of Working|Engineering|Glossary)'/g)].map(m=>m[1]); assert.deepEqual(labels.slice(0,7), ['User Tutorial','Scope','Architecture','Kanban','Ways Of Working','Engineering','Glossary']); assert.ok(config.includes("hashed: 'filename'")); }); test('each area has a dedicated sidebar and required ordering', () => { for (const file of ['sidebars.ts','sidebarsScope.ts','sidebarsArchitecture.ts','sidebarsKanban.ts','sidebarsWaysOfWorking.ts','sidebarsEngineering.ts','sidebarsGlossary.ts']) assert.ok(existsSync(file), file); assert.ok(read('sidebarsKanban.ts').indexOf("'board'") < read('sidebarsKanban.ts').indexOf("'focus'")); assert.ok(read('sidebarsGlossary.ts').indexOf("'terms'") < read('sidebarsGlossary.ts').indexOf("'project-language'")); }); test('homepage publishes the required delivery record', () => { const home = read('src/pages/index.tsx'); for (const marker of ['3DARCH-PORTAL-KICKOFF-2026-08-31','interactive 3D application','Navigable browser POC','Linas ยท 3darch team','Application repository','Board record','README','Project skill']) assert.ok(home.includes(marker), marker); }); test('sharp light and dark UI contract is explicit', () => { const css = read('src/css/custom.css'); assert.match(css, /\*,\*::before,\*::after\{border-radius:0!important\}/); assert.match(css, /\[data-theme='dark'\]/); }); 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, //); 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(); assert.ok(existsSync(`data/scope/epics/${slug}.yml`), id); assert.ok(existsSync(`scope/epics/${slug}.md`), id); assert.ok(existsSync(`scope/epics/${slug}/features.md`), `${id} Features group`); 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, '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.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\"/); });