diff --git a/artifacts/tx-os/public/opengraph.jpg b/artifacts/tx-os/public/opengraph.jpg index 238f8b83..9b4bbf3a 100644 Binary files a/artifacts/tx-os/public/opengraph.jpg and b/artifacts/tx-os/public/opengraph.jpg differ diff --git a/artifacts/tx-os/tests/executive-meetings-row-actions-menu.spec.mjs b/artifacts/tx-os/tests/executive-meetings-row-actions-menu.spec.mjs index 146bbe2e..954b4cec 100644 --- a/artifacts/tx-os/tests/executive-meetings-row-actions-menu.spec.mjs +++ b/artifacts/tx-os/tests/executive-meetings-row-actions-menu.spec.mjs @@ -43,8 +43,21 @@ test("Schedule: row actions menu exposes delete + color + merge in a single popo // Exactly one consolidated kebab trigger per row, replacing what used // to be three separate overlay icons (Trash, Palette, Combine). - const kebab = page.locator('[data-testid^="em-row-actions-"]').first(); - await expect(kebab).toHaveCount(1); + // We require at least one row to be present — `>= 1` keeps the assertion + // resilient to the dev DB seed varying across runs while still confirming + // the kebab is mounted at all. + const kebabs = page.locator('[data-testid^="em-row-actions-"]'); + const kebabCount = await kebabs.count(); + expect(kebabCount).toBeGreaterThanOrEqual(1); + // Should be exactly one kebab per visible meeting row — rule out + // duplicate triggers leaking across multiple cells of the same row. + const visibleRows = await page + .locator('tr[data-testid^="em-row-"]') + .count(); + if (visibleRows > 0) { + expect(kebabCount).toBe(visibleRows); + } + const kebab = kebabs.first(); // Closed state: none of the legacy testids are mounted yet. await expect(page.locator('[data-testid^="em-delete-row-"]')).toHaveCount(0);