Skip to content

fix(e2e): consolidate frontend E2E to Cypress and restore CI (#967) - #984

Open
DevHusnainAi wants to merge 34 commits into
OWASP:mainfrom
DevHusnainAi:feature/consolidate-cypress-e2e
Open

fix(e2e): consolidate frontend E2E to Cypress and restore CI (#967)#984
DevHusnainAi wants to merge 34 commits into
OWASP:mainfrom
DevHusnainAi:feature/consolidate-cypress-e2e

Conversation

@DevHusnainAi

Copy link
Copy Markdown

Closes #967

Consolidates the frontend E2E migration to Cypress and restores the
Test-e2e CI job, which has been disabled on main. Builds on #774 and
supersedes #729 / #732 (both now closed). Bundles the Playwright-install
guardrail.

Python Playwright is untouched

This PR does not touch Python Playwright (embeddings/scraping in
application/prompt_client/). The diff changes zero Playwright or
prompt_client files, and playwright install in make install-python
is unchanged. The Cypress e2e job simply doesn't invoke that target
(Cypress ships its own browser), so nothing Playwright is removed or
modified. The Python Test workflow (which exercises the Playwright/
embedding tests) stays green.

Why CI was red, and the fix

Re-enabling e2e.yml as-is failed because the e2e job built the SQLite
cache the wrong way:

  • flask db upgrade (migrations) is the Postgres path and omits
    columns the models added without a migration (e.g. cre.document_metadata),
    so upstream_sync failed with no such column.
  • The branch was 2 commits behind main, which left two Alembic heads
    flask db upgrade aborted with "Multiple head revisions".

Fix:

  • Merge upstream/main → single Alembic head (upstream's merge migration).
  • New make e2e-db target seeds the schema from the ORM models via
    create_all (the documented SQLite/CI path) then loads data with
    upstream_sync.
  • e2e.yml now runs install-deps + make e2e-db + make e2e, dropping
    migrate-upgrade and playwright install from the frontend job.

Test coverage (ported from the legacy Jest/Puppeteer suite)

Spec Flow
smoke.cy.js homepage search form, search → /search/{term}, browse /root_cres
search.cy.js no-results (asdf), free-text results (crypto)
standard.cy.js /node/standard/ASVS heading, sections, pagination
cre.cy.js CRE by id (558-807), case-insensitive filter
smartlink.cy.js internal redirect + external Mitre CWE fallback

Each spec asserts on real seeded data, so it fails on an empty DB
rather than passing against a broken backend.

Two notes on approach

  • Guardrail: the chore/playwright-install-guardrail change (69049e36)
    is already present in this branch as a commit with a byte-identical
    diff
    , so the Makefile + AGENTS.md guardrail docs land here. Cherry-picking
    the original SHA would just duplicate it.
  • Smartlink fixtures: local upstream_sync seeds only the CRE-linked
    subset, which doesn't include CWE/1002. I ported the same flow using
    seeded fixtures — ASVS/V13.2.5 (internal redirect) and an unmapped CWE id
    (external Mitre fallback) — so the test is deterministic.

Cleanup

Verification

All green on my fork (run):

  • Test-e2e: ✅ All specs passed! 11/11 (~10 min incl. full upstream_sync)
  • Test (Python): ✅ — Playwright/embedding tests unaffected
  • Lint Code Base: ✅
  • Local: make lint, yarn build, make e2e (3× no flakes).

PRAteek-singHWY and others added 17 commits March 3, 2026 12:01
Playwright here backs Python embeddings (prompt_client), not frontend
e2e. The Cypress migration replaced frontend e2e but this line was
removed by mistake, breaking `make install-python`. Restore it per
reviewer feedback on OWASP#774.
The readiness loop broke on success but fell through to yarn test:e2e
even when Flask never came up, causing confusing Cypress failures. Add a
post-loop probe that exits with a clear error if the server is still
unreachable. Addresses CodeRabbit review on OWASP#774.
…ings

Clarify Makefile and AGENTS.md so Cypress e2e migration PRs do not drop
playwright install from install-python (embeddings/scraping in prompt_client).

Co-authored-by: Cursor <cursoragent@cursor.com>
Build the e2e SQLite schema from the ORM models (create_all) instead of
migrate-upgrade: migrations are the Postgres path and omit columns the
models added without a migration (e.g. cre.document_metadata), so a
migrate-built cache is incomplete. Add a make e2e-db target and switch
the workflow to install-deps + e2e-db, dropping migrate-upgrade and the
unused playwright install (Cypress ships its own browser). Raise the job
timeout to cover the full upstream_sync graph download.

Refs OWASP#967
Add Cypress specs covering the historical Jest/Puppeteer coverage:
no-results and free-text search, ASVS standard browse, CRE lookup by id
and case-insensitive filter, and smartlink internal/external redirects.
Each spec asserts on real seeded data so it fails on an empty database.

Refs OWASP#967
Frontend e2e now runs on Cypress; drop the unused puppeteer and
jest-puppeteer devDependencies and their transitive lockfile entries.

Refs OWASP#967
Note how to seed the local database (make e2e-db) and run the Cypress
suite (make e2e, yarn cypress:open) in README and AGENTS.md.

Refs OWASP#967
Copilot AI review requested due to automatic review settings July 18, 2026 12:00

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Summary by CodeRabbit

  • New Features
    • Added comprehensive end-to-end coverage for searching, filtering, CRE pages, standards browsing, pagination, and smartlink redirects.
    • Added deterministic test data for consistent validation of core workflows.
  • Bug Fixes
    • Search results now return users to the top of the page when changing search terms.
  • Documentation
    • Added instructions for setting up and running Cypress end-to-end tests locally.
  • Refactor
    • Improved local and CI test reliability, including automatic failure screenshots.

Walkthrough

The PR migrates frontend E2E testing from Puppeteer/Jest to Cypress. It adds deterministic fixtures, Cypress coverage, robust Flask and database orchestration, updated CI execution, Python Playwright setup, and local development instructions.

Changes

Cypress E2E migration

Layer / File(s) Summary
Cypress test foundation
cypress.config.js, package.json, cypress/e2e/*, application/frontend/src/pages/Search/SearchName.tsx
Cypress replaces the previous E2E scripts and dependencies. Tests cover smoke navigation, search, CRE pages, standard browsing, filtering, and smartlink redirects. Search results now scroll to the top when the term changes.
E2E environment orchestration
Makefile, scripts/seed_e2e_fixtures.py, .github/workflows/e2e.yml, AGENTS.md
The Makefile seeds SQLite fixtures, starts Flask with readiness polling and cleanup, and runs Cypress. The workflow installs dependencies, prepares the database, runs E2E tests, and uploads screenshots after failures.
Developer E2E instructions
README.md
The README documents database seeding, headless Cypress execution, and interactive testing commands.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: pa04rth, paoga87, robvanderveer

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the Cypress E2E consolidation and CI restoration, which are the main changes in the pull request.
Description check ✅ Passed The description accurately explains the Cypress migration, deterministic database seeding, CI restoration, test coverage, and cleanup.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/e2e.yml:
- Around line 14-15: Update the checkout step using actions/checkout@v4 to set
persist-credentials to false, preventing the GitHub token from being stored in
local Git configuration while leaving the rest of the workflow unchanged.

In `@Makefile`:
- Around line 89-101: Update the Makefile recipe containing the Flask startup
and e2e test commands so all setup, environment exports, virtualenv activation,
background PID capture, trap registration, readiness polling, and test execution
run in one shell session. Add recipe line continuations and appropriate command
separators while preserving the existing startup, failure, and cleanup behavior.

In `@README.md`:
- Around line 362-363: Update the README comment for the make e2e-db command to
state that it rebuilds the local SQLite cache on every invocation and discards
the existing cache; remove the misleading “one-time” wording while leaving the
make e2e instruction unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: f9880549-6dce-4a44-b898-62a462cdd4cc

📥 Commits

Reviewing files that changed from the base of the PR and between 2d1aa47 and 0348a19.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (13)
  • .github/workflows/e2e.yml
  • AGENTS.md
  • Makefile
  • README.md
  • application/frontend/src/test/basic-e2e.test.ts
  • cypress.config.js
  • cypress.json
  • cypress/e2e/cre.cy.js
  • cypress/e2e/search.cy.js
  • cypress/e2e/smartlink.cy.js
  • cypress/e2e/smoke.cy.js
  • cypress/e2e/standard.cy.js
  • package.json
💤 Files with no reviewable changes (2)
  • application/frontend/src/test/basic-e2e.test.ts
  • cypress.json

Comment thread .github/workflows/e2e.yml
Comment thread Makefile
Comment thread README.md Outdated
Set persist-credentials: false on the e2e checkout (the job only reads,
never pushes) and correct the README: make e2e-db rebuilds and replaces
the local SQLite cache on every run, it is not a one-time step.

Refs OWASP#967
@DevHusnainAi

Copy link
Copy Markdown
Author

Hey team! @northdpole @robvanderveer @Pa04rth @paoga87

Just a quick heads-up that this migration is ready for your review. All 5 CI/CD pipelines are passing completely green, the legacy test suite has been successfully ported over to Cypress, and I've addressed the initial CodeRabbit feedback regarding workflow credentials and documentation updates.Let me know if you need any adjustments or if this is good to land!

Thanks.

@northdpole northdpole left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for consolidating the Cypress migration and for the careful create_all vs migrate-upgrade diagnosis — that SQLite/CI schema fix is the right call.

Accepting your offer on a lighter seed (see inline on e2e-db / upstream_sync). Once that lands and CI is green on this PR, this looks mergeable. Please also close #774 / #523 as superseded when we merge.

Comment thread Makefile Outdated
Comment thread .github/workflows/e2e.yml Outdated
Comment thread .github/workflows/e2e.yml
Comment thread cypress/e2e/cre.cy.js
Comment thread cypress/e2e/search.cy.js Outdated
Comment thread cypress/e2e/smoke.cy.js
Comment thread Makefile
Comment thread Makefile
Comment thread package.json Outdated
Comment thread cypress.config.js
@DevHusnainAi

Copy link
Copy Markdown
Author

Ok thanks.

SearchName.tsx was the only page-level route missing the window.scrollTo(0, 0)
on mount that every sibling page (Standard, BrowseRootCres, CRE, ...) already
has. Under the minimal e2e fixture, the leftover scroll from reaching the
homepage search bar (below a sticky header) carried into the client-side
route change, clipping the "Results matching" heading inside #mount's
overflow-y: auto and failing smoke.cy.js in CI.

standard.cy.js asserted the ASVS/V13.2.5 external reference link was visible
before expanding its accordion, but DocumentNode's NestedView keeps that
content in a display: none div until expanded — reorder the click before the
visibility assertion.

Verified with a real local Cypress run (yarn build + make e2e-db + make e2e):
all 5 specs / 11 tests pass.
@DevHusnainAi

Copy link
Copy Markdown
Author

Hey @northdpole — thanks for the detailed review, I think this addresses everything you flagged:

Biggest ask — no more live upstream_sync in CI
make e2e-db no longer hits opencre.org. It now runs schema creation (create_all, unchanged) followed by a new checked-in seeder, scripts/seed_e2e_fixtures.py, that inserts a small, explicit fixture graph directly via Node_collection (add_cre/add_node/add_link — the same calls the live sync already used). Zero network I/O, and the fixture's ids/terms (CRE 558-807, ASVS/V13.2.5, NIST/AC-1, CRE 170-772 "Cryptography", plus filler ASVS sections for pagination) are now a documented contract in the file's docstring instead of accidents of whatever prod data happened to sync.

CI timeout: dropped from 45m (sized for the network sync) to 15m now that there's no network dependency.

Stronger assertions: cre.cy.js, search.cy.js, smartlink.cy.js, and standard.cy.js were all updated to check actual rendered data (link containers, filter results, exact smartlink redirect target, expanded-accordion content) instead of just headings/chrome that would pass against an empty page.

Small cleanups: removed the duplicate cypress:run script in package.json, added a Cypress screenshot-on-failure artifact upload to the e2e workflow, and added a fail-fast check in make e2e if standards_cache.sqlite wasn't seeded first.

Two real bugs the fixture surfaced, also fixed: running this against the minimal fixture (rather than the full prod dataset) exposed two genuine issues, not just test flakiness:

  • SearchName.tsx was the only page-level route missing the window.scrollTo(0, 0) on mount that every sibling page already has (Standard.tsx, BrowseRootCres.tsx, etc.) — a leftover scroll position from the homepage search bar was clipping the results heading on a short page.
  • standard.cy.js asserted a hyperlink's visibility before expanding its accordion; reordered the click before the assertion.

Verification: ran the full thing for real locally — yarn build + make e2e-db + make e2e against actual headless Cypress/Electron, not just reasoning from source. All 5 specs / 11 tests pass.

This is a fork PR, so CI is sitting at action_required on the latest commit — whenever you get a chance to approve the workflow run, it should come back green. Let me know if anything else needs adjusting.

@DevHusnainAi

Copy link
Copy Markdown
Author

@northdpole Branch Updated so you can check and test.

@DevHusnainAi
DevHusnainAi requested a review from northdpole July 30, 2026 11:50
@DevHusnainAi

Copy link
Copy Markdown
Author

@northdpole Branch is updated again so you can test.

@northdpole northdpole mentioned this pull request Aug 6, 2026
@northdpole

Copy link
Copy Markdown
Collaborator

Please rebase onto latest main (~8 commits behind) while addressing the outstanding CHANGES_REQUESTED items. #523 is closed as superseded by #967 — this PR remains the active Cypress path.

@northdpole

Copy link
Copy Markdown
Collaborator

Maintainer note: if this PR is still blocked by end of August 2026, we will pick up the remaining review items ourselves (see #).

Still needed for merge: rebase onto main, fixture seed instead of live upstream_sync, shorter e2e timeout, and the stronger CRE/search assertions from the Jul 22 review.

@northdpole

Copy link
Copy Markdown
Collaborator

Correction on the fallback link: tracking issue is #1007 (finish Cypress e2e ourselves by 2026-08-31 if this PR has not landed).

@DevHusnainAi

Copy link
Copy Markdown
Author

@northdpole — rebased onto latest main and every CHANGES_REQUESTED item from the 2026-07-22 review is now addressed. The PR shows MERGEABLE again (the only conflict was package.json scripts, resolved below). Detail per item:

Blocking items (2026-07-22 review + #1007)

  • Fixture seed instead of live upstream_syncmake e2e-db no longer touches opencre.org. It now builds the schema with sqla.create_all() (unchanged) and then seeds a small, checked-in graph via scripts/seed_e2e_fixtures.py, using add_cre/add_node/add_link on Node_collection (the same calls the live sync used). Zero network I/O. The ids/terms the specs assert on are now an explicit fixture contract, documented in the file's docstring:
    • CRE 558-807 "Mutually authenticate" → linked to ASVS/V13.2.5 (has a hyperlink) and NIST/AC-1
    • CRE 170-772 "Cryptography" (matches the free-text crypto query)
    • ASVS/V2.1.1..24 filler so /node/standard/ASVS paginates
    • no CWE node, so the smartlink Mitre fallback is deterministic
  • e2e CI timeout 45m → 15m — sized for the old network sync; dropped now that there is none.
  • Keep create_all for the SQLite cache — schema still comes from the ORM, never migrate-upgrade. Left an inline note on the e2e-db step so it doesn't get "fixed" back to the Postgres migration path.
  • Stronger CRE filter assertionscre.cy.js now asserts the links container contents: unfiltered shows ASVS + NIST; ?applyFilters=true&filters=asvs keeps ASVS and drops NIST (and the same for upper-case ASVS, covering the case-insensitive path) — not just the filter chrome.
  • Stronger search assertionssearch.cy.js asserts the actual result row (Cryptography) rather than the always-present "Matching CREs" heading.

Soft items also done

  • standard.cy.js: expands V13.2.5, asserts its external https:// reference and the /cre/558-807 link, then clicks pagination and asserts the rendered content actually changes.
  • smartlink.cy.js: asserts exact redirect locations (/cre/558-807 internal; exact Mitre URL external) instead of a regex; Mitre stays a cy.request.
  • smoke.cy.js: /root_cres asserts a real root-CRE row.
  • make e2e fails fast with "run make e2e-db first" if standards_cache.sqlite is missing.
  • package.json: removed the duplicate cypress:run; dead puppeteer/jest-puppeteer gone; basic-e2e.test.ts removed.
  • playwright install guardrail comment in the Makefile kept as-is.
  • e2e.yml: checkout uses persist-credentials: false; screenshots-on-failure uploaded as a CI artifact.

Rebase / conflict

git merge upstream/main; the only conflict was package.json scripts, resolved to keep "test": "jest --config jest.component.config.js" (from main) alongside "test:e2e": "cypress run" + "cypress:open".

Local verification (real run, not just reasoning)

Full make e2e-db && make e2e against headless Electron on the merged tree:

✔  cre.cy.js        3/3
✔  search.cy.js     2/2
✔  smartlink.cy.js  2/2
✔  smoke.cy.js      3/3
✔  standard.cy.js   1/1
✔  All specs passed!  11  11

No network. prettier --check (cypress specs + touched frontend) and black --check (the seeder) are clean.

Since this is a fork PR, all four checks (Test-e2e, Test, Lint Code Base, CodeQL) are sitting at action_required — could you approve the workflow run so they execute, and re-review to clear the CHANGES_REQUESTED? Happy to close #774 as superseded on merge.

@northdpole

Copy link
Copy Markdown
Collaborator

Closed #1007 (fallback reminder ticket). Please ignore that deadline tracker — review continues on this PR / #967 only.

@northdpole northdpole left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-review (post Actions approval) — 2026-08-12

CI surface: Test / Lint / Frontend Lint / CodeQL green; Test-e2e job marked green with 11/11 Cypress specs passing.

That green e2e job is misleading. Digging the log:

Blocking

1. yarn build fails hard inside make e2e, but the recipe still succeeds

From the Test-e2e log (Run Cypress e2e):

  • webpack … compiled with 34 errors
  • error Command failed with exit code 1 (yarn build)
  • then Flask readiness curls / Cypress still run
  • job exits success because .ONESHELL is on and the recipe has no set -e, so Make uses the last command’s status (yarn test:e2e), not yarn build’s.

Please add set -euo pipefail (or at least set -e) at the top of the e2e (and ideally e2e-db) recipe so a failed frontend build fails the target/CI.

2. Cypress types are breaking the production webpack build

The 34 errors are TS2339 on Jest matchers (toBeTruthy / toBeNull) in ResourceSelector.test.tsx — classic Cypress global Assertion vs Jest/Chai clash after adding "cypress": "^13.17.0".

Cypress must not leak into the app/webpack TS program. Typical fixes (pick one, keep scope tight):

  • exclude **/*.test.tsx / cypress/ from the webpack TS program, and/or
  • isolate Cypress types (tsconfig for Cypress only; avoid triple-slash / global Cypress types in the app build)

Until yarn build is green on its own, e2e is not trustworthy even when specs pass.

Prior CHANGES_REQUESTED — addressed

Ask Status
Fixture seed instead of upstream_sync Done — scripts/seed_e2e_fixtures.py + make e2e-db (seed step succeeded in CI)
Drop e2e timeout to ~15m Done
Keep create_all for SQLite cache Done + comment
Stronger CRE filter / search / standard / smartlink / smoke assertions Done
Fail-fast if DB missing Done
Drop duplicate cypress:run Done
Screenshots artifact on failure Done
Keep playwright install comment Done

Nits (non-blocking once 1–2 fixed)

  • Docs drift: README + AGENTS.md still say e2e-db loads the graph from upstream / upstream_sync. Seeder is fixture-only — please fix the wording.
  • SearchName.tsx window.scrollTo(0, 0): harmless (mirrors Standard.tsx) but unrelated to Cypress — prefer drop or split.
  • seed_e2e_fixtures.py: with_graph() isn’t needed for add_cre/add_node/add_link; consider NO_LOAD_GRAPH_DB=1 on the seed invocation too (create_all already sets it) so a future Neo4j touch can’t flake CI.
  • .PHONY: add e2e / e2e-db when you’re there.

Verdict

Not merge-ready until make e2e fails on yarn build failure and yarn build is actually green (Cypress type isolation). Happy to re-approve quickly after that.

Comment thread Makefile
…ebpack TS program

- make e2e: add set -euo pipefail so a failing `yarn build` fails the
  target instead of being masked by the later `yarn test:e2e` exit code
  (.ONESHELL only checks the recipe's last command).
- tsconfig.json: exclude cypress/, cypress.config.js, and *.test.ts(x)
  from the app's TS program — Cypress's global Assertion type was
  clashing with Jest matchers in ResourceSelector.test.tsx, breaking
  yarn build with 34 TS2339 errors.
- README/AGENTS: fix stale "loads from upstream" wording for e2e-db,
  which seeds from the checked-in fixture graph, not upstream_sync.

Addresses northdpole's blocking review comments on PR OWASP#984.
…ith_graph()

seed_e2e_fixtures.py called Node_collection().with_graph(), which loads the
full in-memory CRE graph — unnecessary since add_cre/add_node/add_link all
guard graph writes with `if self.graph:`. Worse, the Makefile's seed
invocation was missing NO_LOAD_GRAPH_DB=1 (only the create_all step had it),
so Node_collection.__init__ would unconditionally try NEO_DB.instance()
during seeding — a latent Neo4j-touch flake risk in CI.

Verified with a real make e2e-db + make e2e run: 11/11 Cypress specs pass.
Also confirmed the earlier `set -euo pipefail` fix actually catches a broken
build (make e2e correctly fails instead of going green).

Addresses northdpole's remaining nit on PR OWASP#984.
@DevHusnainAi

Copy link
Copy Markdown
Author

@northdpole Addressed the remaining nits from the 2026-08-12 review:

  • Docs drift: fixed README/AGENTS.md wording — e2e-db seeds from the checked-in fixture graph, not upstream_sync.
  • .PHONY: added e2e / e2e-db.
  • seed_e2e_fixtures.py / Neo4j flake risk: dropped the unneeded .with_graph() call (add_cre/add_node/add_link all guard graph writes with if self.graph:, so it wasn't needed), and — found a real gap while checking this — the Makefile's seed invocation was missing NO_LOAD_GRAPH_DB=1 entirely (only the create_all step had it), so Node_collection.__init__ would've unconditionally tried NEO_DB.instance() during seeding. Fixed in d4f61568.
  • SearchName.tsx window.scrollTo: left as-is — it's a real fix for a flake (1f66827c, accordion-order under the fixture), not dead code. Happy to split it into its own PR if you'd still like it out of this one, just say the word.

Also re-verified the two blocking items end-to-end rather than just trusting the code change:

  • Ran a real make e2e-db + make e2e: 11/11 Cypress specs pass.
  • Deliberately broke main.tsx and confirmed make e2e now fails hard (Error 1) instead of going green — the set -euo pipefail fix actually catches it.

Commits: 8a5602f5 (set -e + tsconfig Cypress/Jest isolation + docs), d4f61568 (seed NO_LOAD_GRAPH_DB + with_graph removal).

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.

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

5 participants