Files
lobehub__lobehub/packages/database/vitest.config.server.mts
Innei aba9e8150c 👷 build: migrate the test suite to vitest 5 (#19355)
* 👷 build: upgrade vitest to 5.0.0

Bump vitest and @vitest/coverage-v8 to 5.0.0 and migrate the configs for Vitest 4/5: drop the removed coverage.all option and replace poolOptions.forks.singleFork with maxWorkers/isolate.

* 👷 build: shim jest-dom matcher types for vitest 5

Vitest 5 exposes Assertion<R, T> and no longer reads the jest.Matchers augmentation that @testing-library/jest-dom ships, so its matchers vanish from expect(). Re-declare them on the Vitest interface, and replace the removed describe.sequential with { concurrent: false }.

* 👷 build: migrate the test suite to vitest 5

Vitest 5 (and @vitest/coverage-v8) replaces the esbuild dep optimizer with Rolldown, removed environmentMatchGlobs/coverage.all/poolOptions, forwards `new` to mock implementations, requires top-level vi.mock, and no longer resets automocks in restoreAllMocks. Migrate the root config to app/server projects with Rolldown optimizer options, shim the jest-dom matchers on Assertion<R, T>, and update the affected tests (constructor mocks, hoisted mocks, awaited assertions, explicit mock types, per-test mock defaults).

* 👷 build: make the openapi knowledge-base FileService mock constructable

tests/ was outside the per-area sweep; vitest 5 forwards `new` to the mock implementation, so the arrow implementation threw "is not a constructor".

* 👷 build: point the CI blob-report artifacts at the vitest 5 output dir

Vitest 5 writes blob reports to .vitest/blob instead of .vitest-reports, so the sharded jobs uploaded nothing and the merge jobs failed with ENOENT. Track the new directory in .gitignore too.

* 👷 build: refresh the desktop lockfile for vitest 5

apps/desktop/pnpm-lock.yaml is committed and the desktop build action installs with --frozen-lockfile, so the vitest/override change has to be reflected in it.

* 👷 build: keep the pre-vitest-4 coverage exclusions explicit

Vitest 4+ ships an empty coverageConfigDefaults.exclude, so configs that spread it silently lost the default exclusions (node_modules, dist, *.config.*) and counted more files. Inline the previous list.

* 🎨 style: format the migrated vitest configs

* 👷 build: keep canary's new class mocks constructable under vitest 5

exploreGraph/dispatchAuthorization/scopedDevices (canary #19375, #19352) mock classes with arrow implementations; vitest 5 constructs the implementation when the mock is newed, so the arrows throw 'is not a constructor'.
2026-09-10 22:18:49 +08:00

55 lines
2.0 KiB
TypeScript

import { resolve } from 'node:path';
import { defineConfig } from 'vitest/config';
export default defineConfig({
plugins: [
{
name: 'raw-md',
transform(_, id) {
if (id.endsWith('.md')) return { code: 'export default ""', map: null };
},
},
],
test: {
alias: {
'@/const': resolve(__dirname, '../const/src'),
'@/utils/errorResponse': resolve(__dirname, '../../src/utils/errorResponse'),
'@/utils': resolve(__dirname, '../utils/src'),
'@/database': resolve(__dirname, '../database/src'),
'@/libs/model-runtime': resolve(__dirname, '../model-runtime/src'),
'@/types': resolve(__dirname, '../types/src'),
'@/config': resolve(__dirname, '../app-config/src'),
'@/envs': resolve(__dirname, '../env/src'),
'@/libs/trpc': resolve(__dirname, '../trpc/src'),
'@/locales': resolve(__dirname, '../locales/src'),
'@/business/server': resolve(__dirname, '../business-server/src'),
'@/server/services': resolve(__dirname, '../../apps/server/src/services'),
'@/server/modules': resolve(__dirname, '../../apps/server/src/modules'),
'@': resolve(__dirname, '../../src'),
},
coverage: {
exclude: [
// https://github.com/lobehub/lobe-chat/pull/7265
// Vitest 4+ ships an empty `coverageConfigDefaults.exclude`; keep the previous
// default exclusions explicitly so the coverage set does not silently grow.
'**/node_modules/**',
'**/dist/**',
'**/cypress/**',
'**/.{idea,git,cache,output,temp}/**',
'**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*',
'src/server/core/dbForTest.ts',
],
include: ['src/models/**/*.ts', 'src/server/**/*.ts'],
provider: 'v8',
reporter: ['text', 'json', 'lcov', 'text-summary'],
},
env: {
TEST_SERVER_DB: '1',
},
environment: 'node',
isolate: false,
maxWorkers: 1,
setupFiles: './tests/setup-db.ts',
},
});