import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; const cookies = new Map(), base = 'http://127.0.0.1:8005'; async function request(path, method = 'GET', body) { const r = await fetch(base + path, {method, redirect:'manual', headers:{Accept:'application/json', Cookie:[...cookies].map(([k,v])=>`${k}=${v}`).join('; '), ...(body?{'Content-Type':'application/x-www-form-urlencoded'}:{})}, ...(body?{body:new URLSearchParams(body)}:{})}); for(const c of r.headers.getSetCookie()) {const p=c.split(';',1)[0],i=p.indexOf('=');cookies.set(p.slice(0,i),p.slice(i+1));} return {status:r.status,text:await r.text()}; } const landing=await request('/avaliar'); const csrf=landing.text.match(/name="_token" value="([^"]+)"/)[1]; assert.equal((await request('/avaliar/entrar','POST',{role:'admin',_token:csrf})).status,302); const before=JSON.parse((await request('/api/supplier-payables')).text); assert(before.documents.length); for(const doc of before.documents) { const filtered=await request('/api/supplier-payables?invoice='+doc.local_id); assert.equal(filtered.status,200); const data=JSON.parse(filtered.text); assert.deepEqual(data.documents,[doc]); const page=await request('/obrigacoes-fornecedores?invoice='+doc.local_id); assert.equal(page.status,200); assert(page.text.includes('href="/facturas"')); assert(page.text.includes('Voltar às facturas')); assert(page.text.includes(doc.number)); } for(const query of ['0','-1','abc','1.5']) { assert.equal((await request('/api/supplier-payables?invoice='+query)).status,422); assert.equal((await request('/obrigacoes-fornecedores?invoice='+query)).status,422); } assert.equal((await request('/api/supplier-payables?invoice=2147483647')).status,404); const after=JSON.parse((await request('/api/supplier-payables')).text); assert.deepEqual(after,before,'Read-only navigation must preserve all documents and histories'); await fs.writeFile('docs/proofs/invoice-payable-link.json',JSON.stringify({checked_at:new Date().toISOString(), documents_checked:before.documents.length,per_invoice_entry:true,return_to_invoices:true, invalid_identifiers_refused:true,unknown_invoice_refused:true,full_listing_unchanged:true,business_commands:0, visual_review:false},null,2)+'\n'); console.log('Per-invoice payable navigation, invalid/unknown identifiers and unchanged history passed.');