import fs from 'node:fs';import assert from 'node:assert/strict';import {session} from './sgf-single-http.mjs';import {overviewSources,overviewPage,moduleGuides} from '../resources/js/workspace-overview.js'; const checks=[],samples={};const ok=(v,n)=>{assert(v,n);checks.push(n);}; for(const [profile,module]of [['sgf:commercial_prepare','commercial'],['purchasing:actor','purchasing'],['purchasing:validator','stock'],['sgf:workshop_manage','workshop'],['sgf:finance_prepare','finance'],['sgf:accounting_prepare','accounting']]){ const s=await session(profile,module),c=s.identity.context,can=(right,unit)=>c.grants.some(g=>g.permission===right&&g.unit_id===unit);const sources=overviewSources(c,can);ok(sources.length>0,module+' existing authorized page source');ok(overviewSources({...c,unit:null},can).length===0,module+' no unit no source');ok(overviewSources(c,()=>false).length===0,module+' no right no source'); for(const source of sources){const r=await s.get(source.path+(source.path.includes('?')?'&':'?')+'page=1');assert.equal(r.status,200,source.path);const raw=await r.json(),page=overviewPage(source,raw);ok(page.rows.length<=25&&page.page===1,source.id+' bounded real page');ok(page.rows.length>0,source.id+' existing records visible');ok(page.rows.every(r=>r.reference&&r.evidence),source.id+' reference and evidence retained');samples[module+':'+source.id]={source,page};if(source.id==='journals'){ok(page.total===27,'journal count from native page27');const r2=await s.get(source.path+'?page=2'),p2=overviewPage(source,await r2.json());ok(p2.rows.length===2&&p2.page===2,'second journal page two records');ok(p2.rows.every(r=>!page.rows.some(a=>a.reference===r.reference)),'journal pages no duplicate references');}if(source.id==='cash')ok(page.total===9,'nine cash events preserved');if(source.id==='calculations')ok(page.total===5,'five fiscal calculations preserved');} } ok(Object.keys(moduleGuides).length===6&&Object.values(moduleGuides).every(g=>g.steps.length===5&&g.boundary&&g.evidence),'all six guides explain steps evidence interpretation');assert.throws(()=>overviewPage({id:'documents',pageKey:'documents'},{documents:{total:0}}));ok(true,'invalid source contract not rendered as empty');assert.throws(()=>overviewPage({id:'journals'},{pagination:{total:30,page:1,last_page:2},journals:Array(26).fill({})}));ok(true,'oversized page refused');const run=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')),root=run.root+'/private/receipt-composition-cc50a276c10c',file=root+'/overview-http-20261110.json';fs.writeFileSync(root+'/overview-samples-private.json',JSON.stringify(samples));fs.writeFileSync(file,JSON.stringify({passed:true,checks,business_commands:0,new_grants:0,new_demo:false,browser_visual_review:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));