Skip to content

Commit 6acf6e5

Browse files
committed
Add tests to verify conditional logic on quick actions
1 parent 44dab5a commit 6acf6e5

1 file changed

Lines changed: 69 additions & 1 deletion

File tree

test/e2e/action-menu.e2e.ts

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88
import { expect, test, type Page } from '@playwright/test'
99

10-
import { expectNotVisible } from './utils'
10+
import { expectNotVisible, getPageAsUser, stopInstance } from './utils'
1111

1212
const openActionMenu = async (page: Page) => {
1313
// open the action menu (use the sidenav button, as keyboard events aren't reliable in Playwright)
@@ -131,3 +131,71 @@ test('dismiss with Escape', async ({ page }) => {
131131
await page.keyboard.press('Escape')
132132
await expect(page.getByText('Enterto submit')).toBeHidden()
133133
})
134+
135+
test('router quick action "Add route" hidden for system router, visible for custom', async ({
136+
page,
137+
}) => {
138+
// system router: action should not appear
139+
await page.goto('/projects/mock-project/vpcs/mock-vpc/routers/mock-system-router')
140+
await openActionMenu(page)
141+
await expect(page.getByRole('option', { name: 'Add route' })).toBeHidden()
142+
await page.keyboard.press('Escape')
143+
144+
// custom router: action should appear
145+
await page.goto('/projects/mock-project/vpcs/mock-vpc/routers/mock-custom-router')
146+
await openActionMenu(page)
147+
await expect(page.getByRole('option', { name: 'Add route' })).toBeVisible()
148+
})
149+
150+
test('storage tab quick actions hidden when instance running, visible when stopped', async ({
151+
page,
152+
}) => {
153+
await page.goto('/projects/mock-project/instances/db1/storage')
154+
await openActionMenu(page)
155+
// running: disk actions not available
156+
await expect(page.getByRole('option', { name: 'Attach existing disk' })).toBeHidden()
157+
await expect(page.getByRole('option', { name: 'Create disk' })).toBeHidden()
158+
await page.keyboard.press('Escape')
159+
160+
await stopInstance(page)
161+
await openActionMenu(page)
162+
await expect(page.getByRole('option', { name: 'Attach existing disk' })).toBeVisible()
163+
await expect(page.getByRole('option', { name: 'Create disk' })).toBeVisible()
164+
})
165+
166+
test('networking tab quick actions: NIC gated by run state, IPs/subnets by availability', async ({
167+
page,
168+
}) => {
169+
await page.goto('/projects/mock-project/instances/db1')
170+
await page.getByRole('tab', { name: 'Networking' }).click()
171+
await openActionMenu(page)
172+
// running: NIC creation unavailable
173+
await expect(page.getByRole('option', { name: 'Add network interface' })).toBeHidden()
174+
// floating IP, ephemeral IP, and external subnet all have available resources
175+
await expect(page.getByRole('option', { name: 'Attach floating IP' })).toBeVisible()
176+
await expect(page.getByRole('option', { name: 'Attach ephemeral IP' })).toBeVisible()
177+
await expect(page.getByRole('option', { name: 'Attach external subnet' })).toBeVisible()
178+
await page.keyboard.press('Escape')
179+
180+
await stopInstance(page)
181+
await page.getByRole('tab', { name: 'Networking' }).click()
182+
await openActionMenu(page)
183+
await expect(page.getByRole('option', { name: 'Add network interface' })).toBeVisible()
184+
})
185+
186+
test('SCIM tab quick action "Create token" visible when permitted, hidden when not', async ({
187+
page,
188+
browser,
189+
}) => {
190+
// default session (fleet admin): action should appear
191+
await page.goto('/system/silos/maze-war/scim')
192+
await openActionMenu(page)
193+
await expect(page.getByRole('option', { name: 'Create token' })).toBeVisible()
194+
await page.keyboard.press('Escape')
195+
196+
// Jane Austen: fleet viewer, not silo admin on maze-war — gets 403, action should not appear
197+
const janeAustenPage = await getPageAsUser(browser, 'Jane Austen')
198+
await janeAustenPage.goto('/system/silos/maze-war/scim')
199+
await openActionMenu(janeAustenPage)
200+
await expect(janeAustenPage.getByRole('option', { name: 'Create token' })).toBeHidden()
201+
})

0 commit comments

Comments
 (0)