diff --git a/src/playwright/fixtures/test.ts b/src/playwright/fixtures/test.ts index e1711c1..2b1272e 100644 --- a/src/playwright/fixtures/test.ts +++ b/src/playwright/fixtures/test.ts @@ -3,12 +3,14 @@ import { test as base } from "@playwright/test"; import { LoginHelper, UIhelper } from "../helpers/index.js"; import { runOnce } from "../run-once.js"; import { $ } from "../../utils/bash.js"; +import fs from "node:fs"; import path from "path"; type RHDHDeploymentTestFixtures = { rhdh: RHDHDeployment; uiHelper: UIhelper; loginHelper: LoginHelper; + coverageCollector: void; }; type RHDHDeploymentWorkerFixtures = { @@ -61,6 +63,36 @@ const baseTest = base.extend< }, { scope: "test" }, ] as const, + coverageCollector: [ + async ({ page }, use, testInfo) => { + await use(); + if (process.env.E2E_COLLECT_COVERAGE !== "1") return; + try { + const coverage = await page.evaluate( + () => + ( + globalThis as unknown as { + // eslint-disable-next-line @typescript-eslint/naming-convention + __coverage__?: Record; + } + ).__coverage__, + ); + if (!coverage) return; + const dir = path.resolve( + process.cwd(), + process.env.COVERAGE_OUTPUT_DIR || "coverage/istanbul", + ); + fs.mkdirSync(dir, { recursive: true }); + fs.writeFileSync( + path.join(dir, `${testInfo.testId}-${Date.now()}.json`), + JSON.stringify(coverage), + ); + } catch { + // Best-effort: page may have crashed or been closed + } + }, + { auto: true, scope: "test" }, + ], }); export const test = Object.assign(baseTest, {