222346759e
* fix: correct settings test selector to match plugin name The settings E2E test looked for 'headlamp-polaris-plugin' but the plugin is registered as 'polaris' (package.json name and registerPluginSettings call). Fix the selector to match. Refs: PRI-28 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: add RBAC manifest for Polaris dashboard service proxy access E2E tests fail with 403 because users lack RBAC to proxy to the Polaris dashboard service. The plugin reads audit data via the K8s service proxy at /api/v1/namespaces/polaris/services/http:polaris-dashboard:80/proxy/. Add deployment/polaris-rbac.yaml with: - Role granting `get` on `services/proxy` for polaris-dashboard - RoleBinding granting this to all authenticated users (read-only) The E2E workflow also needs a `kubectl apply -f deployment/polaris-rbac.yaml` step added before running tests. This requires the `workflows` permission on the GitHub App, which is tracked separately. Refs: PRI-28 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: add Polaris RBAC apply and readiness check to E2E workflow The E2E tests fail because the CI runner lacks RBAC permissions to proxy to the Polaris dashboard service. Apply the RBAC manifest (added in this PR) and verify Polaris is reachable before running tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: remove kubectl steps from E2E workflow The CI runner (local-ubuntu-latest) has no kubectl or cluster access. E2E tests are browser-only via Playwright against a remote Headlamp URL. The Polaris RBAC fix (deployment/polaris-rbac.yaml) must be applied directly to the cluster by an operator with kubectl access. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: gandalf-the-greybeard[bot] <gandalf-the-greybeard[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
89 lines
3.3 KiB
TypeScript
89 lines
3.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('Polaris plugin settings', () => {
|
|
test('settings page shows configuration options', async ({ page }) => {
|
|
await page.goto('/c/main/settings/plugins');
|
|
|
|
// Find Polaris plugin in the list
|
|
const pluginCard = page.locator('text=polaris').first();
|
|
await expect(pluginCard).toBeVisible();
|
|
|
|
// Click to view settings (if settings are displayed inline, they should already be visible)
|
|
// Note: Headlamp v0.39.0+ shows settings inline on the plugins page
|
|
await expect(page.getByText('Polaris Settings')).toBeVisible({ timeout: 15_000 });
|
|
});
|
|
|
|
test('refresh interval setting is configurable', async ({ page }) => {
|
|
await page.goto('/c/main/settings/plugins');
|
|
|
|
// Navigate to Polaris settings
|
|
await expect(page.getByText('Polaris Settings')).toBeVisible({ timeout: 15_000 });
|
|
|
|
// Find the refresh interval dropdown
|
|
const intervalSelect = page.locator('select').filter({ hasText: /minute|second/ });
|
|
await expect(intervalSelect).toBeVisible();
|
|
|
|
// Get current value
|
|
const currentValue = await intervalSelect.inputValue();
|
|
|
|
// Change to a different value
|
|
const newValue = currentValue === '300' ? '600' : '300';
|
|
await intervalSelect.selectOption(newValue);
|
|
|
|
// Value should be updated
|
|
await expect(intervalSelect).toHaveValue(newValue);
|
|
});
|
|
|
|
test('dashboard URL setting is configurable', async ({ page }) => {
|
|
await page.goto('/c/main/settings/plugins');
|
|
|
|
// Navigate to Polaris settings
|
|
await expect(page.getByText('Polaris Settings')).toBeVisible({ timeout: 15_000 });
|
|
|
|
// Find the dashboard URL input
|
|
const urlInput = page.getByPlaceholder(/polaris-dashboard/);
|
|
await expect(urlInput).toBeVisible();
|
|
|
|
// Input should have the default proxy URL or custom URL
|
|
const currentUrl = await urlInput.inputValue();
|
|
expect(currentUrl).toBeTruthy();
|
|
|
|
// Examples text should be visible
|
|
await expect(page.getByText('Examples:')).toBeVisible();
|
|
await expect(page.getByText(/K8s proxy:/)).toBeVisible();
|
|
});
|
|
|
|
test('connection test button is available', async ({ page }) => {
|
|
await page.goto('/c/main/settings/plugins');
|
|
|
|
// Navigate to Polaris settings
|
|
await expect(page.getByText('Polaris Settings')).toBeVisible({ timeout: 15_000 });
|
|
|
|
// Find and verify test connection button
|
|
const testButton = page.getByRole('button', { name: /test connection/i });
|
|
await expect(testButton).toBeVisible();
|
|
await expect(testButton).toBeEnabled();
|
|
});
|
|
|
|
test('connection test works with valid URL', async ({ page }) => {
|
|
await page.goto('/c/main/settings/plugins');
|
|
|
|
// Navigate to Polaris settings
|
|
await expect(page.getByText('Polaris Settings')).toBeVisible({ timeout: 15_000 });
|
|
|
|
// Click test connection
|
|
const testButton = page.getByRole('button', { name: /test connection/i });
|
|
await testButton.click();
|
|
|
|
// Wait for either success or error message
|
|
// Note: This will succeed if Polaris is accessible, fail otherwise
|
|
await page.waitForSelector('text=/Connected successfully|Connection failed/', {
|
|
timeout: 15_000,
|
|
});
|
|
|
|
// Either success or failure is acceptable (depends on environment)
|
|
const result = await page.textContent('body');
|
|
expect(result).toMatch(/(Connected successfully|Connection failed)/);
|
|
});
|
|
});
|