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);