diff --git a/.gitignore b/.gitignore index 5e706fa10..d78c8f284 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,9 @@ Thumbs.db # Nx workspace cache .nx +# Bundled Vitest configuration files +**/*.bundled_*.mjs + vite.config.*.timestamp* vitest.config.*.timestamp* .cursor/rules/nx-rules.mdc diff --git a/e2e/ci-e2e/vitest.e2e.config.ts b/e2e/ci-e2e/vitest.e2e.config.ts index 188911141..63848d98d 100644 --- a/e2e/ci-e2e/vitest.e2e.config.ts +++ b/e2e/ci-e2e/vitest.e2e.config.ts @@ -1,22 +1,19 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/ci-e2e', - test: { - reporters: ['basic'], - testTimeout: 60_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + globalSetup: './global-setup.ts', + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: './global-setup.ts', - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, + }; }); diff --git a/e2e/cli-e2e/vitest.e2e.config.ts b/e2e/cli-e2e/vitest.e2e.config.ts index c2f8187bd..c0aab4060 100644 --- a/e2e/cli-e2e/vitest.e2e.config.ts +++ b/e2e/cli-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/cli-e2e', - test: { - reporters: ['basic'], - testTimeout: 20_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/create-cli-e2e/vitest.e2e.config.ts b/e2e/create-cli-e2e/vitest.e2e.config.ts index 08534a740..c0aab4060 100644 --- a/e2e/create-cli-e2e/vitest.e2e.config.ts +++ b/e2e/create-cli-e2e/vitest.e2e.config.ts @@ -1,22 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/create-cli-e2e', - test: { - reporters: ['basic'], - testTimeout: 20_000, - hookTimeout: 20_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/nx-plugin-e2e/vitest.e2e.config.ts b/e2e/nx-plugin-e2e/vitest.e2e.config.ts index c0f955673..c0aab4060 100644 --- a/e2e/nx-plugin-e2e/vitest.e2e.config.ts +++ b/e2e/nx-plugin-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/nx-plugin-e2e', - test: { - reporters: ['basic'], - testTimeout: 80_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-coverage-e2e/vitest.e2e.config.ts b/e2e/plugin-coverage-e2e/vitest.e2e.config.ts index 15ef3ba1a..c0aab4060 100644 --- a/e2e/plugin-coverage-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-coverage-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-coverage-e2e', - test: { - reporters: ['basic'], - testTimeout: 40_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-eslint-e2e/vitest.e2e.config.ts b/e2e/plugin-eslint-e2e/vitest.e2e.config.ts index 500fe0cd5..c0aab4060 100644 --- a/e2e/plugin-eslint-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-eslint-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', - test: { - reporters: ['basic'], - testTimeout: 20_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts b/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts index 8b8475ed1..c0aab4060 100644 --- a/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-js-packages-e2e', - test: { - reporters: ['basic'], - testTimeout: 120_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts b/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts index ecbc894ae..c0aab4060 100644 --- a/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-jsdocs-e2e', - test: { - reporters: ['basic'], - testTimeout: 20_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts b/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts index 1040920ff..c0aab4060 100644 --- a/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts @@ -1,21 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', - test: { - reporters: ['basic'], - testTimeout: 80_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/e2e/plugin-typescript-e2e/vitest.e2e.config.ts b/e2e/plugin-typescript-e2e/vitest.e2e.config.ts index 8f30d049b..c0aab4060 100644 --- a/e2e/plugin-typescript-e2e/vitest.e2e.config.ts +++ b/e2e/plugin-typescript-e2e/vitest.e2e.config.ts @@ -1,26 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-typescript-e2e', - test: { - reporters: ['basic'], - testTimeout: 20_000, - globals: true, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-typescript-e2e/e2e-tests', - exclude: ['mocks/**', '**/types.ts'], - }, - cache: { - dir: '../../node_modules/.vitest', - }, - environment: 'node', - include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], - }, +export default defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/eslint.config.js b/eslint.config.js index 5830ca0f7..921716aad 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -27,6 +27,7 @@ export default tseslint.config( String.raw`^.*/eslint(\.base)?\.config\.[cm]?js$`, String.raw`^.*/code-pushup\.(config|preset)(\.m?[jt]s)?$`, '^[./]+/tools/.*$', + '^[./]+/testing/test-vitest-setup/.*$', ], depConstraints: [ { @@ -106,6 +107,12 @@ export default tseslint.config( 'vitest/expect-expect': 'off', }, }, + { + files: ['**/vitest.*.config.ts'], + rules: { + '@nx/enforce-module-boundaries': 'off', + }, + }, { files: ['**/*.json'], languageOptions: { parser: jsoncParser }, @@ -131,6 +138,7 @@ export default tseslint.config( '**/__snapshots__/**', '**/dist', '**/*.md', + '**/coverage/**', ], }, ); diff --git a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts index 7ed289eed..9aab7503b 100644 --- a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts +++ b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts @@ -191,7 +191,7 @@ describe('runnerFunction', () => { it('should return pass if no files are given and pass', async () => { vol.reset(); - // create empty directory + vol.fromJSON( { 'm.js': '', diff --git a/examples/plugins/vitest.int.config.ts b/examples/plugins/vitest.int.config.ts index 116936d7b..b9f8b6946 100644 --- a/examples/plugins/vitest.int.config.ts +++ b/examples/plugins/vitest.int.config.ts @@ -1,31 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/examples-plugins', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/examples-plugins/int-tests', - exclude: ['**/mocks/**', '**/mock/**', 'code-pushup.config.ts'], - }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/git.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/examples/plugins/vitest.unit.config.ts b/examples/plugins/vitest.unit.config.ts index a39e779dc..2457541c5 100644 --- a/examples/plugins/vitest.unit.config.ts +++ b/examples/plugins/vitest.unit.config.ts @@ -1,31 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/examples-plugins', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/examples-plugins/unit-tests', - exclude: ['**/mocks/**', '**/mock/**', 'code-pushup.config.ts'], - }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/git.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/ci/src/lib/monorepo/packages.unit.test.ts b/packages/ci/src/lib/monorepo/packages.unit.test.ts index b7024e953..61466df19 100644 --- a/packages/ci/src/lib/monorepo/packages.unit.test.ts +++ b/packages/ci/src/lib/monorepo/packages.unit.test.ts @@ -55,7 +55,7 @@ describe('listPackages', () => { vol.fromJSON( { 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), - 'package.json': pkgJsonContent({ name: 'example-monorepo' }), // not in patterns + 'package.json': pkgJsonContent({ name: 'example-monorepo' }), 'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }), 'packages/core/package.json': pkgJsonContent({ name: '@example/core' }), 'scripts/docs/index.js': 'console.log("not yet implemented")', // no package.json @@ -122,7 +122,7 @@ describe('listWorkspaces', () => { workspaces: ['ui', 'api'], }), 'api/package.json': pkgJsonContent({ name: 'api' }), - 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), 'ui/package.json': pkgJsonContent({ name: 'ui' }), }, MEMFS_VOLUME, @@ -155,7 +155,7 @@ describe('listWorkspaces', () => { private: true, workspaces: ['packages/*'], }), - 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), 'packages/cli/package.json': pkgJsonContent({ name: 'cli' }), 'packages/core/package.json': pkgJsonContent({ name: 'core' }), }, diff --git a/packages/ci/vitest.int.config.ts b/packages/ci/vitest.int.config.ts index dd5ebd0f9..b9f8b6946 100644 --- a/packages/ci/vitest.int.config.ts +++ b/packages/ci/vitest.int.config.ts @@ -1,29 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/ci', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/ci/int-tests', - exclude: ['mocks/**', '**/types.ts'], - }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/ci/vitest.unit.config.ts b/packages/ci/vitest.unit.config.ts index a7b37b3fd..2457541c5 100644 --- a/packages/ci/vitest.unit.config.ts +++ b/packages/ci/vitest.unit.config.ts @@ -1,32 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/ci', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/ci/unit-tests', - exclude: ['mocks/**', '**/types.ts'], - }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/git.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts index 040fb44c7..79d90c770 100644 --- a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts +++ b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts @@ -57,7 +57,6 @@ describe('autorun-command', () => { }), ); - // values come from CORE_CONFIG_MOCK returned by readRcByPath mock expect(uploadReportToPortal).toHaveBeenCalledWith< Parameters >({ diff --git a/packages/cli/src/lib/upload/upload-command.unit.test.ts b/packages/cli/src/lib/upload/upload-command.unit.test.ts index 7ffb7fbb1..1a99b482e 100644 --- a/packages/cli/src/lib/upload/upload-command.unit.test.ts +++ b/packages/cli/src/lib/upload/upload-command.unit.test.ts @@ -51,7 +51,6 @@ describe('upload-command-object', () => { undefined, ); - // values come from CORE_CONFIG_MOCK returned by readRcByPath mock expect(uploadReportToPortal).toHaveBeenCalledWith< Parameters >({ diff --git a/packages/cli/vitest.int.config.ts b/packages/cli/vitest.int.config.ts index 822df760a..34c2a1b04 100644 --- a/packages/cli/vitest.int.config.ts +++ b/packages/cli/vitest.int.config.ts @@ -1,29 +1,24 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/cli', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/cli/int-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + coverage: { + ...baseConfig.test.coverage, + exclude: [ + ...baseConfig.test.coverage.exclude, + // CLI-specific excludes (already has mocks/** and **/types.ts) + ], + }, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/cli/vitest.unit.config.ts b/packages/cli/vitest.unit.config.ts index cb4a01fb0..40cf4db98 100644 --- a/packages/cli/vitest.unit.config.ts +++ b/packages/cli/vitest.unit.config.ts @@ -1,34 +1,26 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/cli', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/cli/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/git.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/portal-client.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/git.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/portal-client.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - ], - }, + }; }); diff --git a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts index 191e2f995..715cdd375 100644 --- a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts +++ b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts @@ -55,11 +55,11 @@ describe('executePlugin', () => { const readRunnerResultsSpy = vi.spyOn(runnerModule, 'readRunnerResults'); const validRunnerResult = { - duration: 0, // readRunnerResults now automatically sets this to 0 for cache hits - date: new Date().toISOString(), // readRunnerResults sets this to current time + duration: 0, + date: new Date().toISOString(), audits: [ { - slug: 'node-version', // Must match the plugin config audit slug for enrichment + slug: 'node-version', score: 0.3, value: 16, }, diff --git a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts index d9c5e2001..e0a77bd5c 100644 --- a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts +++ b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts @@ -4,7 +4,6 @@ import { CONFIG_FILE_NAME, type CoreConfig } from '@code-pushup/models'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import { autoloadRc } from './read-rc-file.js'; -// mock bundleRequire inside importEsmModule used for fetching config vi.mock('bundle-require', async () => { const { CORE_CONFIG_MOCK }: Record = await vi.importActual('@code-pushup/test-utils'); @@ -29,7 +28,6 @@ vi.mock('bundle-require', async () => { }; }); -// Note: memfs files are only listed to satisfy a system check, value is used from bundle-require mock describe('autoloadRc', () => { it('prioritise a .ts configuration file', async () => { vol.fromJSON( diff --git a/packages/core/src/lib/merge-diffs.unit.test.ts b/packages/core/src/lib/merge-diffs.unit.test.ts index ef529e1dc..2ba583cd4 100644 --- a/packages/core/src/lib/merge-diffs.unit.test.ts +++ b/packages/core/src/lib/merge-diffs.unit.test.ts @@ -44,7 +44,7 @@ describe('mergeDiffs', () => { const outputPath = await mergeDiffs(files, persistConfig); const markdown = await readFile(outputPath, 'utf8'); - // `website` is unchanged, therefore not mentioned by name + expect(markdown).toContain('## 💼 Project `console`'); expect(markdown).toContain('## 💼 Project `admin`'); expect(markdown).toContain('## 💼 Project `docs`'); diff --git a/packages/core/vitest.int.config.ts b/packages/core/vitest.int.config.ts index 819c3a5bb..136654150 100644 --- a/packages/core/vitest.int.config.ts +++ b/packages/core/vitest.int.config.ts @@ -1,30 +1,21 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/core', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/core/int-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/portal-client.mock.ts', - ], - }, + }; }); diff --git a/packages/core/vitest.unit.config.ts b/packages/core/vitest.unit.config.ts index 820eb538c..03b7eab2c 100644 --- a/packages/core/vitest.unit.config.ts +++ b/packages/core/vitest.unit.config.ts @@ -1,36 +1,17 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/core', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/core/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/git.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/portal-client.mock.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts', - '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', - ], - }, + }; }); diff --git a/packages/create-cli/src/lib/init.unit.test.ts b/packages/create-cli/src/lib/init.unit.test.ts index e231b0dfb..785ee71eb 100644 --- a/packages/create-cli/src/lib/init.unit.test.ts +++ b/packages/create-cli/src/lib/init.unit.test.ts @@ -22,7 +22,6 @@ describe('initCodePushup', () => { const spyTeardownNxContext = vi.spyOn(createUtils, 'teardownNxContext'); beforeEach(() => { - // needed to get test folder set up vol.fromJSON( { 'random-file': '', diff --git a/packages/create-cli/vitest.unit.config.ts b/packages/create-cli/vitest.unit.config.ts index b990c0c6f..2457541c5 100644 --- a/packages/create-cli/vitest.unit.config.ts +++ b/packages/create-cli/vitest.unit.config.ts @@ -1,30 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/create-cli', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/create-cli/unit-tests', - exclude: ['mocks/**', '**/types.ts'], - }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/models/transformers/src/lib/transformers.ts b/packages/models/transformers/src/lib/transformers.ts index b61f19455..8b0b4634a 100644 --- a/packages/models/transformers/src/lib/transformers.ts +++ b/packages/models/transformers/src/lib/transformers.ts @@ -41,9 +41,8 @@ function annotateTypeDefinitions( } return tsLib.visitEachChild(node, visitor, context); }; - return (sourceFile: ts.SourceFile) => { - return tsLib.visitNode(sourceFile, visitor, tsLib.isSourceFile); - }; + return (sourceFile: ts.SourceFile) => + tsLib.visitNode(sourceFile, visitor, tsLib.isSourceFile); }; } diff --git a/packages/models/vitest.unit.config.ts b/packages/models/vitest.unit.config.ts index 386a073db..52a7af70c 100644 --- a/packages/models/vitest.unit.config.ts +++ b/packages/models/vitest.unit.config.ts @@ -1,30 +1,25 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/models', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/models/unit-tests', - exclude: ['mocks/**', '**/types.ts', 'zod2md.config.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: { + ...baseConfig.test.coverage, + exclude: [...baseConfig.test.coverage.exclude, 'zod2md.config.ts'], + }, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts index 9b730f726..8833b5cc8 100644 --- a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts @@ -9,7 +9,6 @@ import { createTargets } from './targets.js'; describe('createTargets', () => { beforeEach(async () => { - // needed to have the folder present. readdir otherwise it fails vol.fromJSON( { x: '', diff --git a/packages/nx-plugin/vitest.int.config.ts b/packages/nx-plugin/vitest.int.config.ts index 25d5530d1..b9f8b6946 100644 --- a/packages/nx-plugin/vitest.int.config.ts +++ b/packages/nx-plugin/vitest.int.config.ts @@ -1,28 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/nx-plugin', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/nx-plugin/int-tests', - exclude: ['mocks/**', '**/types.ts', '**/__snapshots__/**'], - }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/nx-plugin/vitest.unit.config.ts b/packages/nx-plugin/vitest.unit.config.ts index db557f696..2457541c5 100644 --- a/packages/nx-plugin/vitest.unit.config.ts +++ b/packages/nx-plugin/vitest.unit.config.ts @@ -1,29 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/nx-plugin', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/nx-plugin/unit-tests', - exclude: ['mocks/**', '**/types.ts', '**/__snapshots__/**'], - }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts index 5f587e33b..0b6c2e2f2 100644 --- a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts +++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts @@ -81,8 +81,12 @@ function hasNxTarget( export type VitestCoverageConfig = { test: { coverage?: { + enabled?: boolean; + provider?: string; reporter?: string[]; reportsDirectory?: string; + include?: string[]; + exclude?: string[]; }; }; }; diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts index 8d57dba34..d93d17551 100644 --- a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts +++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts @@ -86,7 +86,6 @@ describe('getCoveragePathForTarget', () => { beforeEach(() => { vol.fromJSON( { - // values come from bundle-require mock above 'vitest-valid.config.ts': '', 'jest-valid.config.ts': '', }, @@ -162,7 +161,6 @@ describe('getCoveragePathForVitest', () => { beforeEach(() => { vol.fromJSON( { - // values come from bundle-require mock above 'vitest-valid.config.unit.ts': '', 'vitest-no-dir.config.integration.ts': '', 'vitest-no-lcov.config.integration.ts': '', @@ -260,7 +258,6 @@ describe('getCoveragePathForJest', () => { beforeEach(() => { vol.fromJSON( { - // values come from bundle-require mock above 'jest-valid.config.unit.ts': '', 'jest-no-dir.config.integration.ts': '', 'jest-no-lcov.config.integration.ts': '', diff --git a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts index b943b04f0..7dd3bb6b4 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts @@ -80,11 +80,11 @@ end_of_record beforeEach(() => { vol.fromJSON( { - [path.join('integration-tests', 'lcov.info')]: UTILS_REPORT, // file name value under SF used in tests - [path.join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT, // file name value under SF used in tests + [path.join('integration-tests', 'lcov.info')]: UTILS_REPORT, + [path.join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT, [path.join('pytest', 'lcov.info')]: PYTEST_REPORT, [path.join('multi', 'lcov.info')]: MULTI_FILE_REPORT, - 'lcov.info': '', // empty report file + 'lcov.info': '', }, 'coverage', ); @@ -160,11 +160,8 @@ end_of_record expect.objectContaining({ lines: { found: 2, - hit: 2, // not 3 - details: [ - { hit: 1, line: 1 }, - // no { hit: 0, line: 0 }, - ], + hit: 2, + details: [{ hit: 1, line: 1 }], }, }), ]); diff --git a/packages/plugin-coverage/vitest.int.config.ts b/packages/plugin-coverage/vitest.int.config.ts index 1386d8f90..b36b3cf62 100644 --- a/packages/plugin-coverage/vitest.int.config.ts +++ b/packages/plugin-coverage/vitest.int.config.ts @@ -1,29 +1,24 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-coverage', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-coverage/int-tests', - exclude: ['mocks/**', '**/types.ts', '**/vitest.*.config.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: { + ...baseConfig.test.coverage, + exclude: [...baseConfig.test.coverage.exclude, '**/vitest.*.config.ts'], + }, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/plugin-coverage/vitest.unit.config.ts b/packages/plugin-coverage/vitest.unit.config.ts index e0bd6113e..3beb7dc75 100644 --- a/packages/plugin-coverage/vitest.unit.config.ts +++ b/packages/plugin-coverage/vitest.unit.config.ts @@ -1,32 +1,20 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-coverage', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-coverage/unit-tests', - exclude: ['mocks/**', '**/types.ts', '**/vitest.*.config.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + coverage: { + ...baseConfig.test.coverage, + exclude: [...baseConfig.test.coverage.exclude, '**/vitest.*.config.ts'], + }, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - ], - }, + }; }); diff --git a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts index 108dd16b1..05f292f7a 100644 --- a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts +++ b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts @@ -68,7 +68,7 @@ describe('lintResultsToAudits', () => { message: 'Specify the rules you want to disable', severity: 1, line: 1, - column: 0, // testing we omit non-positive columns + column: 0, }, ], }, diff --git a/packages/plugin-eslint/vitest.int.config.ts b/packages/plugin-eslint/vitest.int.config.ts index 4019fef85..136654150 100644 --- a/packages/plugin-eslint/vitest.int.config.ts +++ b/packages/plugin-eslint/vitest.int.config.ts @@ -1,29 +1,21 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-eslint', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-eslint/int-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/plugin-eslint/vitest.unit.config.ts b/packages/plugin-eslint/vitest.unit.config.ts index 65695242a..928bf2a1a 100644 --- a/packages/plugin-eslint/vitest.unit.config.ts +++ b/packages/plugin-eslint/vitest.unit.config.ts @@ -1,32 +1,25 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-eslint', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-eslint/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - ], - }, + }; }); diff --git a/packages/plugin-js-packages/vitest.int.config.ts b/packages/plugin-js-packages/vitest.int.config.ts index aee4b57a1..136654150 100644 --- a/packages/plugin-js-packages/vitest.int.config.ts +++ b/packages/plugin-js-packages/vitest.int.config.ts @@ -1,29 +1,21 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-js-packages', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-js-packages/int-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/plugin-js-packages/vitest.unit.config.ts b/packages/plugin-js-packages/vitest.unit.config.ts index 68f80bdce..81e6d4471 100644 --- a/packages/plugin-js-packages/vitest.unit.config.ts +++ b/packages/plugin-js-packages/vitest.unit.config.ts @@ -1,30 +1,22 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-js-packages', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-js-packages/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/plugin-jsdocs/vitest.int.config.ts b/packages/plugin-jsdocs/vitest.int.config.ts index 52301cf7d..136654150 100644 --- a/packages/plugin-jsdocs/vitest.int.config.ts +++ b/packages/plugin-jsdocs/vitest.int.config.ts @@ -1,30 +1,21 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-coverage', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-jsdocs/int-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/path.matcher.ts', - ], - }, + }; }); diff --git a/packages/plugin-jsdocs/vitest.unit.config.ts b/packages/plugin-jsdocs/vitest.unit.config.ts index 048851c63..dd2c3e0fa 100644 --- a/packages/plugin-jsdocs/vitest.unit.config.ts +++ b/packages/plugin-jsdocs/vitest.unit.config.ts @@ -1,32 +1,24 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-coverage', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-jsdocs/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/extend/path.matcher.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/path.matcher.ts', - ], - }, + }; }); diff --git a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts index 7774df24f..8b6064b88 100644 --- a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts @@ -8,16 +8,14 @@ import { createRunnerFunction } from './runner.js'; import type { LighthouseCliFlags } from './types.js'; import { enrichFlags, getConfig } from './utils.js'; -// used for createRunnerMocking vi.mock('./utils', async () => { - // Import the actual 'lighthouse' module const actual = await vi.importActual('./utils'); const actualEnrichFlags = actual['enrichFlags'] as ( f: LighthouseCliFlags, i?: number, ) => string; - // Return the mocked module, merging the actual module with overridden parts + return { ...actual, enrichFlags: vi.fn().mockImplementation(actualEnrichFlags), @@ -27,9 +25,8 @@ vi.mock('./utils', async () => { }); vi.mock('lighthouse/cli/run.js', async () => { - // Import the actual 'lighthouse' module const actual = await import('lighthouse/cli/run.js'); - // Define the mock implementation + const mockRunLighthouse = vi.fn( (url: string, flags: LighthouseCliFlags, config: Config) => url.includes('fail') @@ -54,10 +51,9 @@ vi.mock('lighthouse/cli/run.js', async () => { }, ); - // Return the mocked module, merging the actual module with overridden parts return { ...actual, - runLighthouse: mockRunLighthouse, // Mock the default export if 'lighthouse' is imported as default + runLighthouse: mockRunLighthouse, }; }); diff --git a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts index 93cdff927..3e39389fc 100644 --- a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts @@ -24,7 +24,6 @@ import { toAuditOutputs, } from './utils.js'; -// mock bundleRequire inside importEsmModule used for fetching config vi.mock('bundle-require', async () => { const { CORE_CONFIG_MOCK }: Record = await vi.importActual('@code-pushup/test-utils'); diff --git a/packages/plugin-lighthouse/vitest.unit.config.ts b/packages/plugin-lighthouse/vitest.unit.config.ts index 6739ccd4c..60060c05a 100644 --- a/packages/plugin-lighthouse/vitest.unit.config.ts +++ b/packages/plugin-lighthouse/vitest.unit.config.ts @@ -1,33 +1,25 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-lighthouse', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-lighthouse/unit-tests', - exclude: ['mocks/**', '**/types.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/extend/path.matcher.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/path.matcher.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - ], - }, + }; }); diff --git a/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts b/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts index 58776c291..74ea2518e 100644 --- a/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts +++ b/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts @@ -22,8 +22,8 @@ describe('createRunnerFunction', () => { const semanticTsCode = 2322; const mockSemanticDiagnostic = { - code: semanticTsCode, // "Type 'string' is not assignable to type 'number'" - start: 10, // Mocked character position + code: semanticTsCode, + start: 10, messageText: "Type 'string' is not assignable to type 'number'.", category: DiagnosticCategory.Error, file: { @@ -34,7 +34,7 @@ describe('createRunnerFunction', () => { const syntacticTsCode = 1005; const mockSyntacticDiagnostic = { code: syntacticTsCode, // "';' expected." - start: 25, // Mocked character position + start: 25, messageText: "';' expected.", category: DiagnosticCategory.Error, file: { diff --git a/packages/plugin-typescript/vitest.int.config.ts b/packages/plugin-typescript/vitest.int.config.ts index 87ad2157a..1c2671e1c 100644 --- a/packages/plugin-typescript/vitest.int.config.ts +++ b/packages/plugin-typescript/vitest.int.config.ts @@ -1,35 +1,22 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-typescript', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest/plugin-typescript', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-typescript/int-tests', - exclude: [ - 'mocks/**', - '**/types.ts', - '**/index.ts', - 'vitest.{unit,int}.config.ts', +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/chrome-path.mock.ts', ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/chrome-path.mock.ts', - ], - }, + }; }); diff --git a/packages/plugin-typescript/vitest.unit.config.ts b/packages/plugin-typescript/vitest.unit.config.ts index 7046393e3..046a97d22 100644 --- a/packages/plugin-typescript/vitest.unit.config.ts +++ b/packages/plugin-typescript/vitest.unit.config.ts @@ -1,37 +1,24 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/plugin-typescript', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest/plugin-typescript', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/plugin-typescript/unit-tests', - exclude: [ - 'mocks/**', - '**/types.ts', - '**/index.ts', - 'vitest.{unit,int}.config.ts', +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + '../../testing/test-setup/src/lib/fs.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, + }; }); diff --git a/packages/utils/src/lib/git/git.unit.test.ts b/packages/utils/src/lib/git/git.unit.test.ts index c38563939..fa8064e4f 100644 --- a/packages/utils/src/lib/git/git.unit.test.ts +++ b/packages/utils/src/lib/git/git.unit.test.ts @@ -27,7 +27,6 @@ describe('formatGitPath', () => { }); it('returns relative Unix path for a relative path within current working directory', () => { - // Mocking process.cwd() to return a specific path vi.spyOn(process, 'cwd').mockReturnValue('/Users/user/Projects/myProject'); const path = 'src/index.js'; const gitRoot = '/Users/user/Projects/myProject'; diff --git a/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts index b4d7c5fc4..454feede9 100644 --- a/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts +++ b/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts @@ -10,7 +10,7 @@ describe('logStdoutSummary', () => { beforeAll(() => { logs = []; - // console.log is used inside the logger when in "normal" mode + vi.spyOn(console, 'log').mockImplementation(msg => { logs = [...logs, msg]; }); diff --git a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts index 302fa4328..830c739a6 100644 --- a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts +++ b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts @@ -13,7 +13,7 @@ describe('logCategories', () => { beforeAll(() => { logs = []; - // console.log is used inside the logger when in "normal" mode + vi.spyOn(console, 'log').mockImplementation(msg => { logs = [...logs, msg]; }); diff --git a/packages/utils/vitest.int.config.ts b/packages/utils/vitest.int.config.ts index 61c01ddad..b9f8b6946 100644 --- a/packages/utils/vitest.int.config.ts +++ b/packages/utils/vitest.int.config.ts @@ -1,30 +1,14 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/utils', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/utils/int-tests', - exclude: ['mocks/**', 'perf/**', '**/types.ts'], - }, - environment: 'node', - include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - ], - }, +export default defineConfig(() => { + const baseConfig = createSharedIntegrationVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + }; }); diff --git a/packages/utils/vitest.unit.config.ts b/packages/utils/vitest.unit.config.ts index ac74f7af6..f5e1f1e37 100644 --- a/packages/utils/vitest.unit.config.ts +++ b/packages/utils/vitest.unit.config.ts @@ -1,38 +1,28 @@ -/// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { + TYPE_TEST_CONFIG, + createSharedUnitVitestConfig, +} from '../../testing/test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/utils', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/utils/unit-tests', - exclude: ['mocks/**', 'perf/**', '**/types.ts'], - }, - environment: 'node', - include: ['src/**/*.{unit,type}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - typecheck: { - include: ['**/*.type.test.ts'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + ...TYPE_TEST_CONFIG, + setupFiles: [ + ...baseConfig.test.setupFiles, + '../../testing/test-setup/src/lib/extend/path.matcher.ts', + ], + coverage: { + ...baseConfig.test.coverage, + exclude: [...baseConfig.test.coverage.exclude, 'perf/**'], + }, }, - globalSetup: ['../../global-setup.ts'], - setupFiles: [ - '../../testing/test-setup/src/lib/cliui.mock.ts', - '../../testing/test-setup/src/lib/fs.mock.ts', - '../../testing/test-setup/src/lib/console.mock.ts', - '../../testing/test-setup/src/lib/reset.mocks.ts', - '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', - '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts', - '../../testing/test-setup/src/lib/extend/path.matcher.ts', - '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', - ], - }, + }; }); diff --git a/testing/test-nx-utils/vitest.unit.config.ts b/testing/test-nx-utils/vitest.unit.config.ts index b5a305cc1..c18cd237a 100644 --- a/testing/test-nx-utils/vitest.unit.config.ts +++ b/testing/test-nx-utils/vitest.unit.config.ts @@ -1,24 +1,17 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../node_modules/.vite/test-nx-utils', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../node_modules/.vitest', +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig( + { + projectRoot: __dirname, + workspaceRoot: '../..', }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/test-nx-utils/unit-tests', - exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'], - }, - environment: 'node', - include: ['src/**/*.unit.test.ts'], - }, + true, + ); // noFsCwd = true for test-nx-utils + + return { + ...baseConfig, + }; }); diff --git a/testing/test-setup/src/lib/fs-memfs.setup-file.ts b/testing/test-setup/src/lib/fs-memfs.setup-file.ts new file mode 100644 index 000000000..21e4530e6 --- /dev/null +++ b/testing/test-setup/src/lib/fs-memfs.setup-file.ts @@ -0,0 +1,12 @@ +import { vi } from 'vitest'; + +// Mock fs and fs/promises to use memfs +vi.mock('fs', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs; +}); + +vi.mock('fs/promises', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs.promises; +}); diff --git a/testing/test-setup/src/lib/fs-only.mock.ts b/testing/test-setup/src/lib/fs-only.mock.ts new file mode 100644 index 000000000..bd93ffc74 --- /dev/null +++ b/testing/test-setup/src/lib/fs-only.mock.ts @@ -0,0 +1,12 @@ +import { vi } from 'vitest'; + +// Mock only fs modules, not process.cwd() +// This allows tests to mock process.cwd() themselves +vi.mock('fs', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs; +}); +vi.mock('fs/promises', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs.promises; +}); diff --git a/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts b/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts new file mode 100644 index 000000000..3282e9dd5 --- /dev/null +++ b/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts @@ -0,0 +1,24 @@ +import { type MockInstance, afterEach, beforeEach, vi } from 'vitest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; + +// Mock fs, fs/promises AND process.cwd() for full memfs environment +vi.mock('fs', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs; +}); + +vi.mock('fs/promises', async () => { + const memfs: typeof import('memfs') = await vi.importActual('memfs'); + return memfs.fs.promises; +}); + +// eslint-disable-next-line functional/no-let -- Mock spy needs to be reassignable +let cwdSpy: MockInstance<[], string> | undefined; + +beforeEach(() => { + cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(MEMFS_VOLUME); +}); + +afterEach(() => { + cwdSpy?.mockRestore(); +}); diff --git a/testing/test-setup/vitest.unit.config.ts b/testing/test-setup/vitest.unit.config.ts index 9a8966612..d1c75fd2c 100644 --- a/testing/test-setup/vitest.unit.config.ts +++ b/testing/test-setup/vitest.unit.config.ts @@ -1,29 +1,22 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../node_modules/.vite/test-setup', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../node_modules/.vitest', - }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/test-setup/unit-tests', - exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'], +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig({ + projectRoot: __dirname, + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + setupFiles: [ + ...baseConfig.test.setupFiles, + 'src/lib/extend/path.matcher.ts', + ], + coverage: baseConfig.test.coverage, }, - environment: 'node', - include: ['src/**/*.unit.test.ts'], - setupFiles: [ - '../test-setup/src/lib/reset.mocks.ts', - '../test-setup/src/lib/extend/path.matcher.ts', - '../test-setup/src/lib/extend/markdown-table.matcher.ts', - ], - }, + }; }); diff --git a/testing/test-utils/vitest.unit.config.ts b/testing/test-utils/vitest.unit.config.ts index 8d5f0328f..0d3bcea5e 100644 --- a/testing/test-utils/vitest.unit.config.ts +++ b/testing/test-utils/vitest.unit.config.ts @@ -1,24 +1,17 @@ /// -import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; +import { defineConfig } from 'vitest/config'; +import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js'; -export default defineConfig({ - cacheDir: '../node_modules/.vite/test-utils', - test: { - reporters: ['basic'], - globals: true, - cache: { - dir: '../node_modules/.vitest', +export default defineConfig(() => { + const baseConfig = createSharedUnitVitestConfig( + { + projectRoot: __dirname, + workspaceRoot: '../..', }, - alias: tsconfigPathAliases(), - pool: 'threads', - poolOptions: { threads: { singleThread: true } }, - coverage: { - reporter: ['text', 'lcov'], - reportsDirectory: '../../coverage/test-utils/unit-tests', - exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'], - }, - environment: 'node', - include: ['src/**/*.unit.test.ts'], - }, + true, + ); // noFsCwd = true for test-utils + + return { + ...baseConfig, + }; }); diff --git a/testing/test-vitest-setup/eslint.config.js b/testing/test-vitest-setup/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/testing/test-vitest-setup/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/testing/test-vitest-setup/package.json b/testing/test-vitest-setup/package.json new file mode 100644 index 000000000..af1cf4c55 --- /dev/null +++ b/testing/test-vitest-setup/package.json @@ -0,0 +1,4 @@ +{ + "name": "@code-pushup/test-vitest-setup", + "type": "module" +} diff --git a/testing/test-vitest-setup/project.json b/testing/test-vitest-setup/project.json new file mode 100644 index 000000000..ecaf9afe5 --- /dev/null +++ b/testing/test-vitest-setup/project.json @@ -0,0 +1,11 @@ +{ + "name": "test-vitest-setup", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "testing/test-vitest-setup/src", + "projectType": "library", + "targets": { + "build": {}, + "lint": {} + }, + "tags": ["scope:shared", "type:testing"] +} diff --git a/testing/test-vitest-setup/src/configs/base.ts b/testing/test-vitest-setup/src/configs/base.ts new file mode 100644 index 000000000..be7a133c1 --- /dev/null +++ b/testing/test-vitest-setup/src/configs/base.ts @@ -0,0 +1,19 @@ +/// +import { defineConfig } from 'vitest/config'; +import { tsconfigPathAliases } from '../utils/tsconfig-path-aliases.js'; + +export const baseTestConfig = defineConfig({ + test: { + reporters: ['basic'], + globals: true, + cache: { + dir: '../../node_modules/.vitest', + }, + alias: tsconfigPathAliases(), + pool: 'threads', + poolOptions: { threads: { singleThread: true } }, + environment: 'node', + globalSetup: ['../../global-setup.ts'], + setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], + }, +}); diff --git a/testing/test-vitest-setup/src/configs/e2e.ts b/testing/test-vitest-setup/src/configs/e2e.ts new file mode 100644 index 000000000..07df42a02 --- /dev/null +++ b/testing/test-vitest-setup/src/configs/e2e.ts @@ -0,0 +1,22 @@ +/// +import { defineConfig } from 'vitest/config'; +import { createSharedE2eVitestConfig } from '../utils/project-config.js'; + +export const e2eTestConfig = defineConfig(() => { + const baseConfig = createSharedE2eVitestConfig({ + projectRoot: process.cwd(), + workspaceRoot: '../..', + }); + + return { + ...baseConfig, + test: { + ...baseConfig.test, + include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], + coverage: { + enabled: false, + }, + }, + }; +}); diff --git a/testing/test-vitest-setup/src/configs/int.ts b/testing/test-vitest-setup/src/configs/int.ts new file mode 100644 index 000000000..f476b2803 --- /dev/null +++ b/testing/test-vitest-setup/src/configs/int.ts @@ -0,0 +1,22 @@ +/// +import { defineConfig } from 'vitest/config'; +import { baseTestConfig } from './base.js'; + +export const intTestConfig = defineConfig({ + ...baseTestConfig, + test: { + ...baseTestConfig.test, + coverage: { + reporter: ['text', 'lcov'], + reportsDirectory: './coverage', + exclude: ['mocks/**', '**/types.ts'], + }, + include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + setupFiles: [ + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/portal-client.mock.ts', + '../../testing/test-setup/src/lib/extend/path.matcher.ts', + ], + }, +}); diff --git a/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts b/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts new file mode 100644 index 000000000..d390c7b5b --- /dev/null +++ b/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts @@ -0,0 +1,31 @@ +/// +import { defineConfig } from 'vitest/config'; +import { baseTestConfig } from './base.js'; + +/** + * Unit test configuration that mocks fs but NOT process.cwd() + * Use this for utility packages that need to test real process.cwd() behavior + */ +export const unitTestConfigNoFsCwd = defineConfig({ + ...baseTestConfig, + test: { + ...baseTestConfig.test, + coverage: { + reporter: ['text', 'lcov'], + reportsDirectory: './coverage', + exclude: ['mocks/**', '**/types.ts'], + }, + include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + setupFiles: [ + '../../testing/test-setup/src/lib/fs-memfs.setup-file.ts', + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/git.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/portal-client.mock.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts', + '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', + ], + }, +}); diff --git a/testing/test-vitest-setup/src/configs/unit.ts b/testing/test-vitest-setup/src/configs/unit.ts new file mode 100644 index 000000000..54b05c014 --- /dev/null +++ b/testing/test-vitest-setup/src/configs/unit.ts @@ -0,0 +1,27 @@ +/// +import { defineConfig } from 'vitest/config'; +import { baseTestConfig } from './base.js'; + +export const unitTestConfig = defineConfig({ + ...baseTestConfig, + test: { + ...baseTestConfig.test, + coverage: { + reporter: ['text', 'lcov'], + reportsDirectory: './coverage', + exclude: ['mocks/**', '**/types.ts'], + }, + include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + setupFiles: [ + '../../testing/test-setup/src/lib/fs-with-cwd.setup-file.ts', + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/git.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/portal-client.mock.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts', + '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', + ], + }, +}); diff --git a/testing/test-vitest-setup/src/index.ts b/testing/test-vitest-setup/src/index.ts new file mode 100644 index 000000000..79d585811 --- /dev/null +++ b/testing/test-vitest-setup/src/index.ts @@ -0,0 +1,7 @@ +export * from './configs/unit.js'; +export * from './configs/unit-no-fs-cwd.js'; +export * from './configs/int.js'; +export * from './configs/e2e.js'; +export * from './configs/base.js'; +export * from './utils/project-config.js'; +export * from './utils/tsconfig-path-aliases.js'; diff --git a/testing/test-vitest-setup/src/utils/project-config.ts b/testing/test-vitest-setup/src/utils/project-config.ts new file mode 100644 index 000000000..67f34434f --- /dev/null +++ b/testing/test-vitest-setup/src/utils/project-config.ts @@ -0,0 +1,132 @@ +import { tsconfigPathAliases } from './tsconfig-path-aliases.js'; + +const UNIT_TEST_TIMEOUT = 5000; +const INTEGRATION_TEST_TIMEOUT = 15_000; +const E2E_TEST_TIMEOUT = 30_000; + +export const TYPE_TEST_CONFIG = { + include: [`src/**/*.{unit,type}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}`], + typecheck: { + include: ['**/*.type.test.ts'], + }, +}; + +export type SharedVitestConfigOptions = { + projectRoot: string; + workspaceRoot: string; +}; + +function getDefaultTestSettings( + testType: string, + defaultTimeout: number, + noFsCwd = false, +) { + return { + enabled: true, + environment: 'node' as const, + include: [`src/**/*.${testType}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}`], + exclude: [ + 'mocks/**', + '**/types.ts', + '**/__snapshots__/**', + 'src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}', + 'src/**/index.ts', + ], + testTimeout: defaultTimeout, + setupFiles: [ + noFsCwd + ? '../../testing/test-setup/src/lib/fs-memfs.setup-file.ts' + : '../../testing/test-setup/src/lib/fs-with-cwd.setup-file.ts', + '../../testing/test-setup/src/lib/cliui.mock.ts', + '../../testing/test-setup/src/lib/git.mock.ts', + '../../testing/test-setup/src/lib/console.mock.ts', + '../../testing/test-setup/src/lib/reset.mocks.ts', + '../../testing/test-setup/src/lib/portal-client.mock.ts', + '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts', + '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts', + '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts', + ], + }; +} + +function getProjectPaths( + projectRoot: string, + workspaceRoot: string, + testType: string, +) { + const pathSeparator = projectRoot.includes('/') ? '/' : '\\'; + const pathParts = projectRoot.split(pathSeparator); + const PROJECT_NAME_PARTS = 2; + const projectName = pathParts.slice(-PROJECT_NAME_PARTS).join('-'); + const coverageDir = `${workspaceRoot}/coverage/${projectName}/${testType}`; + const cacheDir = `${workspaceRoot}/node_modules/.vite/${projectName}`; + + return { projectName, coverageDir, cacheDir }; +} + +function createSharedVitestConfig( + options: SharedVitestConfigOptions, + testType: 'unit' | 'integration' | 'e2e', + defaultTimeout: number, + noFsCwd = false, +) { + const { projectRoot, workspaceRoot } = options; + const settings = getDefaultTestSettings(testType, defaultTimeout, noFsCwd); + const paths = getProjectPaths(projectRoot, workspaceRoot, testType); + + return { + root: projectRoot, + test: { + coverage: { + enabled: settings.enabled, + provider: 'v8' as const, + reporter: ['text', 'lcov'], + reportsDirectory: paths.coverageDir, + include: ['src/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + exclude: settings.exclude, + }, + watch: false, + globals: true, + environment: settings.environment, + include: settings.include, + reporters: ['basic'], + passWithNoTests: true, + testTimeout: settings.testTimeout, + alias: tsconfigPathAliases(), + setupFiles: settings.setupFiles, + cache: { + dir: `${workspaceRoot}/node_modules/.vitest`, + }, + pool: 'threads' as const, + poolOptions: { + threads: { + singleThread: true, + }, + }, + globalSetup: [`${workspaceRoot}/global-setup.ts`], + }, + }; +} + +export function createSharedUnitVitestConfig( + options: SharedVitestConfigOptions, + noFsCwd = false, +) { + return createSharedVitestConfig(options, 'unit', UNIT_TEST_TIMEOUT, noFsCwd); +} + +export function createSharedIntegrationVitestConfig( + options: SharedVitestConfigOptions, +) { + return createSharedVitestConfig( + options, + 'integration', + INTEGRATION_TEST_TIMEOUT, + ); +} + +export function createSharedE2eVitestConfig( + options: SharedVitestConfigOptions, +) { + return createSharedVitestConfig(options, 'e2e', E2E_TEST_TIMEOUT); +} diff --git a/tools/vitest-tsconfig-path-aliases.ts b/testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts similarity index 86% rename from tools/vitest-tsconfig-path-aliases.ts rename to testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts index ac8be04df..cb364b8f4 100644 --- a/tools/vitest-tsconfig-path-aliases.ts +++ b/testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts @@ -14,7 +14,8 @@ export function tsconfigPathAliases(): AliasOptions { .map( ([importPath, relativePath]): Alias => ({ find: importPath, - replacement: new URL(`../${relativePath}`, import.meta.url).pathname, + replacement: new URL(`../../../../${relativePath}`, import.meta.url) + .pathname, }), ); } diff --git a/testing/test-vitest-setup/tsconfig.json b/testing/test-vitest-setup/tsconfig.json new file mode 100644 index 000000000..6655c1b42 --- /dev/null +++ b/testing/test-vitest-setup/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "target": "ES2022", + "lib": ["ES2022"], + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "importHelpers": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "tmp"] +} diff --git a/testing/test-vitest-setup/tsconfig.lib.json b/testing/test-vitest-setup/tsconfig.lib.json new file mode 100644 index 000000000..78eb742a0 --- /dev/null +++ b/testing/test-vitest-setup/tsconfig.lib.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc" + }, + "include": ["src/**/*"], + "exclude": ["**/*.spec.ts", "**/*.test.ts"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index b183db5a3..5a0590b27 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -37,6 +37,9 @@ "@code-pushup/test-nx-utils": ["testing/test-nx-utils/src/index.ts"], "@code-pushup/test-setup": ["testing/test-setup/src/index.ts"], "@code-pushup/test-utils": ["testing/test-utils/src/index.ts"], + "@code-pushup/test-vitest-setup": [ + "testing/test-vitest-setup/src/index.ts" + ], "@code-pushup/typescript-plugin": [ "packages/plugin-typescript/src/index.ts" ],