49 lines
2.0 KiB
TypeScript
49 lines
2.0 KiB
TypeScript
|
|
import { test, expect } from '@playwright/test';
|
||
|
|
import { login, navigateTo, PORT_SLUG } from './helpers';
|
||
|
|
|
||
|
|
test.describe('Alerts (Phase B)', () => {
|
||
|
|
test.beforeEach(async ({ page }) => {
|
||
|
|
await login(page, 'super_admin');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('alert bell renders in topbar with no badge when no alerts', async ({ page }) => {
|
||
|
|
await navigateTo(page, '/');
|
||
|
|
const bell = page.getByTestId('alert-bell');
|
||
|
|
await expect(bell).toBeVisible({ timeout: 15_000 });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('alert bell popover opens', async ({ page }) => {
|
||
|
|
await navigateTo(page, '/');
|
||
|
|
const bell = page.getByTestId('alert-bell');
|
||
|
|
await expect(bell).toBeVisible({ timeout: 15_000 });
|
||
|
|
await bell.click();
|
||
|
|
|
||
|
|
// Popover header is the unambiguous proof that the popover rendered.
|
||
|
|
await expect(page.getByText('Active alerts').first()).toBeVisible({ timeout: 8_000 });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('dashboard renders the alert rail', async ({ page }) => {
|
||
|
|
await navigateTo(page, '/');
|
||
|
|
await expect(page.getByText('Pipeline Funnel').first()).toBeVisible({ timeout: 15_000 });
|
||
|
|
await expect(page.getByTestId('alert-rail')).toBeVisible({ timeout: 5_000 });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('/alerts page loads with three tabs', async ({ page }) => {
|
||
|
|
await navigateTo(page, '/alerts');
|
||
|
|
expect(page.url()).toContain(`/${PORT_SLUG}/alerts`);
|
||
|
|
await expect(page.getByTestId('tab-open')).toBeVisible({ timeout: 10_000 });
|
||
|
|
await expect(page.getByTestId('tab-dismissed')).toBeVisible();
|
||
|
|
await expect(page.getByTestId('tab-resolved')).toBeVisible();
|
||
|
|
|
||
|
|
await page.getByTestId('tab-resolved').click();
|
||
|
|
// No assertion on contents; just smoke that the tab swap doesn't error.
|
||
|
|
await expect(page.getByTestId('tab-resolved')).toHaveAttribute('data-state', 'active');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('sidebar Alerts link navigates to /alerts', async ({ page }) => {
|
||
|
|
await navigateTo(page, '/');
|
||
|
|
await page.getByRole('link', { name: 'Alerts', exact: true }).click();
|
||
|
|
await expect(page).toHaveURL(new RegExp(`/${PORT_SLUG}/alerts`), { timeout: 10_000 });
|
||
|
|
});
|
||
|
|
});
|