'use strict'; const assert=require('node:assert/strict'),fs=require('node:fs'),vm=require('node:vm'),path=require('node:path'); const fonte=fs.readFileSync(path.join(__dirname,'editor.js'),'utf8').replace(/^import .*;\r?\n/, ''); function montar(config,html='') { let bloco,criados=0,pedidos=0,callbacks,fechar=0,limpeza; const props=()=>({});props.save=()=>({}); const wp={ element:{createElement:(tipo,props,...filhos)=>({tipo,props,filhos}),RawHTML:'html',useRef:value=>({current:value}),useEffect:fn=>{limpeza=fn();}}, components:{Button:'button',Notice:'notice'},blockEditor:{useBlockProps:props}, i18n:{__:(texto,dominio)=>{assert.equal(dominio,'formulix');return texto;}}, blocks:{registerBlockType:(nome,def)=>{assert.equal(nome,'formulix/conteudo');bloco=def;}}, apiFetch:async pedido=>{ assert.equal(pedido.path,'/wp/v2/media');assert.equal(pedido.method,'POST'); assert.equal(pedido.headers['X-WP-Nonce'],'nonce-local');assert.ok(pedido.body instanceof FormData); pedidos++;return {source_url:'https://site.example.test/formulix.png'}; } }; const window={FormulixWP:config,FormulixUI:{criar:opcoes=>{criados++;callbacks=opcoes;return {abrir:()=>{},fechar:()=>fechar++};}}}; vm.runInNewContext(fonte,{wp,window,FormData,limpar:valor=>valor,alvoDe:valor=>valor,imagem:async(b,r,a,upload)=>upload()}); const arvore=bloco.edit({attributes:{html},setAttributes:()=>{},clientId:'teste'}); return {arvore,callbacks,criados,pedidos:()=>pedidos,limpar:()=>{limpeza?.();return fechar;}}; } (async()=>{ for(const config of [{},{chave:'publica'}]) { // sem URL: desligado (a chave é opcional) for(const html of ['', 'x']) { const r=montar(config,html); assert.equal(r.criados,0); const botoes=r.arvore.filhos.flat().filter(n=>n?.tipo==='button'); assert.ok(botoes.length>0 && botoes.every(n=>n.props.disabled)); botoes[0].props.onClick();assert.equal(r.pedidos(),0); } } const r=montar({servidor:'https://api.example.test',chave:'publica',podeEnviar:false}); assert.equal(r.criados,1);assert.equal(r.pedidos(),0); await assert.rejects(r.callbacks.imagem(null,{},''),/permissão/); assert.equal(r.pedidos(),0);assert.equal(r.limpar(),1); const autorizado=montar({servidor:'https://api.example.test',chave:'publica',podeEnviar:true,nonce:'nonce-local'}); await autorizado.callbacks.imagem(new Blob(['png'],{type:'image/png'}),{},''); assert.equal(autorizado.pedidos(),1); const readme=fs.readFileSync(path.join(__dirname,'readme.txt'),'utf8'); const descricao=readme.split(/\r?\n\r?\n/)[1];assert.ok(descricao.length<=150); for(const secao of ['Description','Installation','Frequently Asked Questions','Screenshots','External services','Changelog','Upgrade Notice']) assert.ok(readme.includes('== '+secao+' ==')); const versao=JSON.parse(fs.readFileSync(path.join(__dirname,'block.json'),'utf8')).version; assert.ok(readme.includes('Stable tag: '+versao)); assert.ok(fs.readFileSync(path.join(__dirname,'formulix.php'),'utf8').includes('Version: '+versao)); console.log('WordPress: configuração, upload e readme passaram'); })().catch(erro=>{console.error(erro);process.exitCode=1;});