Browse Source

chore: Move from Jest to vitest

There are some benefits, like faster tests and thus saving CI time, but the main reason for me is:

Jest still does not properly support ESM packages, this casues a lot of breaking stuff.
Sometimes you need to adjust imports for mocking, and somethimes other random stuff break.
Instead of wasting valuable developer lifetime we can use vitest which works perfectly with ESM.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
pull/47466/head
Ferdinand Thiessen 1 year ago
parent
commit
c0b39bb909
No known key found for this signature in database GPG Key ID: 45FAE7268762B400
  1. 12
      __tests__/jest-setup.ts
  2. 5
      __tests__/mock-window.js
  3. 5
      __tests__/setup-testing-library.js
  4. 6
      __tests__/tsconfig.json
  5. 81
      jest.config.ts
  6. 21661
      package-lock.json
  7. 20
      package.json
  8. 4
      tsconfig.json
  9. 26
      vitest.config.ts

12
__tests__/jest-setup.ts

@ -1,12 +0,0 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import '@testing-library/jest-dom'
// Mock `window.location` with Jest spies and extend expect
import 'jest-location-mock'
// Mock `window.fetch` with Jest
import 'jest-fetch-mock'

5
__tests__/mock-window.js

@ -2,7 +2,12 @@
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { beforeEach } from 'vitest'
window.OC = { ...window.OC }
window.OCA = { ...window.OCA }
window.OCP = { ...window.OCP }
beforeEach(() => {
window.location = new URL('http://nextcloud.local')
})

5
__tests__/setup-testing-library.js

@ -0,0 +1,5 @@
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/
import '@testing-library/jest-dom/vitest'

6
__tests__/tsconfig.json

@ -1,6 +0,0 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"verbatimModuleSyntax": false
}
}

81
jest.config.ts

@ -1,81 +0,0 @@
/**
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { Config } from 'jest'
// TODO: find a way to consolidate this in one place, with webpack.common.js
const ignorePatterns = [
'@buttercup/fetch',
'@juliushaertl',
'@mdi/svg',
'@nextcloud/files',
'@nextcloud/upload',
'@nextcloud/vue',
'ansi-regex',
'camelcase',
'char-regex',
'hot-patcher',
'is-svg',
'layerr',
'mime',
'p-cancelable',
'p-limit',
'p-queue',
'p-timeout',
'splitpanes',
'string-length',
'strip-ansi',
'tributejs',
'unist-.+',
'url-join',
'vue-material-design-icons',
'webdav',
'yocto-queue',
]
const config: Config = {
testMatch: ['<rootDir>/**/*.(spec|test).(ts|js)'],
clearMocks: true,
setupFilesAfterEnv: [
'<rootDir>/__tests__/jest-setup.ts',
'<rootDir>/__tests__/mock-window.js',
],
testEnvironment: 'jest-environment-jsdom',
preset: 'ts-jest/presets/js-with-ts',
roots: [
'<rootDir>/__mocks__',
'<rootDir>/__tests__',
'<rootDir>/apps',
'<rootDir>/core',
],
transform: {
// process `*.js` files with `babel-jest`
'^.+\\.c?js$': 'babel-jest',
'^.+\\.vue$': '@vue/vue2-jest',
'^.+\\.ts$': ['ts-jest', {
// @see https://github.com/kulshekhar/ts-jest/issues/4081
tsconfig: './__tests__/tsconfig.json',
}],
},
transformIgnorePatterns: [
'node_modules/(?!(' + ignorePatterns.join('|') + ')/)',
],
// Allow mocking svg files
moduleNameMapper: {
'^.+\\.svg(\\?raw)?$': '<rootDir>/__mocks__/svg.js',
'\\.s?css$': '<rootDir>/__mocks__/css.js',
},
modulePathIgnorePatterns: [
'<rootDir>/apps2/',
'<rootDir>/apps-extra/',
],
}
export default config

21661
package-lock.json
File diff suppressed because it is too large
View File

20
package.json

