Skip to content

Commit

Permalink
fix(coverage): clean up empty coverage reports directory (#5731)
Browse files Browse the repository at this point in the history
  • Loading branch information
AriPerkkio committed May 17, 2024
1 parent a20e75b commit c469c74
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
6 changes: 5 additions & 1 deletion packages/coverage-istanbul/src/provider.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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 })
}
}

Expand Down
6 changes: 5 additions & 1 deletion packages/coverage-v8/src/provider.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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 })
}
}

Expand Down
8 changes: 8 additions & 0 deletions test/coverage-test/option-tests/fixture.test.ts
Original file line number Diff line number Diff line change
@@ -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)
})
21 changes: 20 additions & 1 deletion test/coverage-test/testing-options.mjs
Original file line number Diff line number Diff line change
@@ -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'

/**
Expand Down Expand Up @@ -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']) {
Expand Down

0 comments on commit c469c74

Please sign in to comment.