diff --git a/e2e/package.json b/e2e/package.json index 4dc1ed4..7dd5b1a 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -3,10 +3,14 @@ "type": "module", "private": true, "scripts": { - "pretest": "pnpm --dir .. run build", + "pretest": "pnpm --dir .. run build:coverage", "test": "wdio run wdio.conf.ts" }, "devDependencies": { + "@types/istanbul-lib-coverage": "2.0.6", + "@types/istanbul-lib-report": "3.0.3", + "@types/istanbul-lib-source-maps": "4.0.4", + "@types/istanbul-reports": "3.0.4", "@wdio/cli": "9.20.0", "@wdio/globals": "9.17.0", "@wdio/local-runner": "9.20.0", @@ -14,6 +18,10 @@ "@wdio/spec-reporter": "9.20.0", "electron": "37.6.0", "expect-webdriverio": "5.4.3", + "istanbul-lib-coverage": "3.2.2", + "istanbul-lib-report": "3.0.1", + "istanbul-lib-source-maps": "5.0.6", + "istanbul-reports": "3.2.0", "obsidian": "1.10.0", "wdio-electron-service": "8.1.0", "webdriverio": "9.20.0" diff --git a/e2e/utils/coverage.ts b/e2e/utils/coverage.ts new file mode 100644 index 0000000..1bfe484 --- /dev/null +++ b/e2e/utils/coverage.ts @@ -0,0 +1,44 @@ +import type { CoverageMapData } from 'istanbul-lib-coverage' + +import * as fs from 'node:fs' +import * as path from 'node:path' + +import { createCoverageMap } from 'istanbul-lib-coverage' +import { createContext } from 'istanbul-lib-report' +import { createSourceMapStore } from 'istanbul-lib-source-maps' +import * as reports from 'istanbul-reports' + +export async function exportCoverageToLcov() { + const coverageMap = createCoverageMap(await collectCoverageData()) + const remappedCoverageMap = await createSourceMapStore().transformCoverage(coverageMap) + + const context = createContext({ + coverageMap: remappedCoverageMap, + dir: 'out/coverage', + sourceFinder: (filePath: string) => { + return fs.readFileSync(restorePathRelativeToMainPluginProject(filePath), 'utf-8') + }, + }) + reports.create('lcov').execute(context) +} + +const cwd = process.cwd() + +function restorePathRelativeToMainPluginProject(filePath: string) { + const relativePart = path.relative(cwd, filePath) + return path.join(path.resolve(cwd, '..'), relativePart) +} + +async function collectCoverageData() { + const coverageData = await browser.execute(() => { + return window.__coverage__ + }) + if (!coverageData) throw new Error('No coverage data found!') + return coverageData +} + +declare global { + interface Window { + __coverage__?: CoverageMapData + } +} diff --git a/e2e/wdio.conf.ts b/e2e/wdio.conf.ts index 64cd42e..b6d70e3 100644 --- a/e2e/wdio.conf.ts +++ b/e2e/wdio.conf.ts @@ -1,5 +1,6 @@ /// import ObsidianApp from './specs/pageobjects/obsidian-app.page' +import { exportCoverageToLcov } from './utils/coverage' const debug = process.env.DEBUG const ONE_DAY = 24 * 60 * 60 * 1000 @@ -40,4 +41,7 @@ export const config: WebdriverIO.Config = { await ObsidianApp.createAndOpenFreshVault() await ObsidianApp.activateTimecodesPlugin() }, + afterSuite: async () => { + await exportCoverageToLcov() + }, }