Files
tech-log-frontend/tests/support/browser/strict-browser-test.ts
T

67 lines
2.0 KiB
TypeScript

import {
expect,
test as base,
type ConsoleMessage,
type Page,
} from "@playwright/test";
function ignoredConsole(message: ConsoleMessage) {
return (
message.type() === "warning" &&
message.text().includes("NO_COLOR")
);
}
export const test = base.extend({
page: async ({ page }, use) => {
const failures: string[] = [];
let mainDocumentStatus: number | null = null;
const onConsole = (message: ConsoleMessage) => {
if (
["error", "warning"].includes(message.type()) &&
!ignoredConsole(message)
) {
failures.push(`console:${message.type()}:${message.text()}`);
}
};
const onPageError = (error: Error) => {
failures.push(`pageerror:${error.name}`);
};
const onRequestFailed = (request: import("@playwright/test").Request) => {
failures.push(
`requestfailed:${request.method()}:${new URL(request.url()).pathname}:${request.failure()?.errorText ?? "unknown"}`,
);
};
const onResponse = (response: import("@playwright/test").Response) => {
if (
response.request().resourceType() === "document" &&
response.frame() === page.mainFrame()
) {
mainDocumentStatus = response.status();
}
};
page.on("console", onConsole);
page.on("pageerror", onPageError);
page.on("requestfailed", onRequestFailed);
page.on("response", onResponse);
await use(page);
page.off("console", onConsole);
page.off("pageerror", onPageError);
page.off("requestfailed", onRequestFailed);
page.off("response", onResponse);
const expectedDocumentNotFoundConsole =
"console:error:Failed to load resource: the server responded with a status of 404 (Not Found)";
expect(
failures.filter(
(failure) =>
failure !== expectedDocumentNotFoundConsole ||
mainDocumentStatus !== 404,
),
"unexpected browser console/page errors",
).toEqual([]);
},
});
export { expect };
export type { Page };