Files
feuerwerk/tools/e2e.mjs
T
root 6ac6b69388 Run just the e2e steps you name
GM_STEPS=20, 1-12 or 6,20 takes a subset of the suite, which is seconds
instead of two minutes while one step is being written. Steps live off
what the earlier ones leave behind, so a subset that skips a prerequisite
fails on purpose. The filter had been written as a throwaway script three
times; it belongs in the runner.

The README stops calling a remote browser the way this suite is meant to
be run: with the GPU in use a local run costs ~124 s and about 0.8 of the
four cores here, so GM_REMOTE is a convenience, not a requirement.
2026-09-10 06:06:29 +02:00

43 lines
1.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* Headless end-to-end checks of the editor, driven over the Chrome DevTools Protocol.
* Usage: PATH=/opt/node22/bin:$PATH node tools/seed-e2e.mjs && node tools/e2e.mjs [projectId] [baseUrl]
* Prints PASS/FAIL per check, writes screenshots to /tmp/gm-e2e-*.png. No dependencies.
*
* Runs against the fixture project written by tools/seed-e2e.mjs and mutates it heavily; the
* steps in tools/e2e/ run in order and build on each other's scene state.
*
* `GM_STEPS=1-12` or `GM_STEPS=6,20` runs a subset while working on one step. Since later steps
* rely on what earlier ones leave behind, a subset that skips a prerequisite fails on purpose.
*/
import { STEPS } from './e2e/index.mjs';
import { runChecks } from './lib/harness.mjs';
import { PROJECTS, cliArgs } from './lib/projects.mjs';
const { projectId, baseUrl } = cliArgs('e2e.mjs', PROJECTS.fixture);
function selectSteps(spec) {
if (!spec) return STEPS;
const wanted = new Set();
for (const part of spec.split(',')) {
const [from, to] = part.trim().split('-').map(Number);
if (!Number.isInteger(from) || from < 1) {
console.error(`GM_STEPS: cannot read "${part}" – use 20, 1-12 or 6,20`);
process.exit(2);
}
for (let i = from; i <= (Number.isInteger(to) ? to : from); i++) wanted.add(i);
}
return STEPS.filter((_, i) => wanted.has(i + 1));
}
const steps = selectSteps(process.env.GM_STEPS);
if (steps.length !== STEPS.length) {
console.log(`running ${steps.length}/${STEPS.length} steps: ${steps.map((s) => s.name).join(', ')}`);
}
await runChecks({ projectId, baseUrl, port: 9333, shotPrefix: 'gm-e2e' }, async (t) => {
await t.navigate();
await t.shot('01-loaded');
for (const step of steps) await step(t);
});