Files
homelab/tests/e2e/tests/reachability.spec.ts
T

34 lines
1.4 KiB
TypeScript

import { test, expect } from '@playwright/test';
import { TARGETS, url } from '../targets';
// Core assertion the user asked for: once ingress-nginx is up and the app is
// ready, NAME-APP.<domain> must be VIEWABLE in Safari's engine — not just return
// a status code. We navigate, assert a real 2xx/3xx (not nginx 404/503 default
// backend), and assert the app's own UI actually rendered.
// Only apps without a dedicated flow spec (auth logins live in their own file).
const smokeTargets = TARGETS.filter((t) => !t.dedicated);
for (const t of smokeTargets) {
test(`${t.name} is viewable at ${url(t)}`, async ({ page }) => {
const resp = await page.goto(url(t), { waitUntil: 'domcontentloaded' });
expect(resp, 'no response from ingress').toBeTruthy();
const status = resp!.status();
expect(status, `unexpected HTTP status ${status}`).toBeLessThan(400);
// Not the nginx default backend / error page.
await expect(page.locator('body')).not.toContainText(/default backend - 404|503 Service Temporarily/i);
// App's own UI rendered.
const r = t.ready;
if (r.selector) {
await expect(page.locator(r.selector).first()).toBeVisible();
} else if (r.role && r.name) {
await expect(page.getByRole(r.role as any, { name: r.name }).first()).toBeVisible();
} else if (r.text) {
await expect(page.getByText(r.text).first()).toBeVisible();
}
});
}