d4ac2b2f23
The 'navigation between plugin views works' test was navigating directly to /c/main/intel-gpu and then immediately trying to find sidebar child links (GPU Nodes, GPU Pods, Metrics). Direct URL navigation does not guarantee that the Headlamp sidebar parent entry is expanded, so the child links may not be rendered yet. Fix: start from the home page and click the 'intel-gpu' sidebar button to explicitly expand the section before asserting on child link visibility. This mirrors the real user flow (tests 1 and 2 already use this approach) and eliminates the race between navigation and sidebar render. Fixes #34 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
107 lines
4.2 KiB
TypeScript
107 lines
4.2 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('Intel GPU plugin smoke tests', () => {
|
|
test('sidebar contains intel-gpu entry', async ({ page }) => {
|
|
await page.goto('/');
|
|
const sidebar = page.getByRole('navigation', { name: 'Navigation' });
|
|
await expect(sidebar).toBeVisible({ timeout: 15_000 });
|
|
await expect(sidebar.getByRole('button', { name: 'intel-gpu' })).toBeVisible();
|
|
});
|
|
|
|
test('sidebar intel-gpu entry is clickable and navigates to overview', async ({ page }) => {
|
|
await page.goto('/');
|
|
const sidebar = page.getByRole('navigation', { name: 'Navigation' });
|
|
await expect(sidebar).toBeVisible({ timeout: 15_000 });
|
|
|
|
const gpuEntry = sidebar.getByRole('button', { name: 'intel-gpu' });
|
|
await expect(gpuEntry).toBeVisible();
|
|
await gpuEntry.click();
|
|
|
|
// Should navigate to the overview route
|
|
await expect(page).toHaveURL(/\/intel-gpu$/);
|
|
await expect(page.getByRole('heading', { name: /intel.gpu/i })).toBeVisible();
|
|
});
|
|
|
|
test('overview page renders GPU device list or empty state', async ({ page }) => {
|
|
await page.goto('/c/main/intel-gpu');
|
|
|
|
// Overview heading should be present
|
|
await expect(page.getByRole('heading', { name: /intel.gpu/i })).toBeVisible({
|
|
timeout: 15_000,
|
|
});
|
|
|
|
// Either a populated table/list or an empty-state indicator must be visible
|
|
const hasTable = await page.locator('table').first().isVisible().catch(() => false);
|
|
const hasEmptyState = await page
|
|
.locator('text=/no.*gpu|no.*device|0 node|empty/i')
|
|
.first()
|
|
.isVisible()
|
|
.catch(() => false);
|
|
expect(hasTable || hasEmptyState).toBe(true);
|
|
});
|
|
|
|
test('device plugins page renders or shows empty state', async ({ page }) => {
|
|
await page.goto('/c/main/intel-gpu/device-plugins');
|
|
|
|
await expect(page.getByRole('heading', { name: /device plugin/i })).toBeVisible({
|
|
timeout: 15_000,
|
|
});
|
|
|
|
const hasTable = await page.locator('table').first().isVisible().catch(() => false);
|
|
const hasEmptyState = await page
|
|
.locator('text=/no.*plugin|no.*device|empty/i')
|
|
.first()
|
|
.isVisible()
|
|
.catch(() => false);
|
|
expect(hasTable || hasEmptyState).toBe(true);
|
|
});
|
|
|
|
test('navigation between plugin views works', async ({ page }) => {
|
|
await page.goto('/');
|
|
const sidebar = page.getByRole('navigation', { name: 'Navigation' });
|
|
await expect(sidebar).toBeVisible({ timeout: 15_000 });
|
|
|
|
// Expand the intel-gpu sidebar section by clicking the parent entry.
|
|
// Direct URL navigation does not guarantee the sidebar children are rendered;
|
|
// clicking the parent entry mimics the real user flow and ensures child links
|
|
// are visible before we try to interact with them.
|
|
const gpuEntry = sidebar.getByRole('button', { name: 'intel-gpu' });
|
|
await expect(gpuEntry).toBeVisible();
|
|
await gpuEntry.click();
|
|
|
|
await expect(page).toHaveURL(/\/intel-gpu$/);
|
|
await expect(page.getByRole('heading', { name: /intel.gpu/i })).toBeVisible({
|
|
timeout: 15_000,
|
|
});
|
|
|
|
// Navigate to GPU Nodes
|
|
const nodesLink = sidebar.getByRole('link', { name: /gpu nodes/i });
|
|
await expect(nodesLink).toBeVisible();
|
|
await nodesLink.click();
|
|
await expect(page).toHaveURL(/\/intel-gpu\/nodes$/);
|
|
await expect(page.getByRole('heading', { name: /node/i })).toBeVisible();
|
|
|
|
// Navigate to GPU Pods
|
|
const podsLink = sidebar.getByRole('link', { name: /gpu pods/i });
|
|
await expect(podsLink).toBeVisible();
|
|
await podsLink.click();
|
|
await expect(page).toHaveURL(/\/intel-gpu\/pods$/);
|
|
await expect(page.getByRole('heading', { name: /pod/i })).toBeVisible();
|
|
|
|
// Navigate to Metrics
|
|
const metricsLink = sidebar.getByRole('link', { name: /metrics/i });
|
|
await expect(metricsLink).toBeVisible();
|
|
await metricsLink.click();
|
|
await expect(page).toHaveURL(/\/intel-gpu\/metrics$/);
|
|
await expect(page.getByRole('heading', { name: /metric/i })).toBeVisible();
|
|
});
|
|
|
|
test('plugin settings page shows intel-gpu plugin entry', async ({ page }) => {
|
|
await page.goto('/settings/plugins');
|
|
|
|
// Wait for plugin list to load — plugin scripts load asynchronously
|
|
const pluginEntry = page.locator('text=intel-gpu').first();
|
|
await expect(pluginEntry).toBeVisible({ timeout: 30_000 });
|
|
});
|
|
});
|