build: use storybook test addon to get coverage (#8316)

This commit is contained in:
Barthélémy Ledoux
2025-04-09 20:53:53 +02:00
committed by GitHub
parent 504ff282ef
commit 2c411a27cc
9 changed files with 213 additions and 41 deletions

View File

@@ -41,28 +41,15 @@ jobs:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
run: npm run build
- name: Run front-end unit tests
shell: bash
working-directory: ui
run: npm run test:cicd
- name: Storybook - Install Playwright
shell: bash
working-directory: ui
run: npx playwright install --with-deps
- name: Storybook - Build
- name: Run front-end unit tests
shell: bash
working-directory: ui
run: npm run build-storybook --quiet
- name: Storybook - Run tests
shell: bash
working-directory: ui
run: |
npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
"npx http-server storybook-static --port 6006 --silent" \
"npx wait-on tcp:127.0.0.1:6006 && npm run test:storybook"
run: npm run test:cicd
- name: Codecov - Upload coverage reports
uses: codecov/codecov-action@v5

View File

@@ -8,7 +8,7 @@ const config: StorybookConfig = {
"@storybook/addon-essentials",
"@storybook/addon-themes",
"@chromatic-com/storybook",
"@storybook/addon-interactions",
"@storybook/experimental-addon-test"
],
framework: {
name: "@storybook/vue3-vite",
@@ -17,7 +17,7 @@ const config: StorybookConfig = {
async viteFinal(config) {
const {default: viteJSXPlugin} = await import("@vitejs/plugin-vue-jsx")
config.plugins = [
...config.plugins ?? [],
...(config.plugins ?? []),
viteJSXPlugin(),
];
return config;

View File

@@ -0,0 +1,9 @@
import {beforeAll} from "vitest";
import {setProjectAnnotations} from "@storybook/vue3";
import * as projectAnnotations from "./preview";
// This is an important step to apply the right configuration when testing your stories.
// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations
const project = setProjectAnnotations([projectAnnotations]);
beforeAll(project.beforeAll);

View File

@@ -20,6 +20,7 @@ export default [
"**/*.spec.ts",
"vite.config.js",
"vitest.config.js",
"vitest.workspace.js",
],
languageOptions: {globals: globals.node},
},

182
ui/package-lock.json generated
View File

@@ -69,9 +69,9 @@
"@rushstack/eslint-patch": "^1.11.0",
"@shikijs/markdown-it": "^3.2.1",
"@storybook/addon-essentials": "^8.6.12",
"@storybook/addon-interactions": "^8.6.12",
"@storybook/addon-themes": "^8.6.12",
"@storybook/blocks": "^8.6.12",
"@storybook/experimental-addon-test": "^8.6.12",
"@storybook/test": "^8.6.12",
"@storybook/test-runner": "^0.22.0",
"@storybook/vue3": "^8.6.12",
@@ -83,6 +83,7 @@
"@typescript-eslint/parser": "^8.28.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"@vitest/browser": "^3.1.1",
"@vitest/coverage-v8": "^3.1.1",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/test-utils": "^2.4.6",
@@ -99,6 +100,7 @@
"monaco-editor": "^0.52.2",
"monaco-yaml": "^5.3.1",
"patch-package": "^8.0.0",
"playwright": "^1.51.1",
"prettier": "^3.5.3",
"rollup-plugin-copy": "^3.5.0",
"sass": "^1.86.3",
@@ -3707,6 +3709,13 @@
"url": "https://opencollective.com/unts"
}
},
"node_modules/@polka/url": {
"version": "1.0.0-next.28",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
"integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
"dev": true,
"license": "MIT"
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
@@ -4313,27 +4322,6 @@
"storybook": "^8.6.12"
}
},
"node_modules/@storybook/addon-interactions": {
"version": "8.6.12",
"resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.12.tgz",
"integrity": "sha512-cTAJlTq6uVZBEbtwdXkXoPQ4jHOAGKQnYSezBT4pfNkdjn/FnEeaQhMBDzf14h2wr5OgBnJa6Lmd8LD9ficz4A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/instrumenter": "8.6.12",
"@storybook/test": "8.6.12",
"polished": "^4.2.2",
"ts-dedent": "^2.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^8.6.12"
}
},
"node_modules/@storybook/addon-measure": {
"version": "8.6.12",
"resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.12.tgz",
@@ -4539,6 +4527,43 @@
"storybook": "^8.6.12"
}
},
"node_modules/@storybook/experimental-addon-test": {
"version": "8.6.12",
"resolved": "https://registry.npmjs.org/@storybook/experimental-addon-test/-/experimental-addon-test-8.6.12.tgz",
"integrity": "sha512-auc8Ql0buH0WeaKVuSSuabxIiBWvqvAyxtXCm1sVMkL68GwrX3cmpNMwviz3mvKvM//F8zKi/31HMl1PZ5UnIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/icons": "^1.2.12",
"@storybook/instrumenter": "8.6.12",
"@storybook/test": "8.6.12",
"polished": "^4.2.2",
"prompts": "^2.4.0",
"ts-dedent": "^2.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"@vitest/browser": "^2.1.1 || ^3.0.0",
"@vitest/runner": "^2.1.1 || ^3.0.0",
"storybook": "^8.6.12",
"vitest": "^2.1.1 || ^3.0.0"
},
"peerDependenciesMeta": {
"@vitest/browser": {
"optional": true
},
"@vitest/runner": {
"optional": true
},
"vitest": {
"optional": true
}
}
},
"node_modules/@storybook/global": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
@@ -6574,6 +6599,84 @@
"vue": "^3.0.0"
}
},
"node_modules/@vitest/browser": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.1.1.tgz",
"integrity": "sha512-A+A69mMtrj1RPh96LfXGc309KSXhy2MslvyL+cp9+Y5EVdoJD4KfXDx/3SSlRGN70+hIoJ3RRbTidTvj18PZ/A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@testing-library/dom": "^10.4.0",
"@testing-library/user-event": "^14.6.1",
"@vitest/mocker": "3.1.1",
"@vitest/utils": "3.1.1",
"magic-string": "^0.30.17",
"sirv": "^3.0.1",
"tinyrainbow": "^2.0.0",
"ws": "^8.18.1"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"playwright": "*",
"vitest": "3.1.1",
"webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0"
},
"peerDependenciesMeta": {
"playwright": {
"optional": true
},
"safaridriver": {
"optional": true
},
"webdriverio": {
"optional": true
}
}
},
"node_modules/@vitest/browser/node_modules/@testing-library/user-event": {
"version": "14.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
"integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12",
"npm": ">=6"
},
"peerDependencies": {
"@testing-library/dom": ">=7.21.4"
}
},
"node_modules/@vitest/browser/node_modules/@vitest/pretty-format": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz",
"integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==",
"dev": true,
"license": "MIT",
"dependencies": {
"tinyrainbow": "^2.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/browser/node_modules/@vitest/utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz",
"integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "3.1.1",
"loupe": "^3.1.3",
"tinyrainbow": "^2.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/coverage-v8": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz",
@@ -16329,6 +16432,16 @@
"monaco-editor": ">=0.36"
}
},
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
"integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -19312,6 +19425,21 @@
"dev": true,
"license": "ISC"
},
"node_modules/sirv": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
"integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@polka/url": "^1.0.0-next.24",
"mrmime": "^2.0.0",
"totalist": "^3.0.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@@ -20218,6 +20346,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/totalist": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/tough-cookie": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",

View File

@@ -11,11 +11,11 @@
"test:unit": "vitest run",
"test:lint": "eslint",
"test:cicd": "vitest run --coverage --exclude=\"**/translation.spec.js\"",
"test:storybook": "vitest run --project=storybook",
"translations:check": "node ./src/translations/check.js",
"lint": "eslint --fix",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build",
"test:storybook": "test-storybook",
"prepare": "cd .. && husky ui/.husky && rm -f .git/hooks/*",
"notes": "node ./scripts/ci/generateReleaseNotes",
"postinstall": "patch-package"
@@ -81,9 +81,9 @@
"@rushstack/eslint-patch": "^1.11.0",
"@shikijs/markdown-it": "^3.2.1",
"@storybook/addon-essentials": "^8.6.12",
"@storybook/addon-interactions": "^8.6.12",
"@storybook/addon-themes": "^8.6.12",
"@storybook/blocks": "^8.6.12",
"@storybook/experimental-addon-test": "^8.6.12",
"@storybook/test": "^8.6.12",
"@storybook/test-runner": "^0.22.0",
"@storybook/vue3": "^8.6.12",
@@ -95,6 +95,7 @@
"@typescript-eslint/parser": "^8.28.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"@vitest/browser": "^3.1.1",
"@vitest/coverage-v8": "^3.1.1",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/test-utils": "^2.4.6",
@@ -111,6 +112,7 @@
"monaco-editor": "^0.52.2",
"monaco-yaml": "^5.3.1",
"patch-package": "^8.0.0",
"playwright": "^1.51.1",
"prettier": "^3.5.3",
"rollup-plugin-copy": "^3.5.0",
"sass": "^1.86.3",

View File

@@ -22,10 +22,16 @@ export default defineConfig({
junit: "./test-report.junit.xml",
},
coverage: {
include: [
"src/**/*.{js,ts,vue}",
],
exclude: [
...coverageConfigDefaults.exclude,
"stylelint.config.mjs",
"storybook-static/**",
"**/.storybook/**",
"**/*.stories.*",
"**/*.d.ts",
]
}
},

1
ui/vitest.shims.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="@vitest/browser/providers/playwright" />

28
ui/vitest.workspace.js Normal file
View File

@@ -0,0 +1,28 @@
import path from "node:path";
import {defineWorkspace} from "vitest/config";
import {storybookTest} from "@storybook/experimental-addon-test/vitest-plugin";
// More info at: https://storybook.js.org/docs/writing-tests/test-addon
export default defineWorkspace([
"vitest.config.js",
{
extends: "vite.config.js",
plugins: [
// The plugin will run tests for the stories defined in your Storybook config
// See options at: https://storybook.js.org/docs/writing-tests/test-addon#storybooktest
storybookTest({configDir: path.join(__dirname, ".storybook")}),
],
test: {
name: "storybook",
browser: {
enabled: true,
headless: true,
provider: "playwright",
instances: [{browser: "chromium"}],
},
setupFiles: [".storybook/vitest.setup.ts"],
},
},
]);