40 lines
3.2 KiB
JavaScript
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));
|