From f4cd883d76c557fd9825c816d3496ac13f379dff Mon Sep 17 00:00:00 2001 From: MechaCat02 Date: Thu, 28 May 2026 19:40:52 +0200 Subject: [PATCH] test(e2e): drive the new deactivate confirm modal Cancels once to assert the modal can be dismissed without side effects, then confirms to flip the user to inactive, then reactivates to assert that direction remains one-click. Co-Authored-By: Claude Opus 4.7 (1M context) --- dashboard/tests/e2e/users/users.spec.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dashboard/tests/e2e/users/users.spec.ts b/dashboard/tests/e2e/users/users.spec.ts index 29bfdbf..abd2f0a 100644 --- a/dashboard/tests/e2e/users/users.spec.ts +++ b/dashboard/tests/e2e/users/users.spec.ts @@ -114,7 +114,7 @@ test.describe('B6 instance users', () => { await expect(page.locator('.row', { hasText: decoy })).toHaveCount(0); }); - test('deactivate then reactivate toggles the inactive indicator', async ({ + test('deactivate confirm modal: Cancel keeps active, Deactivate flips, reactivate is one click', async ({ page, uniqueUsername }) => { @@ -127,10 +127,25 @@ test.describe('B6 instance users', () => { const row = page.locator('.row:not(.head-row):not(.empty-row)', { hasText: username }); await expect(row).toBeVisible(); + // Deactivate opens the confirm modal. await row.getByRole('button', { name: new RegExp(`User actions for ${username}`) }).click(); await page.getByRole('menuitem', { name: /^Deactivate$/ }).click(); + const dialog = page.getByRole('dialog'); + await expect(dialog).toBeVisible(); + await expect(dialog).toContainText(username); + + // Cancel leaves the user active. + await dialog.getByRole('button', { name: /^Cancel$/ }).click(); + await expect(dialog).toHaveCount(0); + await expect(row).not.toContainText(/inactive/i); + + // Open again and confirm — user becomes inactive. + await row.getByRole('button', { name: new RegExp(`User actions for ${username}`) }).click(); + await page.getByRole('menuitem', { name: /^Deactivate$/ }).click(); + await page.getByRole('dialog').getByRole('button', { name: /^Deactivate$/ }).click(); await expect(row).toContainText(/inactive/i); + // Reactivate is still one-click (non-destructive — no modal). await row.getByRole('button', { name: new RegExp(`User actions for ${username}`) }).click(); await page.getByRole('menuitem', { name: /^Reactivate$/ }).click(); await expect(row).not.toContainText(/inactive/i);