From 80265b40937b8aec78a7748907027cc30f3d1b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Mon, 22 Apr 2024 10:13:26 +0300 Subject: [PATCH] fix(coverage): `thresholds` to compare files relative to root (#5574) --- packages/coverage-istanbul/src/provider.ts | 1 + packages/coverage-v8/src/provider.ts | 1 + packages/vitest/src/utils/coverage.ts | 5 ++-- .../option-tests/thresholds.test.ts | 6 ++++ test/coverage-test/testing-options.mjs | 29 ++++++++++++++++++- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 test/coverage-test/option-tests/thresholds.test.ts diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 819f99232d7a..540cb25fd92e 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -225,6 +225,7 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co coverageMap, thresholds: this.options.thresholds, createCoverageMap: () => libCoverage.createCoverageMap({}), + root: this.ctx.config.root, }) this.checkThresholds({ diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index 856f68068982..1c2c7d2543a8 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -216,6 +216,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage coverageMap, thresholds: this.options.thresholds, createCoverageMap: () => libCoverage.createCoverageMap({}), + root: this.ctx.config.root, }) this.checkThresholds({ diff --git a/packages/vitest/src/utils/coverage.ts b/packages/vitest/src/utils/coverage.ts index 846783f52b3a..1983d9dfab77 100644 --- a/packages/vitest/src/utils/coverage.ts +++ b/packages/vitest/src/utils/coverage.ts @@ -125,10 +125,11 @@ export class BaseCoverageProvider { * where each threshold set holds their own coverage maps. Threshold set is either * for specific files defined by glob pattern or global for all other files. */ - resolveThresholds({ coverageMap, thresholds, createCoverageMap }: { + resolveThresholds({ coverageMap, thresholds, createCoverageMap, root }: { coverageMap: CoverageMap thresholds: NonNullable createCoverageMap: () => CoverageMap + root: string }): ResolvedThreshold[] { const resolvedThresholds: ResolvedThreshold[] = [] const files = coverageMap.files() @@ -143,7 +144,7 @@ export class BaseCoverageProvider { const globThresholds = resolveGlobThresholds(thresholds[glob]) const globCoverageMap = createCoverageMap() - const matchingFiles = files.filter(file => mm.isMatch(file, glob)) + const matchingFiles = files.filter(file => mm.isMatch(relative(root, file), glob)) filesMatchedByGlobs.push(...matchingFiles) for (const file of matchingFiles) { diff --git a/test/coverage-test/option-tests/thresholds.test.ts b/test/coverage-test/option-tests/thresholds.test.ts new file mode 100644 index 000000000000..8785c8d928f8 --- /dev/null +++ b/test/coverage-test/option-tests/thresholds.test.ts @@ -0,0 +1,6 @@ +import { test } from 'vitest' +import { add } from '../src/utils' + +test('cover some lines, but not too much', () => { + add(1, 2) +}) diff --git a/test/coverage-test/testing-options.mjs b/test/coverage-test/testing-options.mjs index 7967097703cd..269995e8f408 100644 --- a/test/coverage-test/testing-options.mjs +++ b/test/coverage-test/testing-options.mjs @@ -106,6 +106,31 @@ const testCases = [ include: ['coverage-report-tests/empty-lines.test.ts'], }, }, + { + testConfig: { + name: 'failing thresholds', + include: ['option-tests/thresholds.test.ts'], + coverage: { + reporter: 'text', + all: false, + include: ['src/utils.ts'], + thresholds: { + 'src/utils.ts': { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + }, + }, + after() { + if (process.exitCode !== 1) + throw new Error('Expected test to fail as thresholds are not met') + + process.exitCode = 0 + }, + }, ] for (const provider of ['v8', 'istanbul']) { @@ -149,6 +174,8 @@ for (const provider of ['v8', 'istanbul']) { } function checkExit() { - if (process.exitCode) + if (process.exitCode) { + console.error(`Exit code was set to ${process.exitCode}. Failing tests`) process.exit(process.exitCode) + } }