workflow: complete migration from jest to vitest

This commit is contained in:
Evan You 2023-01-26 22:53:39 +08:00
parent 158db33611
commit 28b95daa70
10 changed files with 149 additions and 1918 deletions

View File

@ -1,67 +0,0 @@
module.exports = {
testEnvironment: 'jsdom',
preset: 'ts-jest',
setupFilesAfterEnv: ['./scripts/setupJestEnv.ts'],
transform: {
'^.+\\.tsx?$': [
'ts-jest',
{
tsconfig: {
target: 'esnext',
sourceMap: true
}
}
]
},
globals: {
__DEV__: true,
__TEST__: true,
__VERSION__: require('./package.json').version,
__BROWSER__: false,
__GLOBAL__: false,
__ESM_BUNDLER__: true,
__ESM_BROWSER__: false,
__NODE_JS__: true,
__SSR__: true,
__FEATURE_OPTIONS_API__: true,
__FEATURE_SUSPENSE__: true,
__FEATURE_PROD_DEVTOOLS__: false,
__COMPAT__: true
},
coverageDirectory: 'coverage',
coverageReporters: ['html', 'lcov', 'text'],
collectCoverageFrom: [
'packages/*/src/**/*.ts',
'!packages/runtime-test/src/utils/**',
'!packages/template-explorer/**',
'!packages/sfc-playground/**',
'!packages/size-check/**',
'!packages/runtime-core/src/profiling.ts',
'!packages/runtime-core/src/customFormatter.ts',
// DOM transitions are tested via e2e so no coverage is collected
'!packages/runtime-dom/src/components/Transition*',
// only called in browsers
'!packages/vue/src/devCheck.ts',
// only used as a build entry
'!packages/vue/src/runtime.ts',
// mostly just entries
'!packages/vue-compat/**'
],
watchPathIgnorePatterns: ['/node_modules/', '/dist/', '/.git/'],
moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
moduleNameMapper: {
'@vue/consolidate': '@vue/consolidate',
'@vue/compat': '<rootDir>/packages/vue-compat/src',
'^@vue/(.*?)$': '<rootDir>/packages/$1/src',
'vue/compiler-sfc': '<rootDir>/packages/compiler-sfc/src',
'vue/server-renderer': '<rootDir>/packages/server-renderer/src',
vue: '<rootDir>/packages/vue/src'
},
rootDir: __dirname,
testMatch: ['<rootDir>/packages/**/__tests__/**/*spec.[jt]s?(x)'],
testPathIgnorePatterns: process.env.SKIP_E2E
? // ignore example tests on netlify builds since they don't contribute
// to coverage and can cause netlify builds to fail
['/node_modules/', '/examples/__tests__']
: ['/node_modules/']
}

View File

@ -11,12 +11,12 @@
"lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts",
"format": "prettier --write --cache --parser typescript \"**/*.[tj]s?(x)\"",
"format-check": "prettier --check --cache --parser typescript \"**/*.[tj]s?(x)\"",
"test": "run-s \"test-unit {@}\" \"test-e2e {@}\"",
"test-unit": "jest --filter ./scripts/filter-unit.mjs",
"test-e2e": "node scripts/build.mjs vue -f global -d && jest --filter ./scripts/filter-e2e.js --runInBand",
"test": "vitest",
"test-unit": "vitest -c vitest.unit.config.ts",
"test-e2e": "node scripts/build.mjs vue -f global -d && vitest -c vitest.e2e.config.ts",
"test-dts": "node scripts/build.mjs shared reactivity runtime-core runtime-dom -dt -f esm-bundler && npm run test-dts-only",
"test-dts-only": "tsc -p ./test-dts/tsconfig.json && tsc -p ./test-dts/tsconfig.build.mjson",
"test-coverage": "node scripts/build.mjs vue -f global -d && jest --runInBand --coverage --bail",
"test-coverage": "vitest -c vitest.unit.config.ts --coverage",
"release": "node scripts/release.mjs",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
"dev-esm": "node scripts/dev.mjs -if esm-bundler-runtime",
@ -62,9 +62,9 @@
"@rollup/plugin-replace": "^5.0.1",
"@rollup/plugin-terser": "^0.1.0",
"@types/hash-sum": "^1.0.0",
"@types/jest": "^29.2.2",
"@types/node": "^16.4.7",
"@typescript-eslint/parser": "^5.23.0",
"@vitest/coverage-istanbul": "^0.28.2",
"@vue/consolidate": "0.17.3",
"@vue/reactivity": "workspace:*",
"@vue/runtime-core": "workspace:*",
@ -76,10 +76,8 @@
"enquirer": "^2.3.2",
"esbuild": "^0.17.4",
"eslint": "^7.7.0",
"eslint-plugin-jest": "26.1.5",
"eslint-plugin-jest": "^27.2.1",
"execa": "^4.0.2",
"jest": "^29.3.1",
"jest-environment-jsdom": "^29.3.1",
"lint-staged": "^10.2.10",
"lodash": "^4.17.15",
"marked": "^4.0.10",
@ -98,7 +96,6 @@
"simple-git-hooks": "^2.8.1",
"terser": "^5.15.1",
"todomvc-app-css": "^2.3.0",
"ts-jest": "^29.0.3",
"tslib": "^2.4.0",
"typescript": "^4.8.0",
"vite": "^4.0.4",

