#!/usr/bin/env node /** * Regressziós teszt a Content Editor böngészőben futó serializeréhez. * A szerver által generált tényleges JavaScriptet futtatja minimális DOM-mal, * így a szerkesztő és a teszt nem két eltérő implementációt vizsgál. */ const assert = require('assert/strict'); const fs = require('fs'); const path = require('path'); const vm = require('vm'); const { createRequire } = require('module'); const source = fs.readFileSync('content-editor.js', 'utf8') .replace('if (require.main === module) {', 'globalThis.renderContentEditor = HTML;\nif (false) {'); const editorRequire = createRequire(path.join(process.cwd(), 'content-editor.js')); const serverContext = { require: editorRequire, console, process, Buffer, module: { exports: {} }, __dirname: process.cwd(), globalThis: {} }; vm.createContext(serverContext); new vm.Script(source).runInContext(serverContext); const fixture = { title: 'Teszt', enabled: true, limit: 42, sections: [{ id: 'first', items: ['egy', 'kettő'], settings: { visible: false, weight: 1 } }], }; const html = serverContext.globalThis.renderContentEditor('home', JSON.stringify(fixture), null); const browserSource = [...html.matchAll(/]*)?>([\s\S]*?)<\/script>/g)].at(-1)[1] .replace("render(DATA, document.getElementById('editor'));", '') .replace("const toast = document.querySelector('.toast');", 'const toast = null;'); const fields = [ { dataset: { path: 'title', type: 'string' }, value: 'Módosított' }, { dataset: { path: 'enabled', type: 'boolean' }, checked: true }, { dataset: { path: 'limit', type: 'number' }, value: '99' }, { dataset: { path: 'sections[0].id', type: 'string' }, value: 'first' }, { dataset: { path: 'sections[0].items[0]', type: 'string' }, value: 'egy' }, { dataset: { path: 'sections[0].items[1]', type: 'string' }, value: 'kettő' }, { dataset: { path: 'sections[0].settings.visible', type: 'boolean' }, checked: false }, { dataset: { path: 'sections[0].settings.weight', type: 'number' }, value: '3' }, ]; const document = { getElementById: id => id === 'page-data' ? { textContent: JSON.stringify(fixture) } : {}, querySelectorAll: selector => selector === '[data-path]' ? fields : [], querySelector: () => null, }; const browserContext = { document, console, setTimeout, fetch: async () => ({ json: async () => ({ ok: true }) }) }; vm.createContext(browserContext); new vm.Script(`${browserSource}\nglobalThis.__collect = collect;`).runInContext(browserContext); assert.deepStrictEqual(JSON.parse(JSON.stringify(browserContext.__collect())), { title: 'Módosított', enabled: true, limit: 99, sections: [{ id: 'first', items: ['egy', 'kettő'], settings: { visible: false, weight: 3 } }], }); console.log('Content Editor serializer regression test: OK');