Skip to content

Commit

Permalink
fix(vitest): correctly filter by parent folder (#5408)
Browse files Browse the repository at this point in the history
  • Loading branch information
sheremet-va committed Apr 2, 2024
1 parent e7630a4 commit 91b06cc
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
14 changes: 12 additions & 2 deletions packages/vitest/src/node/workspace.ts
@@ -1,7 +1,7 @@
import { promises as fs } from 'node:fs'
import fg from 'fast-glob'
import mm from 'micromatch'
import { dirname, join, relative, resolve, toNamespacedPath } from 'pathe'
import { dirname, isAbsolute, join, relative, resolve, toNamespacedPath } from 'pathe'
import type { TransformResult, ViteDevServer, InlineConfig as ViteInlineConfig } from 'vite'
import { ViteNodeRunner } from 'vite-node/client'
import { ViteNodeServer } from 'vite-node/server'
Expand Down Expand Up @@ -257,7 +257,7 @@ export class WorkspaceProject {
return code.includes('import.meta.vitest')
}

filterFiles(testFiles: string[], filters: string[] = [], dir: string) {
filterFiles(testFiles: string[], filters: string[], dir: string) {
if (filters.length && process.platform === 'win32')
filters = filters.map(f => toNamespacedPath(f))

Expand All @@ -266,6 +266,16 @@ export class WorkspaceProject {
const testFile = relative(dir, t).toLocaleLowerCase()
return filters.some((f) => {
const relativePath = f.endsWith('/') ? join(relative(dir, f), '/') : relative(dir, f)

// if filter is a full file path, we should include it if it's in the same folder
if (isAbsolute(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())
})
})
Expand Down
14 changes: 13 additions & 1 deletion 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'
Expand Down Expand Up @@ -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')
})

0 comments on commit 91b06cc

Please sign in to comment.