Skip to content

E2e/split/playwright suite - #2204

Draft
papistacoding wants to merge 21 commits into
mainfrom
e2e/split/playwright-suite
Draft

E2e/split/playwright suite#2204
papistacoding wants to merge 21 commits into
mainfrom
e2e/split/playwright-suite

Conversation

@papistacoding

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercel Bot commented Aug 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
openlane-ui Ready Ready Preview Sep 2, 2026 10:40pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
storybook Ignored Ignored Sep 2, 2026 10:40pm UTC

Request Review

@github-actions github-actions Bot added the ci label Aug 25, 2026
Comment thread .github/workflows/console-checks.yml Fixed
Comment thread .github/workflows/console-checks.yml Fixed
Comment thread .github/workflows/console-e2e.yml Fixed
Comment thread .github/workflows/console-e2e.yml Fixed
Comment thread apps/console/e2e/utils/recaptcha.ts Fixed
Comment thread apps/console/e2e/global-setup.ts Fixed
Comment thread apps/console/e2e/utils/api.ts Dismissed
Comment thread apps/console/e2e/utils/api.ts Dismissed
Comment thread apps/console/e2e/utils/registerUser.ts Dismissed
Comment thread .github/workflows/console-e2e.yml Fixed
Comment thread .github/workflows/console-e2e.yml Fixed
Comment thread .github/workflows/console-e2e.yml Fixed
Comment thread apps/console/e2e/global-setup.ts Dismissed
Signed-off-by: papistacoding <bruno.papista@gmail.com>
…ntories)

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
Adds aria-labels to the icon-only edit/delete/reorder buttons on both
pages — they had no accessible name at all, which is an a11y defect and
also left the tests reaching for CSS classes.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
The create and edit forms validated title and text but rendered no
message, so submitting an incomplete update did nothing visible. Uses
the repo's prevailing paragraph pattern, matching the FAQ form.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Drops the trust-centre argument from the backend decision memo now that
the area is covered locally.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
… validation

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
The suite should be reviewable without the CI-backend decision attached
to it. Workflows, the sharding plan and the backend decision memo move
to e2e/split/ci-workflows, which stacks on this branch.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
The directory holds replayable session cookies and the shared test
password. mode on mkdirSync/writeFileSync only applies at creation, so an
existing .auth kept 0755/0644 — chmod explicitly.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Signed-off-by: papistacoding <bruno.papista@gmail.com>
… build-out

Signed-off-by: papistacoding <bruno.papista@gmail.com>
…he suite

Coverage — closes the last create/edit/delete gaps found by auditing all 139
form components against the suite:

- exposure-entities-crud.spec.ts: findings, scans, remediations and
  vulnerabilities. Table-driven because all four pages are generated from
  GenericTablePage; scans carry mutateVia: 'bulk' since their detail sheet uses
  overrideHeader and exposes no Edit/Delete at all.
- exposure-action-plans-crud.spec.ts: action plans from the risk Mitigation tab.
- integrations-config-form.spec.ts: the RJSF schema form on a definition page.
  Deliberately does not complete a connection — that would authenticate against
  a third-party service.
- utils/api.ts: seeders for finding, scan, remediation, vulnerability and
  action plan.

De-flaking — the suite was carrying 11 tests that failed then passed on retry.
Root causes, not timeout padding:

- actionTimeout 15s -> 30s. Most flakes were literally
  "locator.click: Timeout 15000ms" on menus and rows rendering late under
  8-way load. One lever, whole class.
- procedures-table sorting assumed the first header click sorts ascending, but
  the table has a defaultSorting, so from a sorted state the cycle is
  descending -> none and "none" leaves arbitrary order. Drive off aria-sort.
- org-lifecycle-fresh reloaded while the update was still in flight.
- procedures-table pagination waited for /^Page 1 of \d+$/, which matches
  "Page 1 of 1" before the seeded rows are counted.
- completeOnboarding polled for 90s inside a 90s test timeout.
- utils/menu.ts: shared openRowAction / confirmDestructiveDialog for Radix
  portal menus that detach when the underlying table refetches.

