import assert from 'node:assert/strict'; import React from 'react'; import {renderToStaticMarkup} from 'react-dom/server'; import {createServer} from 'vite'; import {ContextTransition} from '../resources/js/context-transition.js'; const server=await createServer({server:{middlewareMode:true},appType:'custom'}); try { const {default:Navigation,moduleGroups}=await server.ssrLoadModule('/resources/js/ModuleNavigation.jsx'); const {navigationGroups}=await server.ssrLoadModule('/resources/js/WorkspaceNavigation.jsx'); const groups=navigationGroups(()=>true,7); assert.deepEqual(moduleGroups(groups,'purchasing').map(g=>g.id),['purchasing','shared_records']); assert.deepEqual(moduleGroups(groups,'commercial').map(g=>g.id),['services','billing','billing_support']); assert.equal(moduleGroups(groups,'invalid').length,0); const html=renderToStaticMarkup(React.createElement(Navigation,{groups,context:{module_id:'workshop',modules:[{id:'workshop',label:'Oficinas'}]},page:'workshop',user:{name:'Synthetic'},navigate(){},changeModule(){},logout(){}})); assert(html.includes('Módulo activo'));assert(html.includes('Navegação de Oficinas'));assert(html.includes('Opções gerais')); assert(!html.includes('Todos os documentos'));assert(!html.includes('Obrigações a fornecedores')); assert(html.includes('aria-current="page"'));assert(!html.includes('consulta@example')); const t=new ContextTransition(); const form={isConnected:true,reportValidity:()=>true,requestSubmit:()=>{void t.command(async()=>true);}}; t.changed(form);await t.save();assert.equal(t.dirty.size,0);assert.equal(t.saved,1); const failure={...form,requestSubmit:()=>{void t.command(async()=>{throw Error('save refused');}).catch(()=>{});}}; t.changed(failure);await assert.rejects(()=>t.save(),/contexto foi mantido/);assert(t.dirty.has(failure)); t.discard();assert.equal(t.dirty.size,0); const invalid={...form,reportValidity:()=>false};t.changed(invalid);await assert.rejects(()=>t.save(),/Corrija/);assert(t.dirty.has(invalid)); t.discard();const editor={isConnected:true};t.changed(editor);await assert.rejects(()=>t.save(),/gravação explícita/);assert(t.dirty.has(editor)); t.discard();t.changed({...form,isConnected:false});t.prune();assert.equal(t.dirty.size,0); // Editing during an in-flight save cannot be discarded by its late response. let finish;const concurrent={...form,requestSubmit:()=>{void t.command(()=>new Promise(resolve=>{finish=resolve;}));}}; t.changed(concurrent);const saving=t.save();t.changed(concurrent);finish(true);await assert.rejects(()=>saving,/posteriores/);assert(t.dirty.has(concurrent)); console.log('Module navigation and transitions passed: module separation, active context, save, failed save, invalid form, discard, unsupported editor and edits during save. No browser or database.'); } finally {await server.close();}