diff --git a/packages/vitest/src/node/workspace.ts b/packages/vitest/src/node/workspace.ts index b73f438ce4fae..36960512e17a4 100644 --- a/packages/vitest/src/node/workspace.ts +++ b/packages/vitest/src/node/workspace.ts @@ -266,6 +266,13 @@ export class WorkspaceProject { const testFile = relative(dir, t).toLocaleLowerCase() return filters.some((f) => { const relativePath = f.endsWith('/') ? join(relative(dir, f), '/') : relative(dir, f) + + // the file is inside the filter path, so we should always include it, + // we don't include ../file because this condition is always true if + // the file doens't exist which cause false positives + if (relativePath === '..' || relativePath === '../' || relativePath.startsWith('../..')) + return true + return testFile.includes(f.toLocaleLowerCase()) || testFile.includes(relativePath.toLocaleLowerCase()) }) }) diff --git a/test/filters/test/testname-pattern.test.ts b/test/filters/test/testname-pattern.test.ts index 6a134c6c16150..b6001e69268ae 100644 --- a/test/filters/test/testname-pattern.test.ts +++ b/test/filters/test/testname-pattern.test.ts @@ -1,4 +1,4 @@ -import { resolve } from 'pathe' +import { join, resolve } from 'pathe' import { expect, test } from 'vitest' import { runVitest } from '../../test-utils' @@ -30,3 +30,15 @@ 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.each([ + ['the parent of CWD', resolve(process.cwd(), '..')], + ['the parent of CWD with slash', join(resolve(process.cwd(), '..'), '/')], + ['the parent of a parent of CWD', resolve(process.cwd(), '..', '..')], +])('match by pattern that also matches %s: %s', async (_, filter) => { + const { stdout } = await runVitest({ root: './fixtures' }, [filter]) + + expect(stdout).toMatch('✓ test/filters.test.ts > this will pass') + expect(stdout).toMatch('× test/dont-run-this.test.ts > this will fail') + expect(stdout).toMatch('✓ test/example.test.ts > this will pass') +})