38 lines
3.7 KiB
JavaScript
38 lines
3.7 KiB
JavaScript
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('<form'));assert(!html.includes('type="submit"'));assert(!html.includes('value="0"'));assert(!html.includes('0.000'));assert(!html.includes('http://127.0.0.1:8005'));
|
|
if(section.id==='stock_reports'){assert(html.includes('Consulta indisponível'));assert(!html.includes('value="valuation"'));assert(!html.includes('value="expiry"'));}
|
|
const other=renderToStaticMarkup(React.createElement(Workspace,{section:section.id,context:{...context,company:{id:2,name:'Empresa sintética B'}},can:companyCan,navigate:()=>{}}));
|
|
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();}
|