fix(e2e): match the modal OK button exactly so a random suffix cannot collide (#253) #256

Merged
bermudalamb merged 2 commits from fix/253-exact-locator-names into main 2026-09-01 09:42:37 -05:00
Owner

Playwright matches an accessible name case-insensitively and as a substring unless exact is passed, so getByRole('button', { name: 'OK' }) matched any button whose name merely contained "ok".

Caught on a full serial run of main:

strict mode violation: getByRole('button', { name: 'OK' }) resolved to 2 elements:
    1) aka getByRole('button', { name: 'Freed rmtiq9okg22k9e' })
    2) aka getByRole('button', { name: 'OK', exact: true })

A leftover "Freed …" toast was still on screen and the random base36 suffix happened to contain "ok". Roughly one suffix in a few hundred does, which is the profile of a test that fails occasionally and reproduces for nobody.

This is not the contention #241 addressed. It reproduced with workers: 1, serially, on a fresh database — it needs only a stale toast and an unlucky suffix. It is at least part of what #245 skipped a real test to work around.

Also makes the taxonomy modal's OK and the sold-filter 'All' radio exact, the only other targets short enough to appear inside a random suffix. The dozen or so remaining short names are left alone deliberately: they would need a collision in deliberately-chosen test data rather than a random one, and substring matching is load-bearing in some of them.

Verified with two consecutive full e2e passes, 155 of 155 both times.

Closes #253

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

Playwright matches an accessible name case-insensitively and as a substring unless exact is passed, so `getByRole('button', { name: 'OK' })` matched any button whose name merely contained "ok". Caught on a full serial run of main: strict mode violation: getByRole('button', { name: 'OK' }) resolved to 2 elements: 1) aka getByRole('button', { name: 'Freed rmtiq9okg22k9e' }) 2) aka getByRole('button', { name: 'OK', exact: true }) A leftover "Freed …" toast was still on screen and the random base36 suffix happened to contain "ok". Roughly one suffix in a few hundred does, which is the profile of a test that fails occasionally and reproduces for nobody. This is not the contention #241 addressed. It reproduced with workers: 1, serially, on a fresh database — it needs only a stale toast and an unlucky suffix. It is at least part of what #245 skipped a real test to work around. Also makes the taxonomy modal's OK and the sold-filter 'All' radio exact, the only other targets short enough to appear inside a random suffix. The dozen or so remaining short names are left alone deliberately: they would need a collision in deliberately-chosen test data rather than a random one, and substring matching is load-bearing in some of them. Verified with two consecutive full e2e passes, 155 of 155 both times. Closes #253 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bermudalamb added 1 commit 2026-09-01 09:42:15 -05:00
fix(e2e): match the modal OK button exactly so a random suffix cannot collide (#253)
SonarQube Analysis / sonarqube (pull_request) Successful in 26m29s
Linting / lint (pull_request) Successful in 2m25s
74936e6d6a
Playwright matches an accessible name case-insensitively and as a substring unless exact is passed, so `getByRole('button', { name: 'OK' })` matched any button whose name merely contained "ok".

Caught on a full serial run of main:

    strict mode violation: getByRole('button', { name: 'OK' }) resolved to 2 elements:
        1) aka getByRole('button', { name: 'Freed rmtiq9okg22k9e' })
        2) aka getByRole('button', { name: 'OK', exact: true })

A leftover "Freed …" toast was still on screen and the random base36 suffix happened to contain "ok". Roughly one suffix in a few hundred does, which is the profile of a test that fails occasionally and reproduces for nobody.

This is not the contention #241 addressed. It reproduced with workers: 1, serially, on a fresh database — it needs only a stale toast and an unlucky suffix. It is at least part of what #245 skipped a real test to work around.

Also makes the taxonomy modal's OK and the sold-filter 'All' radio exact, the only other targets short enough to appear inside a random suffix. The dozen or so remaining short names are left alone deliberately: they would need a collision in deliberately-chosen test data rather than a random one, and substring matching is load-bearing in some of them.

Verified with two consecutive full e2e passes, 155 of 155 both times.

Closes #253

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bermudalamb added 1 commit 2026-09-01 09:42:25 -05:00
Merge branch 'main' into fix/253-exact-locator-names
SonarQube Analysis / sonarqube (pull_request) Successful in 25m49s
Linting / lint (pull_request) Successful in 2m18s
5e35e13712
bermudalamb merged commit 46f5064567 into main 2026-09-01 09:42:37 -05:00
bermudalamb deleted branch fix/253-exact-locator-names 2026-09-01 09:42:38 -05:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bermudalamb/redefined-designs#256