View File

@ -2,6 +2,7 @@ import { initCustomFormatter } from '@vue/runtime-dom'
export function initDev() {
if (__BROWSER__) {
/* istanbul ignore if */
if (!__ESM_BUNDLER__) {
console.info(
`You are running a development build of Vue.\n` +

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
// jest only supports cjs filter files
const path = require('path')
const e2eTests = [
'vue/__tests__/Transition',
'vue/__tests__/TransitionGroup',
'vue/examples/'
]
module.exports = list => {
return {
filtered: list
.filter(t => e2eTests.some(tt => t.includes(path.normalize(tt))))
.map(test => ({ test }))
}
}
module.exports.e2eTests = e2eTests

View File

@ -1,10 +0,0 @@
// jest only supports cjs filter files
const { e2eTests } = require('./filter-e2e')
module.exports = list => {
return {
filtered: list
.filter(t => !e2eTests.some(tt => t.includes(tt)))
.map(test => ({ test }))
}
}

View File

@ -1,92 +0,0 @@
expect.extend({
toHaveBeenWarned(received: string) {
asserted.add(received)
const passed = warn.mock.calls.some(args => args[0].includes(received))
if (passed) {
return {
pass: true,
message: () => `expected "${received}" not to have been warned.`
}
} else {
const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
return {
pass: false,
message: () =>
`expected "${received}" to have been warned` +
(msgs.length
? `.\n\nActual messages:\n\n - ${msgs}`
: ` but no warning was recorded.`)
}
}
},
toHaveBeenWarnedLast(received: string) {
asserted.add(received)
const passed =
warn.mock.calls[warn.mock.calls.length - 1][0].includes(received)
if (passed) {
return {
pass: true,
message: () => `expected "${received}" not to have been warned last.`
}
} else {
const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
return {
pass: false,
message: () =>
`expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`
}
}
},
toHaveBeenWarnedTimes(received: string, n: number) {
asserted.add(received)
let found = 0
warn.mock.calls.forEach(args => {
if (args[0].includes(received)) {
found++
}
})
if (found === n) {
return {
pass: true,
message: () => `expected "${received}" to have been warned ${n} times.`
}
} else {
return {
pass: false,
message: () =>
`expected "${received}" to have been warned ${n} times but got ${found}.`
}
}
}
})
let warn: jest.SpyInstance
const asserted: Set<string> = new Set()
beforeEach(() => {
asserted.clear()
warn = jest.spyOn(console, 'warn')
warn.mockImplementation(() => {})
})
afterEach(() => {
const assertedArray = Array.from(asserted)
const nonAssertedWarnings = warn.mock.calls
.map(args => args[0])
.filter(received => {
return !assertedArray.some(assertedMsg => {
return received.includes(assertedMsg)
})
})
warn.mockRestore()
if (nonAssertedWarnings.length) {
throw new Error(
`test case threw unexpected warnings:\n - ${nonAssertedWarnings.join(
'\n - '
)}`
)
}
})

View File

@ -1,4 +1,4 @@
import { defineConfig } from 'vitest/config'
import { configDefaults, defineConfig, UserConfig } from 'vitest/config'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { readdirSync } from 'node:fs'
@ -45,6 +45,17 @@ export default defineConfig({
setupFiles: 'scripts/setupVitest.ts',
environmentMatchGlobs: [
['packages/{vue,vue-compat,runtime-dom}/**', 'jsdom']
]
],
coverage: {
provider: 'istanbul',
reporter: ['text', 'html'],
exclude: [
...configDefaults.coverage.exclude!,
// DOM transitions are tested via e2e so no coverage is collected
'packages/runtime-dom/src/components/Transition*',
// mostly entries
'packages/vue-compat/**'
]
}
}
})
}) as UserConfig

10
vitest.e2e.config.ts Normal file
View File

@ -0,0 +1,10 @@
import { UserConfig, configDefaults } from 'vitest/config'
import config from './vitest.config'
export default {
...config,
test: {
...config.test,
include: ['packages/vue/__tests__/e2e/*.spec.ts']
}
} as UserConfig

10
vitest.unit.config.ts Normal file
View File

@ -0,0 +1,10 @@
import { UserConfig, configDefaults } from 'vitest/config'
import config from './vitest.config'
export default {
...config,
test: {
...config.test,
exclude: [...configDefaults.exclude, '**/e2e/**']
}
} as UserConfig