diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index adbe56484110..23f2c65a6bb2 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -58,7 +58,7 @@ export class C8CoverageProvider implements CoverageProvider { if (!map) return - const url = _url.pathToFileURL(file).href + const url = _url.pathToFileURL(file.split('?')[0]).href let code: string | undefined try { @@ -86,7 +86,7 @@ export class C8CoverageProvider implements CoverageProvider { const offset = 224 report._getSourceMap = (coverage: Profiler.ScriptCoverage) => { - const path = _url.pathToFileURL(coverage.url).href + const path = _url.pathToFileURL(coverage.url.split('?')[0]).href const data = sourceMapMeta[path] if (!data) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 119bfd2a9c59..b46db0d45f61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -951,6 +951,7 @@ importers: specifiers: '@vitejs/plugin-vue': latest '@vue/test-utils': latest + execa: ^6.1.0 happy-dom: latest vite: ^3.2.0 vitest: workspace:* @@ -958,6 +959,7 @@ importers: devDependencies: '@vitejs/plugin-vue': 3.2.0_vite@3.2.1+vue@3.2.41 '@vue/test-utils': 2.2.1_vue@3.2.41 + execa: 6.1.0 happy-dom: 7.6.6 vite: 3.2.1 vitest: link:../../packages/vitest diff --git a/test/coverage-test/coverage-test/c8/coverage-report/SFC.test.ts b/test/coverage-test/coverage-test/c8/coverage-report/SFC.test.ts new file mode 100644 index 000000000000..171ce2e7427f --- /dev/null +++ b/test/coverage-test/coverage-test/c8/coverage-report/SFC.test.ts @@ -0,0 +1,14 @@ +/** + * @vitest-environment happy-dom + */ + +import { mount } from '@vue/test-utils' +import { expect, test } from 'vitest' +import SFC from '../../../src/coverage-report/SFC.vue' + +test('Should update count', async () => { + const wrapper = mount(SFC) + + await wrapper.find('button').trigger('click') + expect(wrapper.text()).contain(1) +}) diff --git a/test/coverage-test/coverage-test/c8/coverage-report/math.test.ts b/test/coverage-test/coverage-test/c8/coverage-report/math.test.ts new file mode 100644 index 000000000000..0f669a2482a4 --- /dev/null +++ b/test/coverage-test/coverage-test/c8/coverage-report/math.test.ts @@ -0,0 +1,10 @@ +import { expect, test } from 'vitest' +import { add, multiply } from '../../../src/coverage-report/math' + +test('add', () => { + expect(add(10, 15)).toBe(25) +}) + +test('multiply', () => { + expect(multiply(2, 5)).toBe(10) +}) diff --git a/test/coverage-test/coverage-test/c8/coverage-report/not-SFC/not-SFC.test.ts b/test/coverage-test/coverage-test/c8/coverage-report/not-SFC/not-SFC.test.ts new file mode 100644 index 000000000000..3200a9b94cd4 --- /dev/null +++ b/test/coverage-test/coverage-test/c8/coverage-report/not-SFC/not-SFC.test.ts @@ -0,0 +1,14 @@ +/** + * @vitest-environment happy-dom + */ + +import { mount } from '@vue/test-utils' +import { expect, test } from 'vitest' +import notSFC from '../../../../src/coverage-report/not-SFC/not-SFC.vue' + +test('Should update count', async () => { + const wrapper = mount(notSFC) + + await wrapper.find('button').trigger('click') + expect(wrapper.text()).contain(1) +}) diff --git a/test/coverage-test/coverage-test/c8/coverage-report/utils.test.js b/test/coverage-test/coverage-test/c8/coverage-report/utils.test.js new file mode 100644 index 000000000000..8a1d0708c1c1 --- /dev/null +++ b/test/coverage-test/coverage-test/c8/coverage-report/utils.test.js @@ -0,0 +1,6 @@ +import { expect, test } from 'vitest' +import { add } from '../../../src/coverage-report/utils.js' + +test('add', () => { + expect(add(10, 15)).toBe(25) +}) diff --git a/test/coverage-test/coverage-test/coverage.c8.test.ts b/test/coverage-test/coverage-test/coverage.c8.test.ts index 75b544526efb..6f57a6ec8de9 100644 --- a/test/coverage-test/coverage-test/coverage.c8.test.ts +++ b/test/coverage-test/coverage-test/coverage.c8.test.ts @@ -1,7 +1,24 @@ import fs from 'fs' +import { execa } from 'execa' import { resolve } from 'pathe' import { expect, test } from 'vitest' +async function run(...runOptions: string[]): Promise { + const root = resolve(__dirname, '..') + + const { stdout } = await execa('npx', ['vitest', 'run', ...runOptions], { + cwd: root, + env: { + ...process.env, + CI: 'true', + NO_COLOR: 'true', + }, + windowsHide: false, + }) + + return stdout +} + test('coverage c8', async () => { const coveragePath = resolve('./coverage/tmp/') const stat = fs.statSync(coveragePath) @@ -9,3 +26,17 @@ test('coverage c8', async () => { const files = fs.readdirSync(coveragePath) expect(files.length > 0).toBe(true) }) + +test('Should show coverage', async () => { + const stdout = await run('--config', 'vitest.config-c8-internal-coverage.ts', '--coverage') + + // For Vue SFC and vue + ts files + expect(stdout).toContain('not-SFC.ts') + expect(stdout).not.toContain('not-SFC.ts?vue') + expect(stdout).toContain('not-SFC.vue') + expect(stdout).toContain('SFC.vue') + + // For ts and js files + expect(stdout).toContain('math.ts') + expect(stdout).toContain('utils.js') +}, 30000) diff --git a/test/coverage-test/package.json b/test/coverage-test/package.json index 5c5e123f7435..dd14ee429d4f 100644 --- a/test/coverage-test/package.json +++ b/test/coverage-test/package.json @@ -19,6 +19,7 @@ "devDependencies": { "@vitejs/plugin-vue": "latest", "@vue/test-utils": "latest", + "execa": "^6.1.0", "happy-dom": "latest", "vite": "latest", "vitest": "workspace:*", diff --git a/test/coverage-test/src/coverage-report/SFC.vue b/test/coverage-test/src/coverage-report/SFC.vue new file mode 100644 index 000000000000..1d581cbe1688 --- /dev/null +++ b/test/coverage-test/src/coverage-report/SFC.vue @@ -0,0 +1,17 @@ + + + diff --git a/test/coverage-test/src/coverage-report/math.ts b/test/coverage-test/src/coverage-report/math.ts new file mode 100644 index 000000000000..1beddcd2a518 --- /dev/null +++ b/test/coverage-test/src/coverage-report/math.ts @@ -0,0 +1,15 @@ +export function add(a: number, b: number) { + return a + b +} + +export function multiply(a: number, b: number) { + return a * b +} + +export function untestedFn(a: number, b: number) { + return a * b +} + +export function untestedFn2(a: number, b: number) { + return a * b +} diff --git a/test/coverage-test/src/coverage-report/not-SFC/not-SFC.ts b/test/coverage-test/src/coverage-report/not-SFC/not-SFC.ts new file mode 100644 index 000000000000..1d11461f9755 --- /dev/null +++ b/test/coverage-test/src/coverage-report/not-SFC/not-SFC.ts @@ -0,0 +1,9 @@ +import { defineComponent, ref } from 'vue' + +export default defineComponent({ + setup() { + const count = ref(0) + + return { count } + }, +}) diff --git a/test/coverage-test/src/coverage-report/not-SFC/not-SFC.vue b/test/coverage-test/src/coverage-report/not-SFC/not-SFC.vue new file mode 100644 index 000000000000..27f56af34a91 --- /dev/null +++ b/test/coverage-test/src/coverage-report/not-SFC/not-SFC.vue @@ -0,0 +1,7 @@ + + + diff --git a/test/coverage-test/src/coverage-report/utils.js b/test/coverage-test/src/coverage-report/utils.js new file mode 100644 index 000000000000..06047664e378 --- /dev/null +++ b/test/coverage-test/src/coverage-report/utils.js @@ -0,0 +1,3 @@ +export function add(a, b) { + return a + b +} diff --git a/test/coverage-test/vitest.config-c8-coverage.ts b/test/coverage-test/vitest.config-c8-coverage.ts index 0e9e69239b76..ba221684a1af 100644 --- a/test/coverage-test/vitest.config-c8-coverage.ts +++ b/test/coverage-test/vitest.config-c8-coverage.ts @@ -1,9 +1,16 @@ import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' export default defineConfig({ + plugins: [vue()], test: { include: [ './coverage-test/*.c8.test.ts', ], + coverage: { + reporter: ['html', 'text', 'lcov'], + include: ['src/**'], + extension: ['.ts', '.vue', '.js'], + }, }, }) diff --git a/test/coverage-test/vitest.config-c8-internal-coverage.ts b/test/coverage-test/vitest.config-c8-internal-coverage.ts new file mode 100644 index 000000000000..a4d28b78e4e7 --- /dev/null +++ b/test/coverage-test/vitest.config-c8-internal-coverage.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], + test: { + include: [ + './coverage-test/c8/**/*test.{ts,js}', + ], + coverage: { + reporter: ['html', 'text', 'lcov'], + include: ['src/**'], + extension: ['.ts', '.vue', '.js'], + }, + }, +}) diff --git a/test/coverage-test/vitest.config.ts b/test/coverage-test/vitest.config.ts index 0570d7959b7b..036738b8691c 100644 --- a/test/coverage-test/vitest.config.ts +++ b/test/coverage-test/vitest.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ 'test/*.test.ts', ], exclude: [ - 'coverage-test/*.test.ts', + 'coverage-test/**/*', ], coverage: { enabled: true,