Skip to content

Commit 8509628

Browse files
authoredJan 16, 2023
fix(coverage): watch mode to use coverage.all only when all tests are run (#2665)
* fix(coverage): always print reporter name * fix(coverage): report on watch mode manually triggered re-runs * fix(coverage): watch mode to use `coverage.all` only when all tests are run
1 parent 2d90270 commit 8509628

File tree

4 files changed

+34
-13
lines changed

4 files changed

+34
-13
lines changed
 

‎packages/coverage-c8/src/provider.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { extname, resolve } from 'pathe'
66
import type { RawSourceMap } from 'vite-node'
77
import { configDefaults } from 'vitest/config'
88
// eslint-disable-next-line no-restricted-imports
9-
import type { CoverageC8Options, CoverageProvider, ResolvedCoverageOptions } from 'vitest'
9+
import type { CoverageC8Options, CoverageProvider, ReportContext, ResolvedCoverageOptions } from 'vitest'
1010
import type { Vitest } from 'vitest/node'
1111
// @ts-expect-error missing types
1212
import createReport from 'c8/lib/report.js'
@@ -44,9 +44,15 @@ export class C8CoverageProvider implements CoverageProvider {
4444
takeCoverage()
4545
}
4646

47-
async reportCoverage() {
47+
async reportCoverage({ allTestsRun }: ReportContext) {
4848
takeCoverage()
49-
const report = createReport(this.ctx.config.coverage)
49+
50+
const options = {
51+
...this.options,
52+
all: this.options.all && allTestsRun,
53+
}
54+
55+
const report = createReport(options)
5056

5157
interface MapAndSource { map: RawSourceMap; source: string | undefined }
5258
type SourceMapMeta = { url: string; filepath: string } & MapAndSource
@@ -136,7 +142,7 @@ export class C8CoverageProvider implements CoverageProvider {
136142
}
137143

138144
await report.run()
139-
await checkCoverages(this.options, report)
145+
await checkCoverages(options, report)
140146

141147
// Note that this will only clean up the V8 reports generated so far.
142148
// There will still be a temp directory with some reports when vitest exists,

‎packages/coverage-istanbul/src/provider.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { existsSync, promises as fs } from 'fs'
33
import { relative, resolve } from 'pathe'
44
import type { TransformPluginContext } from 'rollup'
5-
import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ResolvedCoverageOptions, Vitest } from 'vitest'
5+
import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest'
66
import { configDefaults, defaultExclude, defaultInclude } from 'vitest/config'
77
import libReport from 'istanbul-lib-report'
88
import reports from 'istanbul-reports'
@@ -98,14 +98,14 @@ export class IstanbulCoverageProvider implements CoverageProvider {
9898
this.coverages = []
9999
}
100100

101-
async reportCoverage() {
101+
async reportCoverage({ allTestsRun }: ReportContext) {
102102
const mergedCoverage: CoverageMap = this.coverages.reduce((coverage, previousCoverageMap) => {
103103
const map = libCoverage.createCoverageMap(coverage)
104104
map.merge(previousCoverageMap)
105105
return map
106106
}, {})
107107

108-
if (this.options.all)
108+
if (this.options.all && allTestsRun)
109109
await this.includeUntestedFiles(mergedCoverage)
110110

111111
includeImplicitElseBranches(mergedCoverage)

‎packages/vitest/src/node/core.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,7 @@ export class Vitest {
238238

239239
await this.runFiles(files)
240240

241-
if (this.coverageProvider) {
242-
this.logger.log(c.blue(' % ') + c.dim('Coverage report from ') + c.yellow(this.coverageProvider.name))
243-
await this.coverageProvider.reportCoverage()
244-
}
241+
await this.reportCoverage(true)
245242

246243
if (this.config.watch && !this.config.browser)
247244
await this.report('onWatcherStart')
@@ -357,8 +354,14 @@ export class Vitest {
357354
}
358355

359356
async rerunFiles(files: string[] = this.state.getFilepaths(), trigger?: string) {
357+
if (this.coverageProvider && this.config.coverage.cleanOnRerun)
358+
await this.coverageProvider.clean()
359+
360360
await this.report('onWatcherRerun', files, trigger)
361361
await this.runFiles(files)
362+
363+
await this.reportCoverage(!trigger)
364+
362365
if (!this.config.browser)
363366
await this.report('onWatcherStart')
364367
}
@@ -435,7 +438,7 @@ export class Vitest {
435438

436439
await this.runFiles(files)
437440

438-
await this.coverageProvider?.reportCoverage()
441+
await this.reportCoverage(false)
439442

440443
if (!this.config.browser)
441444
await this.report('onWatcherStart')
@@ -533,6 +536,13 @@ export class Vitest {
533536
return rerun
534537
}
535538

539+
private async reportCoverage(allTestsRun: boolean) {
540+
if (this.coverageProvider) {
541+
this.logger.log(c.blue(' % ') + c.dim('Coverage report from ') + c.yellow(this.coverageProvider.name))
542+
await this.coverageProvider.reportCoverage({ allTestsRun })
543+
}
544+
}
545+
536546
async close() {
537547
if (!this.closingPromise) {
538548
this.closingPromise = Promise.allSettled([

‎packages/vitest/src/types/coverage.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface CoverageProvider {
1313
onBeforeFilesRun?(): void | Promise<void>
1414
onAfterSuiteRun(meta: AfterSuiteRunMeta): void | Promise<void>
1515

16-
reportCoverage(): void | Promise<void>
16+
reportCoverage(reportContext: ReportContext): void | Promise<void>
1717

1818
onFileTransform?(
1919
sourceCode: string,
@@ -22,6 +22,11 @@ export interface CoverageProvider {
2222
): TransformResult | Promise<TransformResult>
2323
}
2424

25+
export interface ReportContext {
26+
/** Indicates whether all tests were run. False when only specific tests were run. */
27+
allTestsRun?: boolean
28+
}
29+
2530
export interface CoverageProviderModule {
2631
/**
2732
* Factory for creating a new coverage provider

0 commit comments

Comments
 (0)
Please sign in to comment.