diff --git a/packages/runner/src/utils/collect.ts b/packages/runner/src/utils/collect.ts index b163bae7f716..2842f4eb9a6b 100644 --- a/packages/runner/src/utils/collect.ts +++ b/packages/runner/src/utils/collect.ts @@ -27,8 +27,14 @@ export function interpretTaskModes(suite: Suite, namePattern?: string | RegExp, } } if (t.type === 'test') { - if (namePattern && !getTaskFullName(t).match(namePattern)) - t.mode = 'skip' + if (namePattern) { + const taskFullName = getTaskFullName(t) + // Match also the task full name with a leading space to be backward-compatible with tools like + // IntelliJ/WebStorm. Previous Vitest versions (<= 0.34.3) had the task full name starting + // with a space, and the tools passed `testNamePattern` matching it. + if (!(taskFullName.match(namePattern) || ` ${taskFullName}`.match(namePattern))) + t.mode = 'skip' + } } else if (t.type === 'suite') { if (t.mode === 'skip') @@ -46,7 +52,8 @@ export function interpretTaskModes(suite: Suite, namePattern?: string | RegExp, } function getTaskFullName(task: TaskBase): string { - return `${task.suite ? `${getTaskFullName(task.suite)} ` : ''}${task.name}` + const fullName = task.suite ? getTaskFullName(task.suite) : null + return fullName ? `${fullName} ${task.name}` : task.name } export function someTasksAreOnly(suite: Suite): boolean { diff --git a/test/filters/test/testname-pattern.test.ts b/test/filters/test/testname-pattern.test.ts index 6a134c6c1615..40fd9cadc4bf 100644 --- a/test/filters/test/testname-pattern.test.ts +++ b/test/filters/test/testname-pattern.test.ts @@ -30,3 +30,14 @@ test('match by pattern that also matches current working directory', async () => expect(stdout).toMatch('Test Files 1 passed (1)') expect(stdout).not.toMatch('test/example.test.ts') }) + +test('match by test name pattern with ^', async () => { + const { stdout } = await runVitest({ + root: './fixtures', + testNamePattern: '^this', + }, ['filters']) + + expect(stdout).toMatch('✓ test/filters.test.ts > this will pass') + expect(stdout).toMatch('Test Files 1 passed (1)') + expect(stdout).not.toMatch('test/example.test.ts') +})