import { expect, test as base, type Request, type Response, } from '@playwright/test' type AutomaticFixtures = { enforceApiHealth: void } export const test = base.extend({ enforceApiHealth: [async ({ page }, use) => { const failures: string[] = [] const recordFailedRequest = (request: Request) => { if (isApiUrl(request.url())) { failures.push(`${request.method()} ${request.url()} failed: ${request.failure()?.errorText ?? 'unknown error'}`) } } const recordServerError = (response: Response) => { if (isApiUrl(response.url()) && response.status() >= 500) { failures.push(`${response.request().method()} ${response.url()} returned ${response.status()}`) } } page.on('requestfailed', recordFailedRequest) page.on('response', recordServerError) await use() page.off('requestfailed', recordFailedRequest) page.off('response', recordServerError) expect(failures, `Unexpected API failures:\n${failures.join('\n')}`).toEqual([]) }, { auto: true }], }) export { expect } function isApiUrl(value: string) { const pathname = new URL(value).pathname return pathname.startsWith('/api/') || pathname.startsWith('/sanctum/') }