Files
SGF/scripts/modular-development-http-proof.mjs
2026-11-02 08:06:45 +02:00

40 lines
3.2 KiB
JavaScript

import fs from 'node:fs';
import assert from 'node:assert/strict';
const state=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json','utf8'));
const privateData=JSON.parse(fs.readFileSync(state.root+'/private/development.json','utf8'));
const base=`http://127.0.0.1:${state.web_port}`;
const proof={synthetic_only:true,host:base,database_port:state.port,profiles:[],pending_associations_unchanged:true,visual_review:false};
for(const profile of privateData.profiles){
const jar=new Map();let csrf='',token='';
async function api(url,method='GET',body,status=200){
const r=await fetch(base+url,{method,headers:{Accept:'application/json','Content-Type':'application/json',Cookie:[...jar].map(([k,v])=>k+'='+v).join('; '),'X-CSRF-TOKEN':csrf,'X-SGF-Context':token,'Idempotency-Key':crypto.randomUUID()},...(body===undefined?{}:{body:JSON.stringify(body)})});
for(const cookie of r.headers.getSetCookie()){const [pair]=cookie.split(';');const at=pair.indexOf('=');jar.set(pair.slice(0,at),pair.slice(at+1));}
const data=await r.json();assert.equal(r.status,status,`${profile.role} ${method} ${url}: ${data.message||'unexpected status'}`);
if(data.csrf)csrf=data.csrf;if(data.context?.token)token=data.context.token;
return data;
}
await api('/api/session');await api('/api/login','POST',{email:profile.email,password:privateData.password});
const select=module_id=>api('/api/context','POST',{tenant_id:privateData.tenant_id,company_id:privateData.company_id,unit_id:privateData.unit_id,module_id});
const session=await select('commercial');
assert.equal(session.context.modules.length,6);assert(session.context.modules.every(m=>m.development));
const has=p=>session.context.grants.some(g=>g.permission===p);
const roleProof={role:profile.role,modules:session.context.modules.map(m=>m.id),prepare:has('direct_costs.prepare'),validate:has('direct_costs.validate'),access_manage:has('access.manage')};
assert.equal(roleProof.prepare,profile.role==='preparador');assert.equal(roleProof.validate,profile.role==='revisor');assert.equal(roleProof.access_manage,profile.role==='preparador');
const clients=await api('/api/a/clients');assert.equal(clients.records.length,0);assert(clients.scope_notice);
if(profile.role==='preparador'){
const inventory=await api('/api/module-records');const pending=inventory.records.clients.find(r=>r.id===privateData.pending_record_id);
assert(pending);assert.deepEqual(pending.modules,[]);
}else{
await api('/api/module-records','GET',undefined,403);
await api('/api/a/clients','POST',{name:'Must remain forbidden'},403);
}
for(const module of ['purchasing','stock','workshop','finance','accounting'])await select(module);
await select('purchasing');await api('/api/supplier-payables','GET',undefined,403);
await select('workshop');await api('/api/workshop');
await select('finance');await api('/api/direct-costs');
await select('accounting');await api('/api/catalogue-accounting');
proof.profiles.push(roleProof);await api('/api/logout','POST');
}
fs.writeFileSync(state.root+'/development-http-proof.json',JSON.stringify(proof,null,2));
console.log(JSON.stringify(proof,null,2));