import assert from 'node:assert/strict'; import fs from 'node:fs'; import { spawnSync } from 'node:child_process'; import { procurementNavigation, activeProcurementEntry, } from '../resources/js/lib/procurement-navigation.ts'; const result = spawnSync( 'php', ['artisan', 'route:list', '--json', '--except-vendor'], { encoding: 'utf8' }, ); assert.equal(result.status, 0, result.stderr); const routes = JSON.parse(result.stdout); const rows = new Map(); for (const role of [ 'admin', 'procurement', 'finance', 'department_head', 'warehouse', 'requester', ]) { for (const payables of [false, true]) { const groups = procurementNavigation(role, payables); for (const group of groups) for (const entry of group.entries) { const uri = new URL(entry.path, 'http://local').pathname.slice( 1, ); const route = routes.find( (route) => route.uri === uri && route.method.split('|').includes('GET'), ); assert.ok( route, `${role}: ${entry.label} has no registered GET route (${uri})`, ); assert.equal( activeProcurementEntry(groups, entry.path), entry.id, `${role}: wrong active menu for ${entry.path}`, ); rows.set(`${role}:${entry.id}`, { role, group: group.label, id: entry.id, label: entry.label, path: entry.path, action: route.action, full_page: !!entry.fullPage, }); } assert.equal( groups.some((group) => group.entries.some( (entry) => entry.id === 'procurement_reports', ), ), ['admin', 'procurement', 'finance', 'department_head'].includes( role, ), ); } } const configuredFinance = procurementNavigation(['finance'], false).flatMap( (g) => g.entries, ); assert.equal( configuredFinance.some((e) => e.id === 'organization_parameters'), false, ); assert.equal( configuredFinance.some((e) => e.id === 'new_request'), false, ); const configuredMulti = procurementNavigation( ['finance', 'requester', 'admin'], false, ).flatMap((g) => g.entries); assert.equal( configuredMulti.some((e) => e.id === 'organization_parameters'), true, ); assert.equal( configuredMulti.some((e) => e.id === 'new_request'), true, ); const proof = { checked_at: new Date().toISOString(), result: 'passed', entries: rows.size, roles: 6, configurable_permissions_and_multiple_profiles: true, source: 'procurementNavigation compared with actual Laravel GET routes', scope: 'Menu routing, active entry and visibility contract; not a substitute for functional or visual workflow acceptance', rows: [...rows.values()], }; fs.writeFileSync( 'docs/proofs/menu-code-contract.json', JSON.stringify(proof, null, 2) + '\n', ); console.log( JSON.stringify({ result: proof.result, entries: proof.entries, roles: proof.roles, }), );