46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import fs from 'fs/promises';
|
|
import path from 'path';
|
|
import type { TestInfo } from '@playwright/test';
|
|
import { expect, test as base, Page } from '@bgotink/playwright-coverage';
|
|
|
|
const coverageDir = path.join(process.cwd(), 'coverage-reports', 'e2e', '.nyc_output');
|
|
|
|
async function writeCoverageFile(page: Page, testInfo: TestInfo) {
|
|
try {
|
|
const coverage = await page.evaluate(() => (globalThis as any).__coverage__ ?? null);
|
|
if (!coverage || Object.keys(coverage).length === 0) return;
|
|
|
|
await fs.mkdir(coverageDir, { recursive: true });
|
|
|
|
const titleParts =
|
|
typeof testInfo.titlePath === 'function'
|
|
? testInfo.titlePath()
|
|
: Array.isArray((testInfo as any).titlePath)
|
|
? (testInfo as any).titlePath
|
|
: [testInfo.title];
|
|
const safeTitle = titleParts
|
|
.filter(Boolean)
|
|
.map((part) => part.replace(/[^a-zA-Z0-9-_]+/g, '_'))
|
|
.join('--')
|
|
.slice(0, 200);
|
|
const worker = typeof testInfo.workerIndex === 'number' ? `w${testInfo.workerIndex}` : 'w';
|
|
const filename = path.join(coverageDir, `coverage-${worker}-${Date.now()}-${safeTitle || 'test'}.json`);
|
|
|
|
await fs.writeFile(filename, JSON.stringify(coverage));
|
|
console.log('Wrote coverage file:', path.relative(process.cwd(), filename));
|
|
} catch (error) {
|
|
const msg = error instanceof Error ? error.message : String(error);
|
|
console.warn('Failed to collect coverage from page:', msg);
|
|
}
|
|
}
|
|
|
|
export const test = base.extend({
|
|
page: async ({ page }, use, testInfo) => {
|
|
await use(page);
|
|
await writeCoverageFile(page, testInfo);
|
|
},
|
|
});
|
|
|
|
export { expect };
|
|
export type { Page };
|