// Rendert de echte install-modal met Alpine in een DOM en klikt erop. // Vangt bindingsfouten die je met losse logica niet ziet: :disabled="0" // schakelt een knop juist UIT, want Alpine haalt een boolean-attribuut // alleen weg bij null, undefined of false. const fs = require('fs'), path = require('path'); // jsdom en Alpine zijn geen onderdeel van dit project; zonder die twee slaat // deze test zichzelf over (afsluitcode 2). Installeren kan met: // cd tests/js && npm install jsdom alpinejs let JSDOM, alpinePad; try { ({ JSDOM } = require('jsdom')); alpinePad = require.resolve('alpinejs/dist/cdn.js'); } catch (e) { console.log('overgeslagen: jsdom of alpinejs ontbreekt (npm install in tests/js)'); process.exit(2); } const WORTEL = path.resolve(__dirname, '..', '..'); const html = fs.readFileSync(WORTEL + '/server-up/templates/index.html', 'utf8'); const dom = new JSDOM('
', { runScripts: 'dangerously', pretendToBeVisual: true, url: 'http://localhost/' }); const w = dom.window; w.fetch = async () => ({ ok: true, json: async () => ({ ok: true }) }); const start = html.indexOf('function app() {'); w.eval(html.slice(start, html.indexOf('', start))); // De component vóór Alpine klaarzetten: erna is het een proxy die dit weigert. const echt = w.app; w.app = function () { const c = echt(); c.t = k => k; c.bpFieldVisible = () => true; c.toast = () => {}; c.rpc = async () => ({ ok: true, preview_files: { 'compose.yaml': 'services: {}' }, env_preview: '' }); c.connectTargets = () => []; c.pickIp = () => {}; c.netList = []; c.sharedNetwork = 'serverup'; c.modal = 'install'; c.install = { format: 'boilerplate', loading: false, stack: 'test', repo_id: 'r', instance: 'test', values: { service_name: 'test', port: 8080 }, fields: [ {name:'service_name',title:'Naam',step:'basis',type:'str',group:'Algemeen',required:true,advanced:false}, {name:'port',title:'Poort',step:'basis',type:'int',group:'Algemeen',required:true,advanced:false}, {name:'db_password',title:'Wachtwoord',step:'geheimen',type:'str',group:'Algemeen',required:true,secret:true,advanced:false}, ], step: 0, preview_files: {}, composeText: '', envText: '', editing: false, tab: 'compose', mode: 'install', connect_apps: true, network: '', ip: '', envVars: [], images: [], envOverrides: {}, imageTags: {}, }; return c; }; const m = html.match(/