commit9
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 20:02:30 +02:00
parent 6d14b4e6f0
commit c6373365bf
225 changed files with 15365 additions and 285 deletions
+26
View File
@@ -24,6 +24,18 @@ for (const role of [
]) {
for (const payables of [false, true]) {
const groups = procurementNavigation(role, payables);
assert.ok(
groups.length <= 6,
'Navigation must stay within six related functional groups',
);
const ids = groups.flatMap((group) =>
group.entries.map((entry) => entry.id),
);
assert.equal(
new Set(ids).size,
ids.length,
'Navigation entries must not be duplicated',
);
for (const group of groups)
for (const entry of group.entries) {
const uri = new URL(entry.path, 'http://local').pathname.slice(
@@ -68,6 +80,19 @@ for (const role of [
const configuredFinance = procurementNavigation(['finance'], false).flatMap(
(g) => g.entries,
);
const separate = procurementNavigation('admin', true);
assert.ok(separate.find((group) => group.id === 'purchasing').entries.every((entry) => !entry.path.startsWith('/pessoas')));
assert.ok(separate.find((group) => group.id === 'people').entries.every((entry) => entry.path.startsWith('/pessoas')));
for (const permission of ['people_service_prepare','people_service_review','people_staff_prepare','people_staff_review']) {
const entries = procurementNavigation([permission], false).flatMap((group) => group.entries);
assert.equal(entries.some((entry) => entry.id === 'people_hiring'), true);
assert.equal(entries.some((entry) => entry.id === 'company' || entry.id === 'invoices' || entry.id === 'new_request'), false);
}
for (const permission of ['people_registry_read','people_registry_manage']) {
const entries = procurementNavigation([permission],false).flatMap((group)=>group.entries);
assert.equal(entries.some((entry)=>entry.id==='people_registry'),true);
assert.equal(entries.some((entry)=>entry.id==='people_hiring'),false);
}
assert.equal(
configuredFinance.some((e) => e.id === 'organization_parameters'),
false,
@@ -94,6 +119,7 @@ const proof = {
entries: rows.size,
roles: 6,
configurable_permissions_and_multiple_profiles: true,
maximum_functional_groups: 6,
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()],
+16 -1
View File
@@ -46,6 +46,15 @@ for (const role of ['admin','procurement','finance','department_head','warehouse
const response = await request(entry.path,{inertia:!entry.fullPage});
assert.equal(response.status,200,role+' '+entry.path);
if (!entry.fullPage) assert(response.data?.component,role+' Inertia '+entry.path);
if (entry.id === 'new_request') assert.equal(typeof response.data.props.defaultTaxRate,'string','Configured VAT must reach new request lines');
if (entry.id === 'organization_parameters') assert.equal(typeof response.data.props.companyRules.default_tax_rate,'string','Administration must expose the VAT setting');
if (entry.id === 'organization_parameters') assert.equal(Object.values(response.data.props.comparisonPolicy.weights).reduce((sum, value)=>sum+value,0),100,'Comparison policy weights must reach administration');
if (entry.id === 'people_hiring') assert.equal(response.data.props.ready,true,'People hiring must be installed in the evaluation environment');
if (entry.id === 'people_hiring') {
assert.equal(typeof response.data.props.workdesk.counts.tasks,'number');
assert.equal(typeof response.data.props.workdesk.counts.approvals,'number');
assert(response.data.props.processes.data.every(p=>!('rules' in p)&&!('selection' in p)&&!('contract' in p)),'People index must not expose private process payloads');
}
assert.equal(activeProcurementEntry(groups,entry.path),entry.id,role+' active '+entry.path);
if (entry.id === 'my_drafts') {
assert.equal(response.data.props.filters.view,'mine');
@@ -63,6 +72,12 @@ const all = await request('/requisicoes?view=all',{inertia:true});
const requestId = all.data.props.requisitions.data[0]?.id;
const processLinks = [];
if (requestId) {
const comparison = await request('/requisicoes/'+requestId+'/cotacoes',{inertia:true});
assert.equal(comparison.status,200);
assert(Array.isArray(comparison.data.props.topIds));
assert(comparison.data.props.comparisonPolicy.minimum_proposals >= 1);
assert(comparison.data.props.comparisonPolicy.minimum_evaluators >= 1);
assert(comparison.data.props.quotations.every(q=>Array.isArray(q.ineligibility_reasons)));
assert.equal((await request('/requisicoes/'+requestId,{inertia:true})).status,200);
const process = await request('/requisicoes/'+requestId+'/processo',{inertia:true});
assert.equal(process.status,200);
@@ -91,5 +106,5 @@ assert.equal(activeProcurementEntry(groups,'/stock/operacoes'),'stock_operations
await fs.writeFile('docs/proofs/menu-links.json',JSON.stringify({checked_at:new Date().toISOString(),results,
request_detail_checked:!!requestId,invoice_count:invoices.data.props.invoices.data.length,
process_links_checked:[...new Set(processLinks)],
canonical_query_order:true,active_subroutes:true,business_history_unchanged:true,business_commands:0},null,2)+'\n');
canonical_query_order:true,active_subroutes:true,vat_setting_and_default_checked:true,comparison_ties_and_reasons_checked:!!requestId,business_history_unchanged:true,business_commands:0},null,2)+'\n');
console.log('All visible menu links passed for six roles, with active entries, query filters, detail links and unchanged business history.');