From 85096281aad680a0e108554738ac395ef8c80586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Mon, 16 Jan 2023 14:26:41 +0200 Subject: [PATCH] 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 --- packages/coverage-c8/src/provider.ts | 14 ++++++++++---- packages/coverage-istanbul/src/provider.ts | 6 +++--- packages/vitest/src/node/core.ts | 20 +++++++++++++++----- packages/vitest/src/types/coverage.ts | 7 ++++++- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index 9797511a4435..ab6ea99516eb 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -6,7 +6,7 @@ import { extname, resolve } from 'pathe' import type { RawSourceMap } from 'vite-node' import { configDefaults } from 'vitest/config' // eslint-disable-next-line no-restricted-imports -import type { CoverageC8Options, CoverageProvider, ResolvedCoverageOptions } from 'vitest' +import type { CoverageC8Options, CoverageProvider, ReportContext, ResolvedCoverageOptions } from 'vitest' import type { Vitest } from 'vitest/node' // @ts-expect-error missing types import createReport from 'c8/lib/report.js' @@ -44,9 +44,15 @@ export class C8CoverageProvider implements CoverageProvider { takeCoverage() } - async reportCoverage() { + async reportCoverage({ allTestsRun }: ReportContext) { takeCoverage() - const report = createReport(this.ctx.config.coverage) + + const options = { + ...this.options, + all: this.options.all && allTestsRun, + } + + const report = createReport(options) interface MapAndSource { map: RawSourceMap; source: string | undefined } type SourceMapMeta = { url: string; filepath: string } & MapAndSource @@ -136,7 +142,7 @@ export class C8CoverageProvider implements CoverageProvider { } await report.run() - await checkCoverages(this.options, report) + await checkCoverages(options, report) // Note that this will only clean up the V8 reports generated so far. // There will still be a temp directory with some reports when vitest exists, diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 150527aa0e68..a208b45ec045 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -2,7 +2,7 @@ import { existsSync, promises as fs } from 'fs' import { relative, resolve } from 'pathe' import type { TransformPluginContext } from 'rollup' -import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ResolvedCoverageOptions, Vitest } from 'vitest' +import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest' import { configDefaults, defaultExclude, defaultInclude } from 'vitest/config' import libReport from 'istanbul-lib-report' import reports from 'istanbul-reports' @@ -98,14 +98,14 @@ export class IstanbulCoverageProvider implements CoverageProvider { this.coverages = [] } - async reportCoverage() { + async reportCoverage({ allTestsRun }: ReportContext) { const mergedCoverage: CoverageMap = this.coverages.reduce((coverage, previousCoverageMap) => { const map = libCoverage.createCoverageMap(coverage) map.merge(previousCoverageMap) return map }, {}) - if (this.options.all) + if (this.options.all && allTestsRun) await this.includeUntestedFiles(mergedCoverage) includeImplicitElseBranches(mergedCoverage) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index eeff77a45e11..26597bebf19d 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -238,10 +238,7 @@ export class Vitest { await this.runFiles(files) - if (this.coverageProvider) { - this.logger.log(c.blue(' % ') + c.dim('Coverage report from ') + c.yellow(this.coverageProvider.name)) - await this.coverageProvider.reportCoverage() - } + await this.reportCoverage(true) if (this.config.watch && !this.config.browser) await this.report('onWatcherStart') @@ -357,8 +354,14 @@ export class Vitest { } async rerunFiles(files: string[] = this.state.getFilepaths(), trigger?: string) { + if (this.coverageProvider && this.config.coverage.cleanOnRerun) + await this.coverageProvider.clean() + await this.report('onWatcherRerun', files, trigger) await this.runFiles(files) + + await this.reportCoverage(!trigger) + if (!this.config.browser) await this.report('onWatcherStart') } @@ -435,7 +438,7 @@ export class Vitest { await this.runFiles(files) - await this.coverageProvider?.reportCoverage() + await this.reportCoverage(false) if (!this.config.browser) await this.report('onWatcherStart') @@ -533,6 +536,13 @@ export class Vitest { return rerun } + private async reportCoverage(allTestsRun: boolean) { + if (this.coverageProvider) { + this.logger.log(c.blue(' % ') + c.dim('Coverage report from ') + c.yellow(this.coverageProvider.name)) + await this.coverageProvider.reportCoverage({ allTestsRun }) + } + } + async close() { if (!this.closingPromise) { this.closingPromise = Promise.allSettled([ diff --git a/packages/vitest/src/types/coverage.ts b/packages/vitest/src/types/coverage.ts index 7dd202b6dca5..2602ca0680e7 100644 --- a/packages/vitest/src/types/coverage.ts +++ b/packages/vitest/src/types/coverage.ts @@ -13,7 +13,7 @@ export interface CoverageProvider { onBeforeFilesRun?(): void | Promise onAfterSuiteRun(meta: AfterSuiteRunMeta): void | Promise - reportCoverage(): void | Promise + reportCoverage(reportContext: ReportContext): void | Promise onFileTransform?( sourceCode: string, @@ -22,6 +22,11 @@ export interface CoverageProvider { ): TransformResult | Promise } +export interface ReportContext { + /** Indicates whether all tests were run. False when only specific tests were run. */ + allTestsRun?: boolean +} + export interface CoverageProviderModule { /** * Factory for creating a new coverage provider