Skip to content

Commit 558345b

Browse files
authored
test: fix flaky access-control bulk delete tests failing due to timing issues (#15692)
### What? Fixed access-control e2e tests that check bulk delete button visibility based on trash permissions. <img width="1739" height="764" alt="Screenshot 2026-02-19 at 12 48 33 PM" src="https://github.com/user-attachments/assets/a70a2e0b-a2fe-4fc0-b47f-f2097eca0021" /> ### Why? Tests were selecting rows via checkbox then immediately expecting the bulk delete button to appear. In slower environments (especially CI), the bulk selection UI hadn't rendered yet, causing assertions to fail. ### How? - Target the actual checkbox input instead of the wrapper element - Use `.check()` instead of `.click()` for reliable checkbox interaction - Wait for checkbox to be checked and bulk selection UI to show "1 selected"
1 parent 00f763b commit 558345b

1 file changed

Lines changed: 56 additions & 21 deletions

File tree

test/access-control/e2e.spec.ts

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2212,11 +2212,16 @@ describe('Access Control', () => {
22122212
await expect(page.locator('.table tbody tr').first()).toBeVisible()
22132213

22142214
// Select a row
2215-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2216-
await checkbox.click()
2215+
const checkbox = page
2216+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2217+
.first()
2218+
await checkbox.check()
2219+
await expect(checkbox).toBeChecked()
2220+
2221+
await expect(page.locator('.list-selection')).toContainText('1 selected')
22172222

22182223
// Delete button should be visible in bulk actions
2219-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2224+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
22202225
await expect(deleteButton).toBeVisible()
22212226
})
22222227
})
@@ -2250,11 +2255,16 @@ describe('Access Control', () => {
22502255
await expect(page.locator('.table tbody tr').first()).toBeVisible()
22512256

22522257
// Select a row
2253-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2254-
await checkbox.click()
2258+
const checkbox = page
2259+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2260+
.first()
2261+
await checkbox.check()
2262+
await expect(checkbox).toBeChecked()
2263+
2264+
await expect(page.locator('.list-selection')).toContainText('1 selected')
22552265

22562266
// Delete button should be visible because user can trash (even if they can't permanently delete)
2257-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2267+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
22582268
await expect(deleteButton).toBeVisible()
22592269
})
22602270

@@ -2271,10 +2281,15 @@ describe('Access Control', () => {
22712281
await expect(page.locator('.table tbody tr').first()).toBeVisible()
22722282

22732283
// Select a row
2274-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2275-
await checkbox.click()
2284+
const checkbox = page
2285+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2286+
.first()
2287+
await checkbox.check()
2288+
await expect(checkbox).toBeChecked()
22762289

2277-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2290+
await expect(page.locator('.list-selection')).toContainText('1 selected')
2291+
2292+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
22782293
await expect(deleteButton).toBeVisible()
22792294
await deleteButton.click()
22802295

@@ -2316,11 +2331,16 @@ describe('Access Control', () => {
23162331
await expect(page.locator('.table tbody tr').first()).toBeVisible()
23172332

23182333
// Select a row
2319-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2320-
await checkbox.click()
2334+
const checkbox = page
2335+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2336+
.first()
2337+
await checkbox.check()
2338+
await expect(checkbox).toBeChecked()
2339+
2340+
await expect(page.locator('.list-selection')).toContainText('1 selected')
23212341

23222342
// Delete button should be visible for admin
2323-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2343+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
23242344
await expect(deleteButton).toBeVisible()
23252345
})
23262346
})
@@ -2354,11 +2374,16 @@ describe('Access Control', () => {
23542374
await expect(page.locator('.table tbody tr').first()).toBeVisible()
23552375

23562376
// Select a row
2357-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2358-
await checkbox.click()
2377+
const checkbox = page
2378+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2379+
.first()
2380+
await checkbox.check()
2381+
await expect(checkbox).toBeChecked()
2382+
2383+
await expect(page.locator('.list-selection')).toContainText('1 selected')
23592384

23602385
// Delete button should NOT be visible because user cannot trash or permanently delete
2361-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2386+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
23622387
await expect(deleteButton).toBeHidden()
23632388
})
23642389
})
@@ -2407,11 +2432,16 @@ describe('Access Control', () => {
24072432
await expect(page.locator('.table tbody tr').first()).toBeVisible()
24082433

24092434
// Select a row
2410-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2411-
await checkbox.click()
2435+
const checkbox = page
2436+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2437+
.first()
2438+
await checkbox.check()
2439+
await expect(checkbox).toBeChecked()
2440+
2441+
await expect(page.locator('.list-selection')).toContainText('1 selected')
24122442

24132443
// Delete button should be visible for admin (they can permanently delete)
2414-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2444+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
24152445
await expect(deleteButton).toBeVisible()
24162446
})
24172447
})
@@ -2450,12 +2480,17 @@ describe('Access Control', () => {
24502480
await expect(page.locator('.table tbody tr').first()).toBeVisible()
24512481

24522482
// Select a row
2453-
const checkbox = page.locator('.table tbody tr .select-row__checkbox').first()
2454-
await checkbox.click()
2483+
const checkbox = page
2484+
.locator('.table tbody tr .select-row__checkbox input[type=checkbox]')
2485+
.first()
2486+
await checkbox.check()
2487+
await expect(checkbox).toBeChecked()
2488+
2489+
await expect(page.locator('.list-selection')).toContainText('1 selected')
24552490

24562491
// Delete button should NOT be visible in trash view because
24572492
// regular users can only trash (soft delete), not permanently delete
2458-
const deleteButton = page.locator('.list-selection button', { hasText: 'Delete' })
2493+
const deleteButton = page.locator('.list-selection__button[aria-label="Delete"]')
24592494
await expect(deleteButton).toBeHidden()
24602495
})
24612496
})

0 commit comments

Comments
 (0)