Problem
The shipped fixture() renders via renderToString and parses HTML into a container; it never drives client hydration or awaits a true update cycle (waitForUpdate yields two macrotasks, never el.updateComplete), and there is no packaged ssrFixture() that server-renders then hydrates in one call. Separately, nothing touches accessibility testing: no axe-core integration, no assertion helper, and the scaffold browser test only checks the DOM exists. Both live in the existing real-Chromium WTR layer.
Design / approach
Export a small ssrFixture() that renders then hydrates in the existing WTR Chromium session awaiting the native el.updateComplete, plus an opt-in axe assertion. Thin wrappers over the real browser already running.
Web-standards fit: Runs in real Chromium and awaits the native updateComplete; the helpers are small and axe is opt-in, not a forced gate.
Prior art: Lit @lit-labs/testing ssrFixture/csrFixture + WTR SSR plugin; Lit @open-wc/testing + axe for a11y.
Acceptance criteria
Filed from the production-readiness audit (webjs vs Next.js / Remix / Rails / Turbo / Lit). Theme: testing. Priority: P2. Kept to webjs identity: no-build, progressive enhancement, web-components-first, AI-first, batteries-included, close to web standards.
Problem
The shipped fixture() renders via renderToString and parses HTML into a container; it never drives client hydration or awaits a true update cycle (waitForUpdate yields two macrotasks, never el.updateComplete), and there is no packaged ssrFixture() that server-renders then hydrates in one call. Separately, nothing touches accessibility testing: no axe-core integration, no assertion helper, and the scaffold browser test only checks the DOM exists. Both live in the existing real-Chromium WTR layer.
Design / approach
Export a small ssrFixture() that renders then hydrates in the existing WTR Chromium session awaiting the native el.updateComplete, plus an opt-in axe assertion. Thin wrappers over the real browser already running.
Web-standards fit: Runs in real Chromium and awaits the native updateComplete; the helpers are small and axe is opt-in, not a forced gate.
Prior art: Lit @lit-labs/testing ssrFixture/csrFixture + WTR SSR plugin; Lit @open-wc/testing + axe for a11y.
Acceptance criteria
Filed from the production-readiness audit (webjs vs Next.js / Remix / Rails / Turbo / Lit). Theme: testing. Priority: P2. Kept to webjs identity: no-build, progressive enhancement, web-components-first, AI-first, batteries-included, close to web standards.