From ec2e80406555d1eaceefc261d7a50675c2363882 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Thu, 5 Oct 2023 01:59:55 -0500 Subject: [PATCH] fix(vitest): print file path instead of "unknown test" when logging (#4146) --- packages/vitest/src/node/reporters/base.ts | 3 ++- packages/vitest/src/runtime/console.ts | 28 +++++++++++++++++++--- test/setup/setupFiles/console-setup.ts | 4 ++++ test/setup/tests/console-setup.test.ts | 19 +++++++++++++++ test/setup/tests/fixtures/console.test.ts | 3 +++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 test/setup/setupFiles/console-setup.ts create mode 100644 test/setup/tests/console-setup.test.ts create mode 100644 test/setup/tests/fixtures/console.test.ts diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index 57597cce3d4e..48e9882c0c9c 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -4,6 +4,7 @@ import type { ErrorWithDiff, File, Reporter, Task, TaskResultPack, UserConsoleLo import { getFullName, getSafeTimers, getSuites, getTests, hasFailed, hasFailedSnapshot, isCI, isNode, relativePath } from '../../utils' import type { Vitest } from '../../node' import { F_RIGHT } from '../../utils/figures' +import { UNKNOWN_TEST_ID } from '../../runtime/console' import { countTestErrors, divider, formatProjectName, formatTimeString, getStateString, getStateSymbol, pointer, renderSnapshotSummary } from './renderers/utils' const BADGE_PADDING = ' ' @@ -186,7 +187,7 @@ export abstract class BaseReporter implements Reporter { if (!this.shouldLog(log)) return const task = log.taskId ? this.ctx.state.idMap.get(log.taskId) : undefined - const header = c.gray(log.type + c.dim(` | ${task ? getFullName(task, c.dim(' > ')) : 'unknown test'}`)) + const header = c.gray(log.type + c.dim(` | ${task ? getFullName(task, c.dim(' > ')) : log.taskId !== UNKNOWN_TEST_ID ? log.taskId : 'unknown test'}`)) process[log.type].write(`${header}\n${log.content}\n`) } diff --git a/packages/vitest/src/runtime/console.ts b/packages/vitest/src/runtime/console.ts index 3061221f7d55..d80d6e0ac19f 100644 --- a/packages/vitest/src/runtime/console.ts +++ b/packages/vitest/src/runtime/console.ts @@ -1,14 +1,36 @@ import { Writable } from 'node:stream' import { Console } from 'node:console' +import { relative } from 'node:path' import { getSafeTimers } from '@vitest/utils' import { RealDate } from '../integrations/mock/date' import type { WorkerGlobalState } from '../types' +export const UNKNOWN_TEST_ID = '__vitest__unknown_test__' + +function getTaskIdByStack(root: string) { + const stack = new Error('STACK_TRACE_ERROR').stack?.split('\n') + + if (!stack) + return UNKNOWN_TEST_ID + + const index = stack.findIndex(line => line.includes('at Console.value (node:internal/console/')) + const line = index === -1 ? null : stack[index + 2] + + if (!line) + return UNKNOWN_TEST_ID + + const filepath = line.match(/at\s(.*)\s?/)?.[1] + + if (filepath) + return relative(root, filepath) + + return UNKNOWN_TEST_ID +} + export function createCustomConsole(state: WorkerGlobalState) { const stdoutBuffer = new Map() const stderrBuffer = new Map() const timers = new Map() - const unknownTestId = '__vitest__unknown_test__' const { setTimeout, clearTimeout } = getSafeTimers() @@ -63,7 +85,7 @@ export function createCustomConsole(state: WorkerGlobalState) { const stdout = new Writable({ write(data, encoding, callback) { - const id = state?.current?.id ?? unknownTestId + const id = state?.current?.id ?? getTaskIdByStack(state.ctx.config.root) let timer = timers.get(id) if (timer) { timer.stdoutTime = timer.stdoutTime || RealDate.now() @@ -84,7 +106,7 @@ export function createCustomConsole(state: WorkerGlobalState) { }) const stderr = new Writable({ write(data, encoding, callback) { - const id = state?.current?.id ?? unknownTestId + const id = state?.current?.id ?? getTaskIdByStack(state.ctx.config.root) let timer = timers.get(id) if (timer) { timer.stderrTime = timer.stderrTime || RealDate.now() diff --git a/test/setup/setupFiles/console-setup.ts b/test/setup/setupFiles/console-setup.ts new file mode 100644 index 000000000000..67ce18bc2afc --- /dev/null +++ b/test/setup/setupFiles/console-setup.ts @@ -0,0 +1,4 @@ +// eslint-disable-next-line no-console +console.log('setup') + +console.error('setup') diff --git a/test/setup/tests/console-setup.test.ts b/test/setup/tests/console-setup.test.ts new file mode 100644 index 000000000000..c047143c8e63 --- /dev/null +++ b/test/setup/tests/console-setup.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from 'vitest' + +import { runVitest } from '../../test-utils' + +async function run() { + return await runVitest({ + include: ['tests/fixtures/console.test.ts'], + setupFiles: ['setupFiles/console-setup.ts'], + }) +} + +describe('setup files console', () => { + test('print stdout and stderr correctly', async () => { + const { stdout, stderr } = await run() + const filepath = 'setupFiles/console-setup.ts' + expect(stdout).toContain(`stdout | ${filepath}`) + expect(stderr).toContain(`stderr | ${filepath}`) + }) +}) diff --git a/test/setup/tests/fixtures/console.test.ts b/test/setup/tests/fixtures/console.test.ts new file mode 100644 index 000000000000..58dd448b5edf --- /dev/null +++ b/test/setup/tests/fixtures/console.test.ts @@ -0,0 +1,3 @@ +import { test } from 'vitest' + +test('empty', () => {})