diff --git a/packages/ui/node/reporter.ts b/packages/ui/node/reporter.ts index 7c5a03483912..ba5f19173c4d 100644 --- a/packages/ui/node/reporter.ts +++ b/packages/ui/node/reporter.ts @@ -159,6 +159,12 @@ export default class HTMLReporter implements Reporter { if (this.ctx.config.coverage.enabled && this.ctx.config.coverage.htmlDir) { const coverageHtmlDir = this.ctx.config.coverage.htmlDir const destCoverageDir = resolve(this.reporterDir, 'coverage') + if (coverageHtmlDir === destCoverageDir) { + // skip and preserve already generated coverage report. + // this can happen when users configures `outputFile` + // next to `coverage.reportsDirectory`. + return + } await fs.rm(destCoverageDir, { recursive: true, force: true }) await fs.mkdir(destCoverageDir, { recursive: true }) await fs.cp(coverageHtmlDir, destCoverageDir, { recursive: true }) diff --git a/test/cli/test/reporters/html.test.ts b/test/cli/test/reporters/html.test.ts index 39df19047709..13a60bb3b2d9 100644 --- a/test/cli/test/reporters/html.test.ts +++ b/test/cli/test/reporters/html.test.ts @@ -118,6 +118,7 @@ test('basic', () => {}); ], }, }) + expect(result.stderr).toMatchInlineSnapshot(`""`) expect(result.errorTree()).toMatchInlineSnapshot(` { "basic.test.ts": { @@ -127,3 +128,45 @@ test('basic', () => {}); `) expect(result.fs.statFile('html/index.html').isFile()).toBe(true) }) + +it('html and coverage already next each other', async () => { + const result = await runInlineTests({ + 'basic.ts': ` +export const add = (a: number, b: number) => a + b; +`, + 'basic.test.ts': ` +import { test, expect } from "vitest"; +import { add } from "./basic"; +test('add', () => { + expect(add(1, 2)).toBe(3); +}); +`, + }, { + reporters: [ + 'default', + ['html', { outputFile: './custom-dir/index.html' }], + ], + coverage: { + enabled: true, + reporter: ['html'], + reportsDirectory: './custom-dir/coverage', + }, + }) + expect(result.stderr).toMatchInlineSnapshot(`""`) + expect(result.errorTree()).toMatchInlineSnapshot(` + { + "basic.test.ts": { + "add": "passed", + }, + } + `) + expect({ + html: result.fs.statFile('custom-dir/index.html').isFile(), + coverage: result.fs.statFile('custom-dir/coverage/index.html').isFile(), + }).toMatchInlineSnapshot(` + { + "coverage": true, + "html": true, + } + `) +})