From 324a9b54c204251579c7556d33f0bfc1b5411c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Wed, 17 May 2023 10:59:37 +0300 Subject: [PATCH] fix: exclude `cwd` from test name filter (#3353) --- packages/vitest/src/node/workspace.ts | 25 +++++++--- pnpm-lock.yaml | 9 ++++ .../fixtures/test/dont-run-this.test.ts | 5 ++ test/filters/fixtures/test/example.test.ts | 5 ++ test/filters/fixtures/test/filters.test.ts | 5 ++ test/filters/package.json | 11 ++++ test/filters/test/testname-pattern.test.ts | 50 +++++++++++++++++++ test/filters/vitest.config.ts | 8 +++ 8 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 test/filters/fixtures/test/dont-run-this.test.ts create mode 100644 test/filters/fixtures/test/example.test.ts create mode 100644 test/filters/fixtures/test/filters.test.ts create mode 100644 test/filters/package.json create mode 100644 test/filters/test/testname-pattern.test.ts create mode 100644 test/filters/vitest.config.ts diff --git a/packages/vitest/src/node/workspace.ts b/packages/vitest/src/node/workspace.ts index f373f7c1c50..0200ddb1493 100644 --- a/packages/vitest/src/node/workspace.ts +++ b/packages/vitest/src/node/workspace.ts @@ -91,11 +91,11 @@ export class WorkspaceProject { } async globTestFiles(filters: string[] = []) { - const { dir, root } = this.config + const dir = this.config.dir || this.config.root - const testFiles = await this.globAllTestFiles(this.config, dir || root) + const testFiles = await this.globAllTestFiles(this.config, dir) - return this.filterFiles(testFiles, filters) + return this.filterFiles(testFiles, filters, dir) } async globAllTestFiles(config: ResolvedConfig, cwd: string) { @@ -149,12 +149,18 @@ export class WorkspaceProject { return code.includes('import.meta.vitest') } - filterFiles(testFiles: string[], filters: string[] = []) { + filterFiles(testFiles: string[], filters: string[] = [], dir: string) { if (filters.length && process.platform === 'win32') filters = filters.map(f => toNamespacedPath(f)) - if (filters.length) - return testFiles.filter(i => filters.some(f => i.includes(f))) + if (filters.length) { + return testFiles.filter((t) => { + const testFile = relative(dir, t) + return filters.some((f) => { + return testFile.includes(f) || testFile.includes(relative(dir, f)) + }) + }) + } return testFiles } @@ -191,9 +197,12 @@ export class WorkspaceProject { } async typecheck(filters: string[] = []) { - const { dir, root } = this.config + const dir = this.config.dir || this.config.root const { include, exclude } = this.config.typecheck - const testsFilesList = this.filterFiles(await this.globFiles(include, exclude, dir || root), filters) + + const testFiles = await this.globFiles(include, exclude, dir) + const testsFilesList = this.filterFiles(testFiles, filters, dir) + const checker = new Typechecker(this, testsFilesList) this.typechecker = checker checker.onParseEnd(async ({ files, sourceErrors }) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c19f8ea824d..ab6d310e36c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1613,6 +1613,15 @@ importers: specifier: workspace:* version: link:../../packages/vitest + test/filters: + devDependencies: + vite: + specifier: ^4.2.1 + version: 4.2.1(@types/node@18.16.3) + vitest: + specifier: workspace:* + version: link:../../packages/vitest + test/global-setup: devDependencies: vitest: diff --git a/test/filters/fixtures/test/dont-run-this.test.ts b/test/filters/fixtures/test/dont-run-this.test.ts new file mode 100644 index 00000000000..abd6c9f378d --- /dev/null +++ b/test/filters/fixtures/test/dont-run-this.test.ts @@ -0,0 +1,5 @@ +import { expect, test } from 'vitest' + +test('this will fail', () => { + expect('This test should not be run').toBeFalsy() +}) diff --git a/test/filters/fixtures/test/example.test.ts b/test/filters/fixtures/test/example.test.ts new file mode 100644 index 00000000000..0df78e40b08 --- /dev/null +++ b/test/filters/fixtures/test/example.test.ts @@ -0,0 +1,5 @@ +import { expect, test } from 'vitest' + +test('this will pass', () => { + expect(1 + 1).toBe(2) +}) diff --git a/test/filters/fixtures/test/filters.test.ts b/test/filters/fixtures/test/filters.test.ts new file mode 100644 index 00000000000..80f1ecacedb --- /dev/null +++ b/test/filters/fixtures/test/filters.test.ts @@ -0,0 +1,5 @@ +import { expect, test } from 'vitest' + +test('this will pass', () => { + expect('This test should be run').toBeTruthy() +}) diff --git a/test/filters/package.json b/test/filters/package.json new file mode 100644 index 00000000000..abd3a45cce8 --- /dev/null +++ b/test/filters/package.json @@ -0,0 +1,11 @@ +{ + "name": "@vitest/test-filters", + "private": true, + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "vite": "latest", + "vitest": "workspace:*" + } +} diff --git a/test/filters/test/testname-pattern.test.ts b/test/filters/test/testname-pattern.test.ts new file mode 100644 index 00000000000..9aaa7b0cea1 --- /dev/null +++ b/test/filters/test/testname-pattern.test.ts @@ -0,0 +1,50 @@ +import { resolve } from 'pathe' +import { expect, test } from 'vitest' +import type { File } from 'vitest' +import { startVitest } from 'vitest/node' + +test('match by partial pattern', async () => { + const output = await runVitest('example') + + expect(output).toMatchInlineSnapshot('"pass: test/example.test.ts"') +}) + +test('match by full test file name', async () => { + const filename = resolve('./fixtures/test/example.test.ts') + const output = await runVitest(filename) + + expect(output).toMatchInlineSnapshot('"pass: test/example.test.ts"') +}) + +test('match by pattern that also matches current working directory', async () => { + const filter = 'filters' + expect(process.cwd()).toMatch(filter) + + const output = await runVitest(filter) + expect(output).toMatchInlineSnapshot('"pass: test/filters.test.ts"') +}) + +async function runVitest(...cliArgs: string[]) { + let resolve: (value: string) => void + const promise = new Promise((_resolve) => { + resolve = _resolve + }) + + await startVitest('test', cliArgs, { + root: './fixtures', + watch: false, + reporters: [{ + onFinished(files?: File[], errors?: unknown[]) { + if (errors?.length) + resolve(`Error: ${JSON.stringify(errors, null, 2)}`) + + if (files) + resolve(files.map(file => `${file.result?.state}: ${file.name}`).join('\n')) + else + resolve('No files') + }, + }], + }) + + return promise +} diff --git a/test/filters/vitest.config.ts b/test/filters/vitest.config.ts new file mode 100644 index 00000000000..7e66d6e731c --- /dev/null +++ b/test/filters/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + reporters: 'verbose', + include: ['test/**/*.test.*'], + }, +})