From 107b575cec61aa530a336e36c1a586ba6dd4bced Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Tue, 1 Sep 2026 13:00:42 +0200 Subject: [PATCH 1/2] fix(e2e): the lint pass renamed Playwright fixtures, which killed the suite Playwright resolves a fixture BY NAME from the destructured parameter, so renaming an unused one to `_page` asks for a fixture that does not exist. The e2e leg dies before a single test runs and the report contains no test entries at all. Introduced by the pass that let the linter see tests/. The linter was right that the parameters were unused; underscore-prefixing is the fix for an ordinary unused argument and the wrong fix for a Playwright fixture, because the name is the lookup key. Same defect as buildiq#642, found by a fleet sweep. --- tests/e2e/workflows/crud-persistence.spec.ts | 2 +- .../rbac-authorization-workflow.spec.ts | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/tests/e2e/workflows/crud-persistence.spec.ts b/tests/e2e/workflows/crud-persistence.spec.ts index 27f1a09b..59fd4562 100644 --- a/tests/e2e/workflows/crud-persistence.spec.ts +++ b/tests/e2e/workflows/crud-persistence.spec.ts @@ -111,7 +111,7 @@ test.beforeEach(({ page }) => { // That error aborts the WHOLE SUITE before a single test runs — 0 collected, no // tally, and the failure names this file rather than anything under test. `{}` // is the documented way to say "no fixtures, but give me testInfo". -test.afterEach(async (_fixtures, testInfo) => { +test.afterEach(async ({}, testInfo) => { if (testInfo.status === testInfo.expectedStatus) return const dump = traffic .map((c) => diff --git a/tests/e2e/workflows/rbac-authorization-workflow.spec.ts b/tests/e2e/workflows/rbac-authorization-workflow.spec.ts index 9ecd8db9..ef612972 100644 --- a/tests/e2e/workflows/rbac-authorization-workflow.spec.ts +++ b/tests/e2e/workflows/rbac-authorization-workflow.spec.ts @@ -64,9 +64,7 @@ const ADMIN_GATED_ENDPOINTS = [ ] test.describe('consume-or-rbac-authorization — who-may-act preserved via OR RBAC', () => { - test('a signatory may initiate signing; a non-signatory is denied (403)', async ({ - _page, - }) => { + test('a signatory may initiate signing; a non-signatory is denied (403)', async () => { // Deferred live run: requires decidiq deployed with a Minutes record on a // body whose signatory scope (decidesk:body:{id}:signatory) is populated by // the role projector. A signatory's POST to @@ -81,9 +79,7 @@ test.describe('consume-or-rbac-authorization — who-may-act preserved via OR RB expect(BASE).toBeTruthy() }) - test('only the chair may run a chair-only lifecycle transition', async ({ - _page, - }) => { + test('only the chair may run a chair-only lifecycle transition', async () => { // Deferred live run: a chair-only transition (e.g. legislative opened→adjourned) // succeeds for a member of decidesk:body:{id}:chair and is refused for a // non-chair with "Only the meeting chair may perform this transition." @@ -96,9 +92,7 @@ test.describe('consume-or-rbac-authorization — who-may-act preserved via OR RB expect(BASE).toBeTruthy() }) - test('a disallowed domain transition is refused independent of actor scope', async ({ - _page, - }) => { + test('a disallowed domain transition is refused independent of actor scope', async () => { // Deferred live run: a domain whose workflow sets allowPause:false refuses // opened→paused for the chair too (workflow policy, not actor auth). Asserted // at unit level in MeetingServiceTest testDomainDisallowedTransitionReturnsFailure. @@ -109,9 +103,7 @@ test.describe('consume-or-rbac-authorization — who-may-act preserved via OR RB expect(BASE).toBeTruthy() }) - test('a non-admin is denied on every previously admin-gated surface; an admin is allowed', async ({ - _page, - }) => { + test('a non-admin is denied on every previously admin-gated surface; an admin is allowed', async () => { // Deferred live run: as a non-admin, each ADMIN_GATED_ENDPOINTS call returns // 401/403 from the shared RequiresOrAdmin trait; as an admin each is permitted. // Asserted at unit level in AuditLogControllerTest (admin allow / non-admin deny). From 853470f30b4e40f14e68a792bfa76271445fa36c Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Wed, 2 Sep 2026 03:57:26 +0200 Subject: [PATCH 2/2] fix(e2e): keep the empty fixture pattern, with the reason on the line above eslint's no-empty-pattern fires on `async ({}, testInfo)`, which is exactly the shape Playwright documents for "no fixtures, but give me testInfo". The file's own comment already said so. Naming it makes Playwright look for a fixture called _fixtures and refuse the whole file, so the disable carries the reason rather than the rule name alone. --- tests/e2e/workflows/crud-persistence.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/e2e/workflows/crud-persistence.spec.ts b/tests/e2e/workflows/crud-persistence.spec.ts index 59fd4562..11ab663f 100644 --- a/tests/e2e/workflows/crud-persistence.spec.ts +++ b/tests/e2e/workflows/crud-persistence.spec.ts @@ -111,6 +111,10 @@ test.beforeEach(({ page }) => { // That error aborts the WHOLE SUITE before a single test runs — 0 collected, no // tally, and the failure names this file rather than anything under test. `{}` // is the documented way to say "no fixtures, but give me testInfo". +// eslint-disable-next-line no-empty-pattern -- Playwright resolves fixtures +// BY NAME from this pattern, and `{}` is its documented way to say "no +// fixtures, but give me testInfo". Naming it (`_fixtures`) makes Playwright +// look for a fixture called _fixtures and refuse the whole file. test.afterEach(async ({}, testInfo) => { if (testInfo.status === testInfo.expectedStatus) return const dump = traffic