@ -15,9 +15,9 @@
"watch": "webpack --node-env development --progress --watch",
"lint": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"apps/$appdir \"; fi; done) core --no-error-on-unmatched-pattern",
"lint:fix": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"apps/$appdir \"; fi; done) core --no-error-on-unmatched-pattern --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test": "vitest run",
"test:watch": "vitest watch",
"test:coverage": "vitest run --coverage",
"test:jsunit": "karma start tests/karma.config.js --single-run",
"sass": "sass --style compressed --load-path core/css core/css/ $(for cssdir in $(find apps -mindepth 2 -maxdepth 2 -name \"css\"); do if ! $(git check-ignore -q $cssdir); then printf \"$cssdir \"; fi; done)",
"sass:watch": "sass --watch --load-path core/css core/css/ $(for cssdir in $(find apps -mindepth 2 -maxdepth 2 -name \"css\"); do if ! $(git check-ignore -q $cssdir); then printf \"$cssdir \"; fi; done)",
@ -121,7 +121,6 @@
"@babel/preset-typescript": "^7.24.7",
"@cypress/vue2": "^2.1.1",
"@cypress/webpack-preprocessor": "^6.0.2",
"@jest/globals": "^29.7.0",
"@nextcloud/babel-config": "^1.2.0",
"@nextcloud/cypress": "^1.0.0-beta.8",
"@nextcloud/eslint-config": "^8.4.1",
@ -131,16 +130,15 @@
"@pinia/testing": "^0.1.5",
"@simplewebauthn/types": "^10.0.0",
"@testing-library/cypress": "^10.0.2",
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/user-event": "^14.4.3",
"@testing-library/vue": "^5.8.3",
"@types/dockerode": "^3.3.29",
"@types/jest": "^29.5.2",
"@types/wait-on": "^5.3.4",
"@vitejs/plugin-vue2": "^2.3.1",
"@vitest/coverage-v8": "^2.0.5",
"@vue/test-utils": "^1.3.5",
"@vue/tsconfig": "^0.5.1",
"@vue/vue2-jest": "^29.2.6",
"babel-jest": "^29.6.4",
"babel-loader": "^9.1.0",
"babel-loader-exclude-node-modules-except": "^1.2.1",
"babel-plugin-module-resolver": "^5.0.2",
@ -160,10 +158,6 @@
"handlebars-loader": "^1.7.3",
"jasmine-core": "~2.5.2",
"jasmine-sinon": "^0.4.0",
"jest": "^29.0.3",
"jest-environment-jsdom": "^29.7.0",
"jest-fetch-mock": "^3.0.3",
"jest-location-mock": "^1.0.9",
"jsdoc": "^4.0.2",
"karma": "^6.4.3",
"karma-chrome-launcher": "^3.1.1",
@ -181,11 +175,11 @@
"sinon": "<= 5.0.7",
"style-loader": "^3.3.1",
"tar": "^7.4.3",
"ts-jest": "^29.2.3",
"ts-loader": "^9.5.0",
"ts-node": "^10.9.1",
"tslib": "^2.6.2",
"typescript": "^5.5.4",
"vitest": "^2.0.5",
"vue-loader": "^15.9.8",
"vue-template-compiler": "^2.7.16",
"wait-on": "^7.2.0",

4
tsconfig.json

@ -2,10 +2,10 @@
"extends": "@vue/tsconfig/tsconfig.json",
"include": ["./apps/**/*.ts", "./apps/**/*.vue", "./core/**/*.ts", "./core/**/*.vue", "./*.d.ts"],
"compilerOptions": {
"types": ["jest", "node", "vue", "vue-router"],
"types": ["node", "vue", "vue-router"],
"outDir": "./dist/",
"target": "ESNext",
"module": "esnext",
"module": "ESNext",
// Set module resolution to bundler and `noEmit` to be able to set `allowImportingTsExtensions`, so we can import Typescript with .ts extension
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,

26
vitest.config.ts

@ -0,0 +1,26 @@
/**
* SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue2'
export default defineConfig({
plugins: [vue()],
test: {
include: ['{apps,core}/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
environment: 'jsdom',
coverage: {
include: ['apps/*/src/**', 'core/src/**'],
exclude: ['**.spec.*', '**.test.*', '**.cy.*', 'core/src/tests/**'],
provider: 'v8',
reporter: ['lcov', 'text'],
},
setupFiles: ['__tests__/mock-window.js', '__tests__/setup-testing-library.js'],
server: {
deps: {
inline: [/@nextcloud\//],
},
},
},
})
Loading…
Cancel
Save