import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; import React from 'react'; import {renderToStaticMarkup} from 'react-dom/server'; import {createServer} from 'vite'; const server=await createServer({server:{middlewareMode:true},appType:'custom'}); try{ const {stockSections,visibleStockSections,availableStockReports}=await server.ssrLoadModule('/resources/js/stock-menu.js'); const {default:Workspace}=await server.ssrLoadModule('/resources/js/StockMenuWorkspace.jsx'); const {navigationGroups}=await server.ssrLoadModule('/resources/js/WorkspaceNavigation.jsx'); const {default:Home}=await server.ssrLoadModule('/resources/js/WorkspaceHome.jsx'); const companyCan=p=>p==='company.view'; const context={token:'synthetic',company:{id:1,name:'Empresa sintética A'},unit:{id:7,name:'Unidade A'}}; assert.deepEqual(stockSections.map(s=>s.label),['Painel','Existências','Entradas','Saídas','Transferências','Devoluções','Relatórios']); assert.deepEqual(visibleStockSections(()=>false),[]); assert.deepEqual(visibleStockSections(p=>p==='workshop.view'),[]); assert.deepEqual(availableStockReports().map(r=>r.id),['balances','movements','minimum']); assert(!availableStockReports({transit:true,returns:true,lots:true,inventory:true,history:true},false).some(r=>r.restricted)); assert(availableStockReports({},true).some(r=>r.id==='valuation')); assert(!availableStockReports({transit:false,lots:false}).some(r=>r.feature)); const groups=navigationGroups(companyCan,7),stock=groups.find(g=>g.id==='stock'); assert.equal(stock.status,'Em preparação');assert(stock.items.every(i=>i.informational)); const home=renderToStaticMarkup(React.createElement(Home,{context,can:companyCan,groups,navigate:()=>{}}));assert(home.includes('shortcut-status')); for(const section of stockSections){ const html=renderToStaticMarkup(React.createElement(Workspace,{section:section.id,context,can:companyCan,navigate:()=>{}})); assert(html.includes('fonte de stock ainda não ligada'));assert(html.includes('Empresa sintética A'));assert(html.includes('Submenus de stock')); assert(!html.includes('{}})); assert(other.includes('Empresa sintética B'));assert(!other.includes('Empresa sintética A')); } const denied=renderToStaticMarkup(React.createElement(Workspace,{section:'stock_balances',context,can:()=>false,navigate:()=>{}})); assert(!denied.includes('Submenus de stock')); await fs.writeFile('docs/proofs/stock-menu.json',JSON.stringify({checked_at:new Date().toISOString(),sections:7,kind:'informational navigation and source-unavailable states',not_operational_stock:true,no_fabricated_balances:true,conditional_reports_hidden:true,cost_values_not_loaded:true,no_business_forms:true,no_company_or_workshop_permission_inferred_as_stock_permission:true,company_context_rendering:true,backend_calls:0,business_commands:0,visual_review:false,publication:false},null,2)+'\n'); console.log('Stock menu checks passed: seven entries, source-unavailable states, no fabricated balances, no business forms, conditional reports/costs hidden and company context preserved. Operational integration remains pending.'); }finally{await server.close();}