Skip to content

Commit

Permalink
test(coverage): custom provider tests for vitest-dev#2797
Browse files Browse the repository at this point in the history
  • Loading branch information
AriPerkkio committed Feb 5, 2023
1 parent edf1dd4 commit 461e96f
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Vitest Snapshot v1

exports[`custom json report 1`] = `
{
"calls": [
"initialize with context",
"clean with force",
"onBeforeFilesRun",
"onAfterSuiteRun with {}",
"onAfterSuiteRun with {}",
"onAfterSuiteRun with {}",
"reportCoverage with {\\"allTestsRun\\":true}",
],
"transformedFiles": [
"<process-cwd>/src/Counter/Counter.component.ts",
"<process-cwd>/src/Counter/Counter.component.ts?vue&type=script&src=true&lang.ts",
"<process-cwd>/src/Counter/Counter.vue",
"<process-cwd>/src/Counter/index.ts",
"<process-cwd>/src/Defined.vue",
"<process-cwd>/src/Defined.vue?vue&type=style&index=0&scoped=fdf5cd5f&lang.css",
"<process-cwd>/src/Hello.vue",
"<process-cwd>/src/another-setup.ts",
"<process-cwd>/src/implicitElse.ts",
"<process-cwd>/src/importEnv.ts",
"<process-cwd>/src/index.mts",
"<process-cwd>/src/utils.ts",
],
}
`;
12 changes: 12 additions & 0 deletions test/coverage-test/coverage-report-tests/custom.report.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* Custom coverage provider specific test cases
*/

import { readFileSync } from 'fs'
import { expect, test } from 'vitest'

test('custom json report', async () => {
const report = readFileSync('./coverage/custom-coverage-provider-report.json', 'utf-8')

expect(JSON.parse(report)).toMatchSnapshot()
})
6 changes: 3 additions & 3 deletions test/coverage-test/coverage-report-tests/utils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { readFileSync } from 'fs'
import { normalize } from 'pathe'

interface CoverageFinalJson {
Expand All @@ -17,8 +18,7 @@ interface CoverageFinalJson {
* Normalizes paths to keep contents consistent between OS's
*/
export async function readCoverageJson() {
// @ts-expect-error -- generated file
const { default: jsonReport } = await import('./coverage/coverage-final.json') as CoverageFinalJson
const jsonReport = JSON.parse(readFileSync('./coverage/coverage-final.json', 'utf8')) as CoverageFinalJson

const normalizedReport: CoverageFinalJson['default'] = {}

Expand All @@ -30,6 +30,6 @@ export async function readCoverageJson() {
return normalizedReport
}

function normalizeFilename(filename: string) {
export function normalizeFilename(filename: string) {
return normalize(filename).replace(normalize(process.cwd()), '<process-cwd>')
}
75 changes: 75 additions & 0 deletions test/coverage-test/custom-coverage-provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs'
import type { AfterSuiteRunMeta, CoverageProvider, CoverageProviderModule, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest'
import { coverageConfigDefaults } from 'vitest/config'
import { normalizeFilename } from './coverage-report-tests/utils'

/**
* Provider that simply keeps track of the function that were called
*/
class CustomCoverageProvider implements CoverageProvider {
name = 'custom-coverage-provider'

calls: string[] = []
transformedFiles: string[] = []

initialize(ctx: Vitest) {
this.calls.push(`initialize ${ctx ? 'with' : 'without'} context`)
}

clean(force: boolean) {
this.calls.push(`clean ${force ? 'with' : 'without'} force`)
}

onBeforeFilesRun() {
this.calls.push('onBeforeFilesRun')
}

onAfterSuiteRun(meta: AfterSuiteRunMeta) {
this.calls.push(`onAfterSuiteRun with ${JSON.stringify(meta)}`)
}

reportCoverage(reportContext?: ReportContext) {
this.calls.push(`reportCoverage with ${JSON.stringify(reportContext)}`)

const jsonReport = JSON.stringify({
calls: this.calls,
transformedFiles: this.transformedFiles.sort(),
}, null, 2)

if (existsSync('./coverage'))
rmSync('./coverage', { maxRetries: 10, recursive: true })

mkdirSync('./coverage')
writeFileSync('./coverage/custom-coverage-provider-report.json', jsonReport, 'utf-8')
}

onFileTransform(code: string, id: string) {
const filename = normalizeFilename(id)

if (/\/src\//.test(filename))
this.transformedFiles.push(filename)

return { code }
}

resolveOptions(): ResolvedCoverageOptions {
return {
...coverageConfigDefaults,
enabled: true,

// TODO: Fix. This does not pass to workers
provider: new CustomCoverageProviderModule(),

}
}
}

export default class CustomCoverageProviderModule implements CoverageProviderModule {
getProvider(): CoverageProvider {
return new CustomCoverageProvider()
}

takeCoverage() {
return { customCoverage: 'Custom coverage report from CustomCoverageProviderModule' }
}
}
3 changes: 2 additions & 1 deletion test/coverage-test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
"name": "@vitest/test-coverage",
"private": true,
"scripts": {
"test": "pnpm test:c8 && pnpm test:istanbul && pnpm test:types",
"test": "pnpm test:c8 && pnpm test:istanbul && pnpm test:custom && pnpm test:types",
"test:c8": "node ./testing.mjs --provider c8",
"test:custom": "node ./testing.mjs --provider custom",
"test:istanbul": "node ./testing.mjs --provider istanbul",
"test:types": "vitest typecheck --run"
},
Expand Down
6 changes: 3 additions & 3 deletions test/coverage-test/testing.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ const configs = [
// Run tests for checking coverage report contents.
['coverage-report-tests', {
include: [
'./coverage-report-tests/generic.report.test.ts',
['c8', 'istanbul'].includes(provider) && './coverage-report-tests/generic.report.test.ts',
`./coverage-report-tests/${provider}.report.test.ts`,
],
].filter(Boolean),
coverage: { enabled: false, clean: false },
}],
]

for (const threads of [true, false]) {
for (const threads of [true]) {
for (const [directory, config] of configs) {
await startVitest('test', [directory], {
...config,
Expand Down
4 changes: 3 additions & 1 deletion test/coverage-test/vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { resolve } from 'pathe'
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'

import CustomCoverageProviderModule from './custom-coverage-provider'

const provider = process.argv[1 + process.argv.indexOf('--provider')]

export default defineConfig({
Expand All @@ -14,7 +16,7 @@ export default defineConfig({
test: {
watch: false,
coverage: {
provider: provider as any,
provider: provider === 'custom' ? new CustomCoverageProviderModule() : provider as any,
include: ['src/**'],
clean: true,
all: true,
Expand Down

0 comments on commit 461e96f

Please sign in to comment.