Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions playwright/admin_settings.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
mockAdminSettingsError,
mockAdminSettingsUpdate,
} from './utils/adminSettingsMocks';
import { readTestData } from './utils/testData';

test.describe('Admin Settings', () => {
test.describe('server returning error', () => {
Expand Down Expand Up @@ -40,6 +41,22 @@ test.describe('Admin Settings', () => {
await expect(page.getByTestId('input-starlark-exec-limit')).toBeVisible();
});

test('blocked images list should show', async ({ page }) => {
const blockedImages = page.getByTestId('editable-list-blocked-images');
await expect(blockedImages).toBeVisible();
await expect(
page.getByTestId('editable-list-item-alpine:latest'),
).toContainText('alpine:latest');
});

test('warn images list should show', async ({ page }) => {
const warnImages = page.getByTestId('editable-list-warn-images');
await expect(warnImages).toBeVisible();
await expect(
page.getByTestId('editable-list-item-busybox:latest'),
).toContainText('busybox:latest');
});

test('queue routes list should show', async ({ page }) => {
const queueRoutes = page.getByTestId('editable-list-queue-routes');
await expect(queueRoutes).toBeVisible();
Expand Down Expand Up @@ -194,6 +211,176 @@ test.describe('Admin Settings', () => {
await expect(saveButton).toBeHidden();
});

test.describe('image restriction lists should allow editing', () => {
test('blocked images list should add item', async ({ page }) => {
const blockedList = page.getByTestId(
'editable-list-blocked-images',
);

await expect(blockedList).toBeVisible();
await expect(
page.getByTestId('editable-list-item-python:3.12'),
).toHaveCount(0);

await page
.getByTestId('input-editable-list-blocked-images-image-add')
.fill('python:3.12');
await page
.getByTestId('input-editable-list-blocked-images-reason-add')
.fill('new blocked image');

await page
.getByTestId('button-editable-list-blocked-images-add')
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-python:3.12'),
).toContainText('python:3.12');
});

test('blocked images list should update reason', async ({ page }) => {
const blockedList = page.getByTestId(
'editable-list-blocked-images',
);

await expect(blockedList).toBeVisible();
await blockedList
.getByTestId('button-editable-list-item-alpine:latest-edit')
.click({ force: true });
await blockedList
.getByTestId('input-editable-list-item-alpine:latest')
.fill('updated blocked reason');
await blockedList
.getByRole('button', { name: 'save' })
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-alpine:latest'),
).toContainText('updated blocked reason');
});

test('blocked images list should remove item', async ({ page }) => {
const settings = readTestData<Record<string, any>>(
'settings_updated.json',
);
settings.compiler.blocked_images = [];
await mockAdminSettingsUpdate(page, settings);

const blockedList = page.getByTestId(
'editable-list-blocked-images',
);

await expect(blockedList).toBeVisible();
await blockedList
.getByTestId('button-editable-list-item-alpine:latest-edit')
.click({ force: true });
await blockedList
.getByRole('button', { name: 'remove' })
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-alpine:latest'),
).toHaveCount(0);
});

test('warn images list should add item', async ({ page }) => {
const warnList = page.getByTestId('editable-list-warn-images');

await expect(warnList).toBeVisible();
await expect(
page.getByTestId('editable-list-item-node:20'),
).toHaveCount(0);

await page
.getByTestId('input-editable-list-warn-images-image-add')
.fill('node:20');
await page
.getByTestId('input-editable-list-warn-images-reason-add')
.fill('new warn image');

await page
.getByTestId('button-editable-list-warn-images-add')
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-node:20'),
).toContainText('node:20');
});

test('warn images list should update reason', async ({ page }) => {
const warnList = page.getByTestId('editable-list-warn-images');

await expect(warnList).toBeVisible();
await warnList
.getByTestId('button-editable-list-item-busybox:latest-edit')
.click({ force: true });
await warnList
.getByTestId('input-editable-list-item-busybox:latest')
.fill('updated warn reason');
await warnList
.getByRole('button', { name: 'save' })
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-busybox:latest'),
).toContainText('updated warn reason');
});

test('warn images list should remove item', async ({ page }) => {
const settings = readTestData<Record<string, any>>(
'settings_updated.json',
);
settings.compiler.warn_images = [];
await mockAdminSettingsUpdate(page, settings);

const warnList = page.getByTestId('editable-list-warn-images');

await expect(warnList).toBeVisible();
await warnList
.getByTestId('button-editable-list-item-busybox:latest-edit')
.click({ force: true });
await warnList
.getByRole('button', { name: 'remove' })
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText('Success');
await expect(
page.getByTestId('editable-list-item-busybox:latest'),
).toHaveCount(0);
});

test('duplicate image add should show already exists message', async ({
page,
}) => {
await page
.getByTestId('input-editable-list-blocked-images-image-add')
.fill('alpine:latest');
await page
.getByTestId('input-editable-list-blocked-images-reason-add')
.fill('duplicate blocked image');

await page
.getByTestId('button-editable-list-blocked-images-add')
.click({ force: true });

await expect(page.getByTestId('alert')).toBeVisible();
await expect(page.getByTestId('alert')).toContainText(
'already exists in the blocked images list',
);
});
});

test('save button should skip non-edits', async ({ page }) => {
const editButton = page.getByTestId('editable-list-item-vela-edit');
const saveButton = page.getByTestId('editable-list-item-vela-save');
Expand Down
14 changes: 13 additions & 1 deletion playwright/test-data/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,19 @@
"compiler": {
"clone_image": "target/vela-git:latest",
"template_depth": 10,
"starlark_exec_limit": 500
"starlark_exec_limit": 500,
"blocked_images": [
{
"image": "alpine:latest",
"reason": "blocked for test coverage"
}
],
"warn_images": [
{
"image": "busybox:latest",
"reason": "warning for test coverage"
}
]
},
"queue": {
"routes": ["vela"]
Expand Down
22 changes: 21 additions & 1 deletion playwright/test-data/settings_updated.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,27 @@
"compiler": {
"clone_image": "target/vela-git:abc123",
"template_depth": 1,
"starlark_exec_limit": 5
"starlark_exec_limit": 5,
"blocked_images": [
{
"image": "alpine:latest",
"reason": "updated blocked reason"
},
{
"image": "python:3.12",
"reason": "new blocked image"
}
],
"warn_images": [
{
"image": "busybox:latest",
"reason": "updated warn reason"
},
{
"image": "node:20",
"reason": "new warn image"
}
]
},
"queue": {
"routes": ["vela123", "linux-large"]
Expand Down
Loading
Loading