102 lines
3.4 KiB
TypeScript
102 lines
3.4 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
const errorPages = [
|
|
{
|
|
path: "/400",
|
|
heading: "Bad Request",
|
|
primaryHref: "/docs",
|
|
secondaryHref: "/dashboard/translator",
|
|
},
|
|
{
|
|
path: "/401",
|
|
heading: "Unauthorized",
|
|
primaryHref: "/login",
|
|
secondaryHref: "/dashboard/api-manager",
|
|
},
|
|
{
|
|
path: "/403",
|
|
heading: "Forbidden",
|
|
primaryHref: "/forbidden",
|
|
secondaryHref: "/dashboard/settings?tab=security",
|
|
},
|
|
{
|
|
path: "/408",
|
|
heading: "Request Timeout",
|
|
primaryHref: "/dashboard/endpoint",
|
|
secondaryHref: "/status",
|
|
},
|
|
{
|
|
path: "/429",
|
|
heading: "Too Many Requests",
|
|
primaryHref: "/dashboard/settings?tab=resilience",
|
|
secondaryHref: "/dashboard/combos",
|
|
},
|
|
{
|
|
path: "/500",
|
|
heading: "Internal Server Error",
|
|
primaryHref: "/dashboard/health",
|
|
secondaryHref: "/dashboard/logs",
|
|
},
|
|
{
|
|
path: "/502",
|
|
heading: "Bad Gateway",
|
|
primaryHref: "/dashboard/providers",
|
|
secondaryHref: "/dashboard/translator",
|
|
},
|
|
{
|
|
path: "/503",
|
|
heading: "Service Unavailable",
|
|
primaryHref: "/maintenance",
|
|
secondaryHref: "/status",
|
|
},
|
|
];
|
|
|
|
test.describe("Error and Resilience Pages", () => {
|
|
for (const pageSpec of errorPages) {
|
|
test(`${pageSpec.path} renders actionable recovery actions`, async ({ page }) => {
|
|
const response = await page.goto(pageSpec.path);
|
|
expect(response).toBeTruthy();
|
|
const expectedHttpStatus = Number.parseInt(pageSpec.path.slice(1), 10);
|
|
expect([200, expectedHttpStatus]).toContain(response?.status());
|
|
|
|
await expect(page.getByRole("heading", { name: pageSpec.heading })).toBeVisible();
|
|
await expect(page.locator(`a[href="${pageSpec.primaryHref}"]`).first()).toBeVisible();
|
|
await expect(page.locator(`a[href="${pageSpec.secondaryHref}"]`).first()).toBeVisible();
|
|
});
|
|
}
|
|
|
|
test("missing route renders not-found recovery actions", async ({ page }) => {
|
|
await page.goto("/route-that-does-not-exist");
|
|
|
|
await expect(page.getByRole("heading", { name: /Page not found/i })).toBeVisible();
|
|
await expect(page.locator('a[href="/dashboard"]')).toBeVisible();
|
|
await expect(page.locator('a[href="/status"]')).toBeVisible();
|
|
});
|
|
|
|
test("/offline explains connectivity and offers recovery actions", async ({ page }) => {
|
|
const response = await page.goto("/offline");
|
|
expect(response?.ok()).toBeTruthy();
|
|
|
|
await expect(page.getByRole("heading", { name: "Connectivity Issue" })).toBeVisible();
|
|
await expect(page.getByRole("button", { name: "Retry Connection" })).toBeVisible();
|
|
await expect(page.locator('a[href="/status"]')).toBeVisible();
|
|
});
|
|
|
|
test("/maintenance provides maintenance guidance and status action", async ({ page }) => {
|
|
const response = await page.goto("/maintenance");
|
|
expect(response?.ok()).toBeTruthy();
|
|
|
|
await expect(page.getByRole("heading", { name: "Scheduled Maintenance" })).toBeVisible();
|
|
await expect(page.locator('a[href="/status"]')).toBeVisible();
|
|
await expect(page.locator('a[href="/dashboard/health"]')).toBeVisible();
|
|
});
|
|
|
|
test("/status shows monitoring shell and refresh control", async ({ page }) => {
|
|
const response = await page.goto("/status");
|
|
expect(response?.ok()).toBeTruthy();
|
|
|
|
await expect(page.getByRole("heading", { name: "System Status" })).toBeVisible();
|
|
await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
|
|
});
|
|
});
|