Files
SGF/scripts/sgf-composition-http-check.mjs
2026-11-11 09:00:17 +02:00

26 lines
2.8 KiB
JavaScript

import fs from 'node:fs';
import assert from 'node:assert/strict';
// Directed regression of the shared runtime change. Only role/context selection
// and reads; no business workflow is executed again.
const cookies=new Map(),checks=[];
async function send(path,options={}){
const response=await fetch('http://127.0.0.1:8085'+path,{redirect:'manual',...options,headers:{Cookie:[...cookies].map(([k,v])=>k+'='+v).join('; '),Accept:'application/json',...options.headers}});
for(const raw of response.headers.getSetCookie()){const [name,value]=raw.split(';')[0].split('=');cookies.set(name,value);}
return response;
}
function ok(v,name){assert(v,name);checks.push(name);}
async function enter(role,stage){const entry=await send('/compras',{headers:{Accept:'text/html'}}),html=await entry.text();const csrf=/name="_token" value="([^"]+)"/.exec(html)?.[1];assert(csrf);const response=await send('/compras/entrar',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:new URLSearchParams({_token:csrf,role,stage})});assert.equal(response.status,302);const session=await send('/api/session');return (await session.json());}
let session=await enter('issuer','obligations');
const obligation=await send('/api/purchasing-obligations/2',{headers:{'X-SGF-Context':session.context.token}});const book=await obligation.json();
ok(obligation.status===200&&book.obligations[0].principal_minor===10000&&book.obligations[0].balance_minor===10000,'existing obligation remains 100MZN with no new settlement');
session=await enter('validator','receipts');
const receipt=await send('/api/purchasing-receipts/orders/1',{headers:{'X-SGF-Context':session.context.token}});
ok(receipt.status===200,'accepted purchase receipt remains readable after shared runtime update');
const context=await send('/api/context',{method:'POST',headers:{'Content-Type':'application/json','X-CSRF-TOKEN':session.csrf,'X-SGF-Context':session.context.token},body:JSON.stringify({tenant_id:1,company_id:2,unit_id:2,module_id:'stock'})});
ok(context.status===200,'explicit transition to authorized Stock module is preserved');session=await context.json();
ok(session.context.stock.operations===false,'new Stock operations remain disabled without granting new rights');
const disabled=await send('/stock/operations');ok(disabled.status===404,'installed workspace is blocked until explicit activation');
const asset=await send('/stock-operations-workspace.mjs');ok(asset.status===200&&(await asset.text()).includes('stock-workspace'),'same server delivers the installed workspace asset');
const result={passed:true,checks,real_http:true,business_commands:0,existing_role_selection:true,visual_review:false};if(process.argv[2])fs.writeFileSync(process.argv[2],JSON.stringify(result,null,2));console.log(JSON.stringify({passed:true,checks:checks.length,business_commands:0}));