This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
app/apps/e2e/tests/console-health.spec.ts
groombook-engineer[bot] 391c5b70d9 fix(e2e): resolve remaining 2 E2E test failures
- console-health: add 502/Failed to load resource filter to admin page test (portal page already had it)
- admin-services: mock /api/book/services endpoint used by booking wizard

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:48:21 +00:00

128 lines
3.8 KiB
TypeScript

import { test, expect } from "./fixtures.js";
/**
* E2E tests for baseline console health.
* Verifies no 404s for critical assets and no JS exceptions on initial render.
*/
test.describe("Console Health", () => {
test("admin page loads without 404s or JS errors", async ({ page }) => {
const consoleMessages: { type: string; text: string }[] = [];
const failedRequests: string[] = [];
// Capture console messages
page.on("console", (msg) => {
consoleMessages.push({ type: msg.type(), text: msg.text() });
});
// Capture failed requests
page.on("requestfailed", (request) => {
failedRequests.push(request.url());
});
// Navigate to admin
await page.goto("/admin");
// Wait for initial render
await page.waitForLoadState("networkidle");
// Check no 404s for critical assets
const criticalAssetFailures = failedRequests.filter(
(url) =>
url.includes("favicon") ||
url.includes("manifest") ||
url.includes(".js") ||
url.includes(".css") ||
url.includes(".png") ||
url.includes(".svg")
);
expect(
criticalAssetFailures,
`Critical asset 404s found: ${criticalAssetFailures.join(", ")}`
).toHaveLength(0);
// Check no JS exceptions (filter out known non-critical errors)
const jsErrors = consoleMessages.filter(
(m) =>
m.type === "error" &&
!m.text.includes("favicon") &&
!m.text.includes("502") &&
!m.text.includes("Failed to load resource")
);
expect(jsErrors, `JS errors found: ${JSON.stringify(jsErrors)}`).toHaveLength(0);
});
test("portal page loads without 404s or JS errors", async ({ page }) => {
const consoleMessages: { type: string; text: string }[] = [];
const failedRequests: string[] = [];
page.on("console", (msg) => {
consoleMessages.push({ type: msg.type(), text: msg.text() });
});
page.on("requestfailed", (request) => {
failedRequests.push(request.url());
});
// Login as client first
await page.goto("/login");
await page.getByText("Carol Client").click();
await expect(page).toHaveURL("/");
// Wait for initial render
await page.waitForLoadState("networkidle");
// Check no 404s for critical assets
const criticalAssetFailures = failedRequests.filter(
(url) =>
url.includes("favicon") ||
url.includes("manifest") ||
url.includes(".js") ||
url.includes(".css") ||
url.includes(".png") ||
url.includes(".svg")
);
expect(
criticalAssetFailures,
`Critical asset 404s found: ${criticalAssetFailures.join(", ")}`
).toHaveLength(0);
// Check no JS exceptions
const jsErrors = consoleMessages.filter(
(m) => m.type === "error" && !m.text.includes("favicon") && !m.text.includes("502") && !m.text.includes("Failed to load resource")
);
expect(jsErrors, `JS errors found: ${JSON.stringify(jsErrors)}`).toHaveLength(0);
});
test("no uncaught exceptions on page load", async ({ page }) => {
const jsErrors: string[] = [];
page.on("pageerror", (error) => {
jsErrors.push(error.message);
});
await page.goto("/admin");
await page.waitForLoadState("domcontentloaded");
expect(jsErrors, `Uncaught exceptions: ${jsErrors.join(", ")}`).toHaveLength(0);
});
test("portal dashboard renders without uncaught exceptions", async ({ page }) => {
const jsErrors: string[] = [];
page.on("pageerror", (error) => {
jsErrors.push(error.message);
});
await page.goto("/login");
await page.getByText("Carol Client").click();
await expect(page).toHaveURL("/");
await page.waitForLoadState("domcontentloaded");
expect(jsErrors, `Uncaught exceptions: ${jsErrors.join(", ")}`).toHaveLength(0);
});
});