feat(reporter): add filterMeta option to json reporter (#10078) · vitest-dev/vitest@b77de96 (original) (raw)
File tree
- packages/vitest/src/node/reporters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -417,6 +417,20 @@ Example of a JSON report: | ||
| 417 | 417 | Since Vitest 3, the JSON reporter includes coverage information in `coverageMap` if coverage is enabled. |
| 418 | 418 | ::: |
| 419 | 419 | |
| 420 | +The `meta` field in each assertion result can be filtered via the `filterMeta` reporter option. It receives the key and value of each field and should return a falsy value to exclude the field from the report: | |
| 421 | + | |
| 422 | +```ts | |
| 423 | +export default defineConfig({ | |
| 424 | + test: { | |
| 425 | + reporters: [ | |
| 426 | + ['json', { | |
| 427 | +filterMeta: (key, value) => key !== 'internalField', | |
| 428 | + }] | |
| 429 | + ] | |
| 430 | + }, | |
| 431 | +}) | |
| 432 | +``` | |
| 433 | + | |
| 420 | 434 | ### HTML Reporter |
| 421 | 435 | |
| 422 | 436 | Generates an HTML file to view test results through an interactive [GUI](/guide/ui). After the file has been generated, Vitest will keep a local development server running and provide a link to view the report in a browser. |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| @@ -74,6 +74,8 @@ export interface JsonTestResults { | |||
| 74 | 74 | ||
| 75 | 75 | export interface JsonOptions { | |
| 76 | 76 | outputFile?: string | |
| 77 | +/** @experimental */ | ||
| 78 | +filterMeta?: (key: string, value: unknown) => unknown | ||
| 77 | 79 | } | |
| 78 | 80 | ||
| 79 | 81 | export class JsonReporter implements Reporter { | |
| @@ -121,6 +123,7 @@ export class JsonReporter implements Reporter { | |||
| 121 | 123 | const testResults: Array<JsonTestResult> = [] | |
| 122 | 124 | ||
| 123 | 125 | const success = !!(files.length > 0 | | this.ctx.config.passWithNoTests) && numFailedTestSuites === 0 && numFailedTests === 0 |
| 126 | +const { filterMeta } = this.options | ||
| 124 | 127 | ||
| 125 | 128 | for (const file of files) { | |
| 126 | 129 | const tests = getTests([file]) | |
| @@ -161,7 +164,18 @@ export class JsonReporter implements Reporter { | |||
| 161 | 164 | failureMessages: | |
| 162 | 165 | t.result?.errors?.map(e => e.stack | | e.message) |
| 163 | 166 | location: t.location, | |
| 164 | -meta: t.meta, | ||
| 167 | +meta: filterMeta | ||
| 168 | + ? (() => { | ||
| 169 | +const filtered: Record<string, unknown> = {} | ||
| 170 | +for (const key in t.meta) { | ||
| 171 | +const value = t.meta[key as keyof TaskMeta] | ||
| 172 | +if (filterMeta(key, value)) { | ||
| 173 | +filtered[key] = value | ||
| 174 | +} | ||
| 175 | +} | ||
| 176 | +return filtered | ||
| 177 | +})() | ||
| 178 | + : t.meta, | ||
| 165 | 179 | tags: t.tags | | [], |
| 166 | 180 | } satisfies JsonAssertionResult | |
| 167 | 181 | }) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| 1 | +import { expect, test } from 'vitest' | |
| 2 | + | |
| 3 | +test('pass', ({ task }) => { | |
| 4 | +task.meta.custom = 'Passing test added this' | |
| 5 | +}) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -138,4 +138,35 @@ describe('json reporter', async () => { | ||
| 138 | 138 | expect(data.testResults).toHaveLength(1) |
| 139 | 139 | expect(data.testResults[0].status).toBe(expected) |
| 140 | 140 | }) |
| 141 | + | |
| 142 | +it('includes all meta fields when filterMeta is not set', async () => { | |
| 143 | +const { stdout } = await runVitest({ | |
| 144 | +reporters: 'json', | |
| 145 | + root, | |
| 146 | +include: ['**/json-meta.test.ts'], | |
| 147 | +}) | |
| 148 | + | |
| 149 | +const data = JSON.parse(stdout) | |
| 150 | +const results = data.testResults[0].assertionResults | |
| 151 | +const passing = results.find((r: any) => r.title === 'pass') | |
| 152 | + | |
| 153 | +expect(passing.meta).toEqual({ custom: 'Passing test added this' }) | |
| 154 | +}) | |
| 155 | + | |
| 156 | +it('filterMeta filters meta fields by key', async () => { | |
| 157 | +const { stdout } = await runVitest({ | |
| 158 | +reporters: [['json', { | |
| 159 | +filterMeta: key => key !== 'custom', | |
| 160 | +}]], | |
| 161 | + root, | |
| 162 | +include: ['**/json-meta.test.ts'], | |
| 163 | +}) | |
| 164 | + | |
| 165 | +const data = JSON.parse(stdout) | |
| 166 | +const results = data.testResults[0].assertionResults | |
| 167 | + | |
| 168 | +for (const result of results) { | |
| 169 | +expect(result.meta).toEqual({}) | |
| 170 | +} | |
| 171 | +}) | |
| 141 | 172 | }) |