From c469c74d764fbfd4df4b77c8cadd1b36914e6001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Fri, 17 May 2024 14:45:02 +0300 Subject: [PATCH] fix(coverage): clean up empty coverage reports directory (#5731) --- packages/coverage-istanbul/src/provider.ts | 6 +++++- packages/coverage-v8/src/provider.ts | 6 +++++- .../option-tests/fixture.test.ts | 8 +++++++ test/coverage-test/testing-options.mjs | 21 ++++++++++++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/coverage-test/option-tests/fixture.test.ts diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 540cb25fd..28cfd7a39 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -1,4 +1,4 @@ -import { existsSync, promises as fs, writeFileSync } from 'node:fs' +import { existsSync, promises as fs, readdirSync, writeFileSync } from 'node:fs' import { resolve } from 'pathe' import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest' import { coverageConfigDefaults, defaultExclude, defaultInclude } from 'vitest/config' @@ -255,6 +255,10 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co if (!keepResults) { this.coverageFiles = new Map() await fs.rm(this.coverageFilesDirectory, { recursive: true }) + + // Remove empty reports directory, e.g. when only text-reporter is used + if (readdirSync(this.options.reportsDirectory).length === 0) + await fs.rm(this.options.reportsDirectory, { recursive: true }) } } diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index 3c48be396..cf4a342df 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -1,4 +1,4 @@ -import { existsSync, promises as fs, writeFileSync } from 'node:fs' +import { existsSync, promises as fs, readdirSync, writeFileSync } from 'node:fs' import type { Profiler } from 'node:inspector' import { fileURLToPath, pathToFileURL } from 'node:url' import v8ToIstanbul from 'v8-to-istanbul' @@ -246,6 +246,10 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage if (!keepResults) { this.coverageFiles = new Map() await fs.rm(this.coverageFilesDirectory, { recursive: true }) + + // Remove empty reports directory, e.g. when only text-reporter is used + if (readdirSync(this.options.reportsDirectory).length === 0) + await fs.rm(this.options.reportsDirectory, { recursive: true }) } } diff --git a/test/coverage-test/option-tests/fixture.test.ts b/test/coverage-test/option-tests/fixture.test.ts new file mode 100644 index 000000000..2121ecdf3 --- /dev/null +++ b/test/coverage-test/option-tests/fixture.test.ts @@ -0,0 +1,8 @@ +// Generic test fixture to generate some coverage + +import { test } from 'vitest' +import { add } from '../src/utils' + +test('cover some lines', () => { + add(1, 2) +}) diff --git a/test/coverage-test/testing-options.mjs b/test/coverage-test/testing-options.mjs index e806dd07d..690713f6d 100644 --- a/test/coverage-test/testing-options.mjs +++ b/test/coverage-test/testing-options.mjs @@ -1,4 +1,4 @@ -import { readFileSync, rmSync, writeFileSync } from 'node:fs' +import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs' import { startVitest } from 'vitest/node' /** @@ -147,6 +147,25 @@ const testCases = [ process.exitCode = 0 }, }, + { + testConfig: { + name: 'remove empty coverages directory', + include: ['option-tests/fixture.test.ts'], + coverage: { + reporter: 'text', + all: false, + include: ['src/utils.ts'], + }, + }, + after() { + if (existsSync('./coverage')) { + if (readdirSync('./coverage').length !== 0) + throw new Error('Test case expected coverage directory to be empty') + + throw new Error('Empty coverage directory was not cleaned') + } + }, + }, ] for (const provider of ['v8', 'istanbul']) { -- 2.51.2