Skip to content

E2E: migrate frontend to Cypress (consolidate #729 + #774); keep Python Playwright #967

Description

@northdpole

Goal

Consolidate frontend E2E from Jest/Puppeteer to Cypress; keep Python Playwright for backend/embeddings E2E (separate concern).

Context

Frontend browser E2E is effectively dead on main today:

  • yarn test:e2e runs Jest (package.json), but application/frontend/src/test/basic-e2e.test.ts is fully commented out (legacy Puppeteer)
  • .github/workflows/e2e.yml is entirely commented out — E2E does not run in CI
  • jest-puppeteer / puppeteer remain in package.json as dead tooling

Playwright in this repo is Python-only (application/prompt_client/ for embeddings/scraping). It is not the frontend E2E runner. make install-python must keep playwright install.

Two open PRs overlap on Cypress migration (see Pending merges):

  • #729 — restore Cypress under application/frontend/src/test/cypress/, re-enable e2e.yml
  • #774 — fuller migration: root cypress.config.js, cypress/e2e/smoke.cy.js, stabilized make e2e, switches test:e2e to cypress run

Related: #523 (fix e2e tests).

Implementation instructions

0. Playwright guardrail (dependency — do first)

  • Ensure playwright install stays in install-python (Makefile) — required for application/prompt_client/
  • Merge or cherry-pick branch chore/playwright-install-guardrail (commit 69049e36) before or as part of this work — documents the guardrail in Makefile + AGENTS.md
  • Do not remove Python Playwright when migrating frontend to Cypress

1. Document legacy Jest/Puppeteer coverage

Read application/frontend/src/test/basic-e2e.test.ts (commented) and record what routes/flows it covered. Historical coverage included:

Flow Route / behavior
Homepage search UI /#SearchBar visible, contains "Search"
No-results search / → search asdf → "No results match your search term"
Successful free-text search / → search crypto → results with standards + CREs
Standard browse /node/standard/ASVS — heading, pagination, section link, external reference, CRE link
CRE search by ID / → search 558-807 → CRE title, nested accordion
CRE filter (case-insensitive) /cre/558-807?applyFilters=true&filters=asvs and filters=ASVS
Smartlink redirect /smartlink/standard/CWE/1002/node/standard/CWE/sectionid/1002; /smartlink/standard/CWE/404 → external CWE URL

2. Migrate to Cypress

3. Wire Cypress into CI

4. Keep Python Playwright separate

  • Do not conflate Cypress (frontend) with Python Playwright (embeddings/scraping)
  • Python tests under application/tests/ that use Playwright (e.g. prompt_client_pdf_embeddings_test.py, embedding registration tests) must still pass

5. Cleanup (in scope or follow-up PR)

  • Remove or fully replace deprecated Jest E2E config (jest-puppeteer, puppeteer in package.json) without leaving dead tooling
  • Document local run instructions (see success criteria)

Success criteria

All must pass before closing this issue:

  • Route/feature coverage at least equivalent to historical Jest/Puppeteer E2E — minimum smoke (homepage search form, search → /search/{term}, browse /root_cres); stretch goal: port the flows in the table above (standard browse, CRE search/filter, smartlink)
  • Clean code: follows existing frontend conventions; no flaky tests; sensible selectors; documented how to run locally (make e2e, yarn cypress:open)
  • E2E restored in CI: Cypress job green on PRs (.github/workflows/e2e.yml or equivalent)
  • Python Playwright tests still run and passplaywright install in make install-python unchanged; embedding/scraping tests unaffected
  • make frontend / yarn build passes
  • README or AGENTS.md notes how to run Cypress locally
  • Deprecated Jest E2E tooling removed or fully replaced — no commented-out Puppeteer suite, no test:e2ejest on main
  • make lint passes
  • make e2e passes locally (Cypress smoke: 3+ tests green)
  • Only one open Cypress migration PR; #729 closed as superseded

Pending merges

Item Status
chore/playwright-install-guardrail (69049e3) Remote branch exists; no open PR; not on main
#774 Open — recommended base for consolidated work
#729 Open — supersede/close after consolidation
#732 Open — Cypress Makefile integration (stale, Test check failing)
.github/workflows/e2e.yml on main Fully commented out — E2E not in CI

PRs to merge/close

PR Action
#774 Base for consolidated migration (after playwright guardrail)
#729 Close as superseded
chore/playwright-install-guardrail Open PR and merge first (or include in consolidated PR)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions