diff --git a/.github/workflows/vitest.yml b/.github/workflows/vitest.yml index d8e4142318..3d500c32c8 100644 --- a/.github/workflows/vitest.yml +++ b/.github/workflows/vitest.yml @@ -15,6 +15,9 @@ on: permissions: contents: read + # `davelosert/vitest-coverage-report-action` writes a PR comment with the + # coverage diff; needs write access on pull-requests for that. + pull-requests: write jobs: check-changes: @@ -80,8 +83,14 @@ jobs: run: pnpm run lint - name: Run relay-compiler run: pnpm run relay - - name: Run Vitest - run: pnpm run vitest + - name: Run Vitest with coverage + run: pnpm exec vitest run --coverage + - name: Report coverage on PR + if: always() + uses: davelosert/vitest-coverage-report-action@v2 + with: + working-directory: ./react + name: react-coverage backend-ai-ui-vitest: needs: check-changes @@ -119,8 +128,14 @@ jobs: run: pnpm run lint - name: Run relay-compiler run: cd ../.. && pnpm run relay - - name: Run Vitest - run: pnpm run vitest + - name: Run Vitest with coverage + run: pnpm exec vitest run --coverage + - name: Report coverage on PR + if: always() + uses: davelosert/vitest-coverage-report-action@v2 + with: + working-directory: ./packages/backend.ai-ui + name: backend-ai-ui-coverage root-vitest: needs: check-changes @@ -150,5 +165,10 @@ jobs: ${{ runner.os }}-pnpm-store- - name: Install dependencies run: pnpm install --merge-git-branch-lockfiles --no-frozen-lockfile - - name: Run Vitest - run: pnpm run vitest + - name: Run Vitest with coverage + run: pnpm exec vitest run --coverage + - name: Report coverage on PR + if: always() + uses: davelosert/vitest-coverage-report-action@v2 + with: + name: root-coverage diff --git a/package.json b/package.json index ded8520886..f44e6e172b 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "tslib": "^2.8.1", "typescript": "~5.5.4", "vitest": "^4.1.4", + "@vitest/coverage-v8": "^4.1.4", "webpack": "catalog:", "webpack-cli": "^6.0.1", "workbox-expiration": "^7.4.0", diff --git a/packages/backend.ai-ui/.gitignore b/packages/backend.ai-ui/.gitignore index ac9acdf8f8..70e4aa13b8 100644 --- a/packages/backend.ai-ui/.gitignore +++ b/packages/backend.ai-ui/.gitignore @@ -30,4 +30,7 @@ storybook-static .vscode/* !.vscode/settings.json.sample -dist \ No newline at end of file +dist + +# vitest coverage output +/coverage \ No newline at end of file diff --git a/packages/backend.ai-ui/package.json b/packages/backend.ai-ui/package.json index 43a4d00aa8..a786ecb12b 100644 --- a/packages/backend.ai-ui/package.json +++ b/packages/backend.ai-ui/package.json @@ -118,7 +118,8 @@ "vite-plugin-dts": "^4.5.4", "vite-plugin-relay-lite": "^0.11.0", "vite-plugin-svgr": "^4.5.0", - "vitest": "^4.1.4" + "vitest": "^4.1.4", + "@vitest/coverage-v8": "^4.1.4" }, "type": "module" } diff --git a/packages/backend.ai-ui/vitest.config.ts b/packages/backend.ai-ui/vitest.config.ts index c28c75218e..27c8ba9541 100644 --- a/packages/backend.ai-ui/vitest.config.ts +++ b/packages/backend.ai-ui/vitest.config.ts @@ -59,5 +59,24 @@ export default defineConfig({ ], include: ['src/**/*.{test,spec}.{ts,tsx}'], exclude: ['**/node_modules/**', '**/dist/**', '**/__generated__/**'], + + // Coverage settings — see comment in `react/vitest.config.ts`. The + // `davelosert/vitest-coverage-report-action` GitHub Action consumes the + // `json-summary` reporter to post a PR comment with line/branch/function/ + // statement coverage diffs. + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'json-summary', 'html'], + reportsDirectory: 'coverage', + include: ['src/**/*.{ts,tsx}'], + exclude: [ + 'src/**/*.{test,spec}.{ts,tsx}', + 'src/**/*.stories.{ts,tsx}', + 'src/__generated__/**', + 'src/**/__generated__/**', + 'src/index.ts', + 'src/locale/**', + ], + }, }, }); diff --git a/react/package.json b/react/package.json index 977276df62..e400727ad3 100644 --- a/react/package.json +++ b/react/package.json @@ -163,6 +163,7 @@ "vite-plugin-node-polyfills": "^0.24.0", "vite-plugin-pwa": "^1.2.0", "vite-plugin-svgr": "^4.5.0", - "vitest": "^4.1.4" + "vitest": "^4.1.4", + "@vitest/coverage-v8": "^4.1.4" } } diff --git a/react/vitest.config.ts b/react/vitest.config.ts index 0f17606417..78677b83ba 100644 --- a/react/vitest.config.ts +++ b/react/vitest.config.ts @@ -97,5 +97,25 @@ export default defineConfig({ ], include: ['src/**/*.{test,spec}.{ts,tsx}'], exclude: ['**/node_modules/**', '**/build/**', '**/__generated__/**'], + + // Coverage settings: V8 provider is the fastest (Node's built-in V8 + // inspector with no Babel transform). `json-summary` is what + // `davelosert/vitest-coverage-report-action` consumes for the PR comment; + // `text` keeps a console summary; `html` lets developers open + // `coverage/index.html` locally for inline drill-down. + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'json-summary', 'html'], + reportsDirectory: 'coverage', + include: ['src/**/*.{ts,tsx}'], + exclude: [ + 'src/**/*.{test,spec}.{ts,tsx}', + 'src/**/*.stories.{ts,tsx}', + 'src/__generated__/**', + 'src/**/__generated__/**', + 'src/index.tsx', + 'src/reportWebVitals.ts', + ], + }, }, }); diff --git a/vitest.config.ts b/vitest.config.ts index 1902b5d239..25d0ac2a67 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -31,5 +31,20 @@ export default defineConfig({ "react/**", "packages/**", ], + + // Coverage settings — see comment in `react/vitest.config.ts`. Same + // reporters and provider so the `davelosert/vitest-coverage-report-action` + // PR comment shape is consistent across the three workspaces. + coverage: { + provider: "v8", + reporter: ["text", "json", "json-summary", "html"], + reportsDirectory: "coverage", + include: ["{src,scripts}/**/*.{ts,js,cjs}"], + exclude: [ + "{src,scripts}/**/*.{test,spec}.ts", + "src/wsproxy/**", + "src/lib/backend.ai-client-node.*", + ], + }, }, });