diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index bc9019f5dafd..55d7c4a0dbfe 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -100,8 +100,12 @@ export class C8CoverageProvider extends BaseCoverageProvider implements Coverage const sourceMapMeta: Record = {} const extensions = Array.isArray(this.options.extension) ? this.options.extension : [this.options.extension] + const fetchCache = this.ctx.projects.map(project => + Array.from(project.vitenode.fetchCache.entries()), + ).flat() + const entries = Array - .from(this.ctx.vitenode.fetchCache.entries()) + .from(fetchCache) .filter(entry => report._shouldInstrument(entry[0])) .map(([file, { result }]) => { if (!result.map) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd76f9e76446..40228d85cbf0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1798,6 +1798,12 @@ importers: test/workspaces: devDependencies: + '@types/istanbul-lib-coverage': + specifier: ^2.0.4 + version: 2.0.4 + istanbul-lib-coverage: + specifier: ^3.2.0 + version: 3.2.0 jsdom: specifier: latest version: 21.1.1 diff --git a/test/workspaces/coverage-report-tests/check-coverage.test.ts b/test/workspaces/coverage-report-tests/check-coverage.test.ts new file mode 100644 index 000000000000..2f089fbca30b --- /dev/null +++ b/test/workspaces/coverage-report-tests/check-coverage.test.ts @@ -0,0 +1,22 @@ +import { existsSync, readFileSync } from 'node:fs' +import { normalize } from 'node:path' +import { expect, test } from 'vitest' +import libCoverage from 'istanbul-lib-coverage' +import { resolve } from 'pathe' + +test('coverage exists', () => { + expect(existsSync('./coverage')).toBe(true) + expect(existsSync('./coverage/index.html')).toBe(true) +}) + +test('file coverage summary matches', () => { + const coverageJson = JSON.parse(readFileSync('./coverage/coverage-final.json', 'utf-8')) + const coverageMap = libCoverage.createCoverageMap(coverageJson) + const fileCoverage = coverageMap.fileCoverageFor(normalize(resolve('./src/math.ts'))) + + // There should be 1 uncovered branch and 1 uncovered function. See math.ts. + const { branches, functions } = fileCoverage.toSummary() + + expect(branches.total - branches.covered).toBe(1) + expect(functions.total - functions.covered).toBe(1) +}) diff --git a/test/workspaces/coverage-report-tests/vitest.config.ts b/test/workspaces/coverage-report-tests/vitest.config.ts new file mode 100644 index 000000000000..18bb8372ffc4 --- /dev/null +++ b/test/workspaces/coverage-report-tests/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + include: ['./check-coverage.test.ts'], + }, +}) diff --git a/test/workspaces/package.json b/test/workspaces/package.json index 0b411b9d6126..10bc7a91f8bf 100644 --- a/test/workspaces/package.json +++ b/test/workspaces/package.json @@ -3,10 +3,13 @@ "type": "module", "private": true, "scripts": { - "test": "vitest", - "coverage": "vitest run --coverage" + "test": "pnpm test:workspace && pnpm test:coverage", + "test:workspace": "vitest run", + "test:coverage": "vitest run --root coverage-report-tests" }, "devDependencies": { + "@types/istanbul-lib-coverage": "^2.0.4", + "istanbul-lib-coverage": "^3.2.0", "jsdom": "latest", "vitest": "workspace:*" } diff --git a/test/workspaces/src/math.ts b/test/workspaces/src/math.ts index 5d8550bb9d4d..f1e1874089f6 100644 --- a/test/workspaces/src/math.ts +++ b/test/workspaces/src/math.ts @@ -1,3 +1,14 @@ +/* eslint-disable unused-imports/no-unused-vars */ export function sum(a: number, b: number) { + if (a === 3 && b === 4) { + // This should be uncovered + return 7 + } + return a + b } + +function uncoveredFunction() { + // This should be uncovered + return 1 +} diff --git a/test/workspaces/vitest.config.ts b/test/workspaces/vitest.config.ts index 977555a2c478..a817e50b78f3 100644 --- a/test/workspaces/vitest.config.ts +++ b/test/workspaces/vitest.config.ts @@ -9,6 +9,7 @@ if (process.env.TEST_WATCH) { export default defineConfig({ test: { coverage: { + enabled: true, all: true, }, reporters: ['default', 'json'],