All checks were successful
Build & Publish / publish (push) Successful in 53s
Add BreadcrumbProvider context so pages can override TopBar breadcrumbs dynamically. Add Playwright e2e tests for dashboard, agents, routes, exchanges, and admin pages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
81 lines
3.0 KiB
TypeScript
81 lines
3.0 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
|
|
test.describe('Agent Health (/agents)', () => {
|
|
test('renders stat cards and group cards', async ({ page }) => {
|
|
await page.goto('/agents')
|
|
|
|
// Stat strip
|
|
await expect(page.getByText('Total Agents')).toBeVisible()
|
|
await expect(page.getByText('Total TPS')).toBeVisible()
|
|
|
|
// Group cards for each application
|
|
await expect(page.getByText('order-service').first()).toBeVisible()
|
|
await expect(page.getByText('payment-svc').first()).toBeVisible()
|
|
await expect(page.getByText('notification-hub').first()).toBeVisible()
|
|
|
|
// Instance tables have data
|
|
const instanceRows = page.locator('table tbody tr')
|
|
expect(await instanceRows.count()).toBeGreaterThan(0)
|
|
|
|
// Instance table headers
|
|
await expect(page.getByRole('columnheader', { name: 'Instance' }).first()).toBeVisible()
|
|
await expect(page.getByRole('columnheader', { name: 'State' }).first()).toBeVisible()
|
|
await expect(page.getByRole('columnheader', { name: 'Uptime' }).first()).toBeVisible()
|
|
await expect(page.getByRole('columnheader', { name: 'TPS' }).first()).toBeVisible()
|
|
|
|
// Timeline section
|
|
await expect(page.getByText('Timeline').first()).toBeVisible()
|
|
})
|
|
|
|
test('clicking an instance row opens the detail panel', async ({ page }) => {
|
|
await page.goto('/agents')
|
|
|
|
// Click first instance row
|
|
const instanceRow = page.locator('table tbody tr').first()
|
|
await instanceRow.click()
|
|
|
|
// Detail panel opens — look for detail-specific labels
|
|
await expect(page.getByText('Version').first()).toBeVisible()
|
|
await expect(page.getByText('Throughput').first()).toBeVisible()
|
|
})
|
|
|
|
test('detail panel has Performance tab with charts', async ({ page }) => {
|
|
await page.goto('/agents')
|
|
|
|
// Click an instance to open detail panel
|
|
const instanceRow = page.locator('table tbody tr').first()
|
|
await instanceRow.click()
|
|
|
|
// Wait for panel to open
|
|
await expect(page.getByText('Version').first()).toBeVisible()
|
|
|
|
// DetailPanel tabs are plain buttons (not role="tab")
|
|
// Switch to Performance tab
|
|
const perfTab = page.getByRole('button', { name: 'Performance' })
|
|
await perfTab.click()
|
|
|
|
// Performance charts should render
|
|
await expect(page.getByText('Throughput (msg/s)').first()).toBeVisible()
|
|
await expect(page.getByText('Error Rate (err/h)').first()).toBeVisible()
|
|
})
|
|
|
|
test('app-scoped agents view', async ({ page }) => {
|
|
await page.goto('/agents/order-service')
|
|
|
|
// Breadcrumb/scope shows app
|
|
await expect(page.getByLabel('Breadcrumb').getByText('Agents')).toBeVisible()
|
|
|
|
// Only order-service agents should show
|
|
await expect(page.getByText('ord-1').first()).toBeVisible()
|
|
await expect(page.getByText('ord-2').first()).toBeVisible()
|
|
await expect(page.getByText('ord-3').first()).toBeVisible()
|
|
})
|
|
|
|
test('dead agent shows alert banner', async ({ page }) => {
|
|
await page.goto('/agents')
|
|
|
|
// notification-hub has a dead instance, should show alert
|
|
await expect(page.getByText('Single point of failure')).toBeVisible()
|
|
})
|
|
})
|