Skip to content

feat(runner): the DEV-2203 E2E core — helpers, share viewer, editor, versions, engines - #184

Open
danielzytohoc wants to merge 9 commits into
masterfrom
feat/DEV-2203-engine-and-docs-frameworks
Open

feat(runner): the DEV-2203 E2E core — helpers, share viewer, editor, versions, engines#184
danielzytohoc wants to merge 9 commits into
masterfrom
feat/DEV-2203-engine-and-docs-frameworks

Conversation

@danielzytohoc

@danielzytohoc danielzytohoc commented Aug 14, 2026

Copy link
Copy Markdown

The core of the DEV-2203 series, collapsed from #181/#182/#183/#184 into one PR (Dan's call — spec-only changes reviewed as one unit). Base: master. The rest of the stack sits on top: #185 (Style panel, touches product test-contracts) → #186 (authed share round-trip) → #187 (AI endpoint smoke) → #189 (workflow wiring); #188 (guide parity) is independent.

What's in here

Foundation

  • e2e/helpers.ts — the suite's most-copied code as a shared module (stubShell/signIn existed verbatim in nine specs, the session-cleanup pattern in two). New specs import it; old specs migrate opportunistically.
  • CI reporter fix: the github reporter never writes playwright-report/, so the on-failure artifact has been empty since the workflow existed. CI now adds the html reporter and uploads test-results/ (traces) too.
  • fflate root devDep for zip assertions.

e2e/share-view.spec.ts — the deployed /d + /embed contract, read-only against a permanent fixture demo: renders anonymously (@smoke), slashless → 308, /d frame-locked to self, /embed docs-only (allowlist frame-ancestors, no XFO, no CORS), __source.json never served, unknown id → real 404. 6/6 on prod in 1.4 s.

e2e/editor-download.spec.ts — Download zips the workspace as edited (deterministic, fflate both builds and reads it) + live: a typed edit reaches the rendered grid.

e2e/version-pinning.spec.ts — the URL → pin → workspace path a DEV-2198 PR-preview link takes: semver pins core+wrapper in lockstep, a pkg.pr.new id rewrites both deps to tarball URLs and posts the validated ref to the session, the newest -next installs live. E2E_PKG_PR_NEW_REF opt-in boots one real container at a fresh build id.

e2e/engine-smoke.spec.ts (@smoke) — one render per engine; the container case is react-js, pinning the engine-not-tier rule. e2e/docs-frameworks.spec.ts — the docs paths that need containers (Vue switch, Angular). Its first prod run found a real defect: the Angular docs container's HMR websocket handshake gets a 400 through the preview proxy (86cb5d99n) — render coverage stays live behind an explicit known-defect filter + test.fixme.

Verification

Full gate on this tree: 409 unit + deterministic e2e green; live against prod: share-view 6/6, editor/version 6/6, engine-smoke 2/2, docs-frameworks 2/2 (--workers=1). Master merged in on 2026-08-17; Bugbot findings addressed (Vue-switch two-boot budget).

Dan Zyto added 4 commits August 14, 2026 13:06
…pty (DEV-2203)

The suite's most-copied code becomes e2e/helpers.ts: stubShell and signIn
existed verbatim in nine specs, the session-cleanup pattern in two, the
noise filter in one. New DEV-2203 specs import from here; existing specs
migrate opportunistically.

CI kept uploading runner/playwright-report/ on failure, but the 'github'
reporter never writes it — the artifact has been empty since the workflow
was added. The html reporter now fills it, and both workflows also upload
test-results/ (where traces actually land).

fflate joins the root devDependencies so specs can assert on the contents
of a downloaded workspace zip (the app already builds them with fflate).
/d/:id is what a client actually receives, and nothing exercised the
deployed contract: authed-actions.spec.ts stubs /api/demos and never
leaves the SPA. Six read-only checks against a permanent fixture demo:
the built page renders for an anonymous viewer, the slashless URL is a
308 (not a second copy), /d is frame-locked to itself, /embed carries
the docs-only frame-ancestors list with no X-Frame-Options and no CORS,
the __source.json snapshot never leaks, and an unknown id is a real 404.

Zero containers, zero writes — cheap enough for post-deploy smoke, which
is why the render check carries @smoke. The authed write path (create →
build → view → revoke) comes separately as share-create-live.spec.ts.
…nd to end (DEV-2203)

editor-download.spec.ts: Download is the only way out of play/share with
your edits, and no test ever opened a zip — now one does, client-side and
deterministic (fflate both builds and reads it). The live half types into
the real editor and watches the renamed header reach the rendered grid;
error-recovery and theme specs only ever implied that path.

version-pinning.spec.ts: the URL → pin → workspace path a DEV-2198 PR
preview link will take. Deterministic: a semver deep link pins core and
wrapper in lockstep; a bare pkg.pr.new id rewrites every Handsontable
dependency to its tarball URL and posts the validated ref to the
container session. Live: the newest -next build installs through the
real bundler. pkg.pr.new refs are never hardcoded (builds expire; npm
cannot vouch for them) — E2E_PKG_PR_NEW_REF boots one real container at
a fresh ref when a DEV-2198 validation run wants it.
…s (DEV-2203)

engine-smoke.spec.ts is the @smoke slice: one Sandpack render and one
container render (react-js — the Tier-1 starter that ships engine:
container, so it also pins the engine-not-tier rule). Cheap enough to
run after every deploy; wide enough that a broken bundler and a broken
container image cannot both hide.

docs-frameworks.spec.ts covers the two docs paths that need a container:
switching a docs example to Vue, and an Angular docs example. Two boots,
--workers=1, sessions deleted in a finally — the pool holds five global
slots shared with real traffic, and the 1261-entry bucket walk belongs
to the manifest tests, not a browser.

The Angular case found a real defect on its first prod run: the HMR
websocket handshake is answered 400 through the preview proxy, so an
edit to an Angular docs example only shows after a manual reload. The
render check stays live behind an explicit ANGULAR_HMR_DEFECT filter and
a test.fixme documents the assertion to restore once the proxy is fixed.

Existing tests join the @smoke set: the JavaScript docs-example render
and style-apply's react apply+reset round-trip.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 6564484. Configure here.

Comment thread runner/e2e/docs-frameworks.spec.ts
Dan Zyto added 5 commits August 17, 2026 08:31
…foundation

# Conflicts:
#	runner/package.json
#	runner/pnpm-lock.yaml
The framework-switch test waits out a Sandpack ready and then a
container ready before it ever polls the grid — the shared 300s
describe budget fits one boot, not two. A slow-but-healthy run could
time out after both engines had already succeeded.
@danielzytohoc danielzytohoc changed the title feat(runner): one render per engine, and the container docs frameworks (DEV-2203) feat(runner): the DEV-2203 E2E core — helpers, share viewer, editor, versions, engines Aug 17, 2026
@danielzytohoc
danielzytohoc changed the base branch from feat/DEV-2203-editor-and-version-specs to master August 17, 2026 09:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant