63 lines
2.2 KiB
JavaScript
63 lines
2.2 KiB
JavaScript
// Real-DOM test with jsdom: load the exported HTML, simulate clicks on wired
|
|
// widgets, verify navigation and surface any runtime errors.
|
|
const fs = require('fs');
|
|
const { JSDOM } = require('jsdom');
|
|
|
|
const file = process.argv[2];
|
|
const html = fs.readFileSync(file, 'utf-8');
|
|
|
|
const errors = [];
|
|
const vc = new (require('jsdom').VirtualConsole)();
|
|
vc.on('jsdomError', (e) => errors.push('jsdomError: ' + e.message));
|
|
vc.on('error', (...a) => errors.push('console.error: ' + a.join(' ')));
|
|
|
|
const dom = new JSDOM(html, { runScripts: 'dangerously', pretendToBeVisual: true, virtualConsole: vc });
|
|
const { window } = dom;
|
|
const { document } = window;
|
|
|
|
const model = window.QUX_MODEL;
|
|
const nameEl = document.getElementById('screenName');
|
|
|
|
function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
|
|
|
|
async function main() {
|
|
await sleep(300);
|
|
const start = nameEl.textContent;
|
|
console.log('file:', file);
|
|
console.log('app:', model.name, '| screens:', Object.keys(model.screens).length, '| lines:', Object.keys(model.lines || {}).length);
|
|
console.log('start screen:', start);
|
|
|
|
// find all elements with click listeners (our engine sets a property marker)
|
|
// walk DOM to find wired widgets: they have class qux-clickable
|
|
const wired = document.querySelectorAll('.qux-clickable');
|
|
console.log('clickable elements on screen:', wired.length);
|
|
|
|
if (wired.length > 0) {
|
|
// click the FIRST wired element in real DOM
|
|
const el = wired[0];
|
|
const rect = el.getBoundingClientRect ? el : null;
|
|
const evt = new window.MouseEvent('click', { bubbles: true, cancelable: true, view: window });
|
|
el.dispatchEvent(evt);
|
|
await sleep(300);
|
|
const after = nameEl.textContent;
|
|
console.log('after clicking [', el.textContent.trim() || el.className, ']:', after);
|
|
if (after !== start) {
|
|
console.log('INTERACTION OK:', start, '->', after);
|
|
} else {
|
|
console.log('NO NAVIGATION (stayed on', after, ')');
|
|
}
|
|
} else {
|
|
console.log('no wired widgets on start screen');
|
|
}
|
|
|
|
if (errors.length) {
|
|
console.log('\nRUNTIME ERRORS:');
|
|
errors.slice(0, 10).forEach(e => console.log(' -', e));
|
|
process.exit(1);
|
|
} else {
|
|
console.log('no runtime errors');
|
|
}
|
|
}
|
|
|
|
main().catch(e => { console.error('TEST FAILED:', e); process.exit(1); });
|