Also replaces transient-toast assertions with server-observable ones
(waitForResponse, or the resulting state) — toasts live ~4s and were the direct
cause of several false failures.

Full suite: 986 tests, 972 passing, 0 failing at 8 workers.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Aggregating the flaky set across 13 full-suite runs showed 57 distinct tests had
flaked at least once, but 40 of them (70%) in exactly one run — noise, not
fragility. Only five were chronic, and those are what this fixes.

global-setup: seedRoleUser did a bare waitForURL(/dashboard/, 30s) after login.
On expiry it threw, which kills the whole run before a single test executes —
two of the last three full runs died here and produced no data at all. It also
gave no clue where the browser actually was. It now reports the stuck URL, and
that immediately showed the real cause was not the session-cookie bounce but the
login failing outright, leaving us on /login where re-navigating is futile. It
now re-attempts the login for that case and only re-navigates for the cookie
race.

automation-workflows (worst offender, 4/13): the deletes verified through the UI
list, which serves stale results right after a mutation. Assert through
findWorkflowDefinitionId at the API instead, keeping the list check as a
secondary.

onboarding (3/13 each): both chronic tests walk the whole wizard but only the
happy path carried test.slow(). Mark the re-entry test too.

automation-templates (3/13): the column-visibility toggle and the header
assertion could straddle a re-render. Check current state before toggling and
retry the cycle.

Latest full suite: 971 passed, 1 failed, 4 flaky — and none of the five chronic
tests appear in it.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Cover the remaining CRUD, bulk-import, bulk-edit and comment flows, and
assert the mutations actually fire rather than that a dialog opened.

Skip every permission-gating test behind E2E_PERMISSION_GATES so the suite
can merge before the gating does, and fix the races that made the suite
flaky: a null membership node in roleOf, the router cache serving a stale
list, and the loads that outrun a pending permission query.

Brings the segmented Playwright config and the e2e directory back in sync
with the branch this was split from.

Signed-off-by: papistacoding <bruno.papista@gmail.com>
Unit coverage for the areas main added since this branch forked: merge edge
collection and paging, member/group CSV exports, auditor mapped controls, the
CUSTOM standard filter, the stripe live-subscription pick, sticky-search TTL
and the CSV writer's formula-injection guard. E2E covers merge mode, the
members/groups export dialogs and the review sheet resolver.

Fixes the suite against main:

- bulk-update toasts moved to getBulkUpdateOutcome in #2181, and a single
  selected row renders the singular label
- the token expiry calendar regex matched the 15th and 25th as well as the 5th
- clicks on menus that re-render resolved but never settled, so they are
  dispatched via clickResilient
- controls waitForURL matched /controls/create-control itself and returned
  before the record existed
- inline renames reloaded while the update mutation was still in flight
- create forms could be covered by the draft-restore modal
- specs that depended on another spec seeding a row now seed their own

Also fixes the trust-center domain page rendering no actions when a custom
domain has no CNAME record, which left the domain impossible to edit or
delete, and labels its icon-only buttons.

Claude-Session: https://claude.ai/code/session_012ihgrrWpm5P59vajforERs
Signed-off-by: papistacoding <bpapista@theopenlane.io>
The column-visibility retry assumed the menu was closed at the start of each
attempt. When Escape did not land, the trigger stopped being exposed as a
button while the menu stayed open, so the next attempt's click burned its full
30s actionability wait and the 60s toPass budget expired.

Reproduced at 1 failure in 10 runs; 20/20 after the fix.

Claude-Session: https://claude.ai/code/session_012ihgrrWpm5P59vajforERs
Signed-off-by: papistacoding <bpapista@theopenlane.io>
…ce on load

The modal renders after the create page reads its stored draft, so the one-shot
check straight after goto raced it and the form stayed covered. addLocatorHandler
fires at the moment the modal actually blocks an action instead.

Also opens the group-membership role select through openRowAction, so a
background refetch cannot swallow the click and leave the option unopened.

Claude-Session: https://claude.ai/code/session_012ihgrrWpm5P59vajforERs
Signed-off-by: papistacoding <bpapista@theopenlane.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants