|
7 | 7 | */ |
8 | 8 | import { expect, test, type Page } from '@playwright/test' |
9 | 9 |
|
10 | | -import { expectNotVisible } from './utils' |
| 10 | +import { expectNotVisible, getPageAsUser, stopInstance } from './utils' |
11 | 11 |
|
12 | 12 | const openActionMenu = async (page: Page) => { |
13 | 13 | // 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 }) => { |
131 | 131 | await page.keyboard.press('Escape') |
132 | 132 | await expect(page.getByText('Enterto submit')).toBeHidden() |
133 | 133 | }) |
| 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