6 lines
4.5 KiB
JavaScript
6 lines
4.5 KiB
JavaScript
import fs from 'node:fs';import path from 'node:path';import assert from 'node:assert/strict';import vm from 'node:vm';import crypto from 'node:crypto';
|
|
const read=p=>JSON.parse(fs.readFileSync(p,'utf8')),state=read('C:/laragon/data/sgf-tempo/run/modular-regression-current.json'),tag=process.argv[2];if(state.port!==55439||!/^[a-f0-9]{12}$/.test(tag??''))throw Error('Owned correction team fixture required');const root=path.join(state.root,'private/ledger-'+tag),out=path.join(root,'industrial-correction-demo-http.json'),demo=read(path.join(root,'cost-demo.json')),g=read(path.join(root,'industrial-fixture.json'));if(fs.existsSync(out))throw Error('Completed readiness preserved');let checks=0;const ok=(v,m)=>{checks++;assert(v,m);};let prepareHtml;
|
|
for(const role of ['prepare','validate','read']){const jar=new Map();let context='';const get=async(url)=>{const r=await fetch(new URL(url,demo.url),{headers:{Accept:'application/json','X-SGF-Context':context,Cookie:[...jar].map(([k,v])=>k+'='+v).join('; ')},redirect:'manual',signal:AbortSignal.timeout(15000)});for(const c of r.headers.getSetCookie()){const p=c.split(';')[0],i=p.indexOf('=');jar.set(p.slice(0,i),p.slice(i+1));}const text=await r.text();let data;try{data=JSON.parse(text);}catch{}return{status:r.status,text,data};};const guide=await get('/qa/cost-demo');ok(guide.status===200&&guide.text.includes('1800→1820'),'Actual correction guide');const auth=await get('/qa/cost-enter/'+role);ok(auth.status===200,'Declared role');context=auth.data.context;const data=await get('/api/general-ledger/industrial?lot_id='+g.lot_id);ok(data.status===200&&data.data.industrial.source.principal_minor===182000&&data.data.industrial.journal.debit_minor===180000&&data.data.corrections.length===0&&data.data.book.journals.length===1&&data.data.closed===false,'Original275/current295, no correction or close consumed');const page=await get('/general-ledger/industrial?lot_id='+g.lot_id);ok(page.status===200&&page.text.includes('20,00 MZN'),'Explicit delta');ok(role==='prepare'?page.text.includes('data-action="correct-prepare"'):!page.text.includes('data-action='),'Initial role-specific controls');if(role==='prepare')prepareHtml=page.text;const home=await get('/');ok(home.status===200&&/\/build\/assets\//.test(home.text),'Private existing application build');}
|
|
const script=[...prepareHtml.matchAll(/<script>([\s\S]*?)<\/script>/g)].at(-1)?.[1];if(!script)throw Error('Rendered script missing');const form={dataset:{action:'correct-post'},fields:{correction_id:'9',revision:'b'.repeat(64),reason:'Individual complete-pair application reason.'},button:{},querySelector(){return this.button;}},error={textContent:''},calls=[],mock={fail:false};const sandbox={document:{querySelectorAll:()=>[form],querySelector:()=>error},FormData:class{constructor(f){return new Map(Object.entries(f.fields));}},crypto:{randomUUID:crypto.randomUUID},location:{reload(){}},fetch:async(url,options)=>{calls.push({url,options,body:JSON.parse(options.body)});return{ok:!mock.fail,json:async()=>mock.fail?{message:'Expected stale group refusal.'}:{result_id:1}};}};vm.createContext(sandbox);vm.runInContext(script,sandbox);const submit=()=>form.onsubmit({preventDefault(){}});await submit();ok(calls[0].body.correction_id===9&&calls[0].body.revision==='b'.repeat(64),'Group ID typed, exact revision hash stays string');await submit();ok(calls[1].options.headers['Idempotency-Key']===calls[0].options.headers['Idempotency-Key'],'Stable unchanged retry');form.fields.reason='Corrected pair reason.';await submit();ok(calls[2].options.headers['Idempotency-Key']!==calls[0].options.headers['Idempotency-Key'],'Changed content new key');mock.fail=true;await submit();ok(error.textContent.includes('Expected stale group refusal.')&&form.button.disabled===false,'Refusal retained for deliberate conference/retry');mock.fail=false;form.dataset.action='correct-prepare';form.fields={journal_id:'7',journal_on:'2026-10-29',period_key:'QA-2026-10',reason:'Explicit original ID capture.'};await submit();ok(calls.at(-1).body.journal_id===7&&calls.at(-1).body.period_key==='QA-2026-10','Original journal ID numeric, date/period explicit');
|
|
fs.writeFileSync(out,JSON.stringify({passed:true,checks,three_accounting_roles:true,original_minor:180000,actual_successor_minor:182000,initial_journals:1,initial_groups:0,initial_closures:0,no_business_commands:true,rendered_forms_mock_checks:5,actual_browser:false,visual_review:false,private_existing_build:true},null,2)+'\n');console.log(JSON.stringify({passed:true,checks,no_business_commands:true,forms:5}));
|