From 7dad5b5ac47ae7a992ef07cba007daf4271b5c34 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 18:42:25 +0100 Subject: [PATCH 01/16] test: split coverage tests --- e2e/plugin-coverage-e2e/.eslintrc.json | 12 ++ e2e/plugin-coverage-e2e/project.json | 28 ++++ .../__snapshots__/collect.e2e.test.ts.snap | 129 ++++++++++++++++++ .../tests/collect.e2e.test.ts | 72 ++++++++++ e2e/plugin-coverage-e2e/tsconfig.json | 20 +++ e2e/plugin-coverage-e2e/tsconfig.test.json | 14 ++ e2e/plugin-coverage-e2e/vite.config.e2e.ts | 21 +++ nx.json | 21 +-- package-lock.json | 8 +- package.json | 2 +- .../coverage-e2e-env/.gitignore | 3 + .../coverage-e2e-env/code-pushup.config.ts | 16 +++ .../coverage-e2e-env/project.json | 8 ++ .../coverage-e2e-env/src/index.mjs | 16 +++ .../coverage-e2e-env/src/index.test.mjs | 20 +++ .../coverage-e2e-env/vite.config.ts | 25 ++++ 16 files changed, 393 insertions(+), 22 deletions(-) create mode 100644 e2e/plugin-coverage-e2e/.eslintrc.json create mode 100644 e2e/plugin-coverage-e2e/project.json create mode 100644 e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap create mode 100644 e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts create mode 100644 e2e/plugin-coverage-e2e/tsconfig.json create mode 100644 e2e/plugin-coverage-e2e/tsconfig.test.json create mode 100644 e2e/plugin-coverage-e2e/vite.config.e2e.ts create mode 100644 static-environments/coverage-e2e-env/.gitignore create mode 100644 static-environments/coverage-e2e-env/code-pushup.config.ts create mode 100644 static-environments/coverage-e2e-env/project.json create mode 100644 static-environments/coverage-e2e-env/src/index.mjs create mode 100644 static-environments/coverage-e2e-env/src/index.test.mjs create mode 100644 static-environments/coverage-e2e-env/vite.config.ts diff --git a/e2e/plugin-coverage-e2e/.eslintrc.json b/e2e/plugin-coverage-e2e/.eslintrc.json new file mode 100644 index 000000000..7ef7b6dc8 --- /dev/null +++ b/e2e/plugin-coverage-e2e/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "parserOptions": { + "project": ["e2e/plugin-coverage-e2e/tsconfig.*?.json"] + } + } + ] +} diff --git a/e2e/plugin-coverage-e2e/project.json b/e2e/plugin-coverage-e2e/project.json new file mode 100644 index 000000000..fdf8f2e3c --- /dev/null +++ b/e2e/plugin-coverage-e2e/project.json @@ -0,0 +1,28 @@ +{ + "name": "plugin-coverage-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "e2e/plugin-coverage-e2e/src", + "projectType": "application", + "targets": { + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["e2e/plugin-coverage-e2e/**/*.ts"] + } + }, + "nxv-env-setup": { + "options": { + "environmentRoot": "static-environments/coverage-e2e-env" + } + }, + "e2e": { + "executor": "@nx/vite:test", + "options": { + "configFile": "e2e/plugin-coverage-e2e/vite.config.e2e.ts" + } + } + }, + "implicitDependencies": ["cli", "plugin-coverage", "coverage-e2e-env"], + "tags": ["scope:plugin", "type:e2e"] +} diff --git a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap new file mode 100644 index 000000000..4dfa1545d --- /dev/null +++ b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap @@ -0,0 +1,129 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`collect report with coverage-plugin NPM package > should run Code coverage plugin that runs coverage tool and creates report.json 1`] = ` +{ + "categories": [], + "packageName": "@code-pushup/core", + "plugins": [ + { + "audits": [ + { + "description": "Measures how many functions were called in at least one test.", + "details": { + "issues": [ + { + "message": "Function untested is not called in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/index.mjs", + "position": { + "startLine": 1, + }, + }, + }, + ], + }, + "displayValue": "66.7 %", + "score": 0.6667, + "slug": "function-coverage", + "title": "Function coverage", + "value": 66.66666666666666, + }, + { + "description": "Measures how many branches were executed after conditional statements in at least one test.", + "details": { + "issues": [ + { + "message": "1st branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/index.mjs", + "position": { + "startLine": 11, + }, + }, + }, + { + "message": "1st branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/index.mjs", + "position": { + "startLine": 15, + }, + }, + }, + ], + }, + "displayValue": "50 %", + "score": 0.5, + "slug": "branch-coverage", + "title": "Branch coverage", + "value": 50, + }, + { + "description": "Measures how many lines of code were executed in at least one test.", + "details": { + "issues": [ + { + "message": "Lines 2-3 are not covered in any test case.", + "severity": "warning", + "source": { + "file": "static-environments/coverage-e2e-env/src/index.mjs", + "position": { + "endLine": 3, + "startLine": 2, + }, + }, + }, + { + "message": "Lines 12-13 are not covered in any test case.", + "severity": "warning", + "source": { + "file": "static-environments/coverage-e2e-env/src/index.mjs", + "position": { + "endLine": 13, + "startLine": 12, + }, + }, + }, + ], + }, + "displayValue": "75 %", + "score": 0.75, + "slug": "line-coverage", + "title": "Line coverage", + "value": 75, + }, + ], + "description": "Official Code PushUp code coverage plugin.", + "docsUrl": "https://www.npmjs.com/package/@code-pushup/coverage-plugin/", + "groups": [ + { + "description": "Group containing all defined coverage types as audits.", + "refs": [ + { + "slug": "function-coverage", + "weight": 6, + }, + { + "slug": "branch-coverage", + "weight": 3, + }, + { + "slug": "line-coverage", + "weight": 1, + }, + ], + "slug": "coverage", + "title": "Code coverage metrics", + }, + ], + "icon": "folder-coverage-open", + "packageName": "@code-pushup/coverage-plugin", + "slug": "coverage", + "title": "Code coverage", + }, + ], +} +`; diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts new file mode 100644 index 000000000..5ed03a756 --- /dev/null +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -0,0 +1,72 @@ +import {dirname, join} from 'node:path'; +import {afterEach} from 'vitest'; +import {teardownTestFolder} from '@code-pushup/test-setup'; +import {fileURLToPath} from "node:url"; +import {executeProcess, readJsonFile} from "@code-pushup/utils"; +import {type Report, reportSchema} from "@code-pushup/models"; +import {omitVariableReportData} from "@code-pushup/test-utils"; + +describe('collect report with coverage-plugin NPM package', () => { + const envRoot = 'static-environments/coverage-e2e-env'; + const baseDir = join(envRoot, '__tests__'); + + afterEach(async () => { + await teardownTestFolder(baseDir); + }); + + it('should run Code coverage plugin which collects passed results and creates report.json', async () => { + /** + * The stats passed in the fixture are as follows + * 3 files: one partially covered, one with no coverage, one with full coverage + * Functions: 2 + 1 + 2 found | 1 + 0 + 2 covered (60% coverage) + * Branches: 10 + 2 + 5 found | 8 + 0 + 5 covered (76% coverage) + * Lines: 10 + 5 + 10 found | 7 + 0 + 10 covered (68% coverage) + */ + + const configPath = join( + fileURLToPath(dirname(import.meta.url)), + '..', + 'mocks', + 'fixtures', + 'code-pushup.config.ts', + ); + + const {code, stderr} = await executeProcess({ + command: 'npx', + args: [ + '@code-pushup/cli', + 'collect', + '--no-progress', + `--config=${configPath}`, + '--persist.outputDir=tmp/e2e', + '--onlyPlugins=coverage', + ], + }); + + expect(code).toBe(0); + expect(stderr).toBe(''); + + const report = await readJsonFile(join(envRoot, 'e2e', 'report.json')); + + expect(() => reportSchema.parse(report)).not.toThrow(); + expect(omitVariableReportData(report as Report)).toMatchSnapshot(); + }); + + it('should run Code coverage plugin that runs coverage tool and creates report.json', async () => { + const {code, stderr} = await executeProcess({ + command: 'npx', + args: ['@code-pushup/cli', 'collect', '--no-progress', '--onlyPlugins=coverage'], + cwd: 'examples/react-todos-app', + }); + + expect(code).toBe(0); + expect(stderr).toBe(''); + + const report = await readJsonFile(join(envRoot, '.code-pushup/report.json')); + + expect(() => reportSchema.parse(report)).not.toThrow(); + expect(omitVariableReportData(report as Report)).toMatchSnapshot(); + }); + + +}); diff --git a/e2e/plugin-coverage-e2e/tsconfig.json b/e2e/plugin-coverage-e2e/tsconfig.json new file mode 100644 index 000000000..f5a2f890a --- /dev/null +++ b/e2e/plugin-coverage-e2e/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": ["vitest"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.test.json" + } + ] +} diff --git a/e2e/plugin-coverage-e2e/tsconfig.test.json b/e2e/plugin-coverage-e2e/tsconfig.test.json new file mode 100644 index 000000000..10c7f79de --- /dev/null +++ b/e2e/plugin-coverage-e2e/tsconfig.test.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["vitest/globals", "vitest/importMeta", "vite/client", "node"], + "target": "ES2020" + }, + "include": [ + "vite.config.e2e.ts", + "tests/**/*.e2e.test.ts", + "tests/**/*.d.ts", + "mocks/**/*.ts" + ] +} diff --git a/e2e/plugin-coverage-e2e/vite.config.e2e.ts b/e2e/plugin-coverage-e2e/vite.config.e2e.ts new file mode 100644 index 000000000..3956da52e --- /dev/null +++ b/e2e/plugin-coverage-e2e/vite.config.e2e.ts @@ -0,0 +1,21 @@ +/// +import { defineConfig } from 'vite'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; + +export default defineConfig({ + cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', + test: { + reporters: ['basic'], + testTimeout: 120_000, + globals: true, + alias: tsconfigPathAliases(), + pool: 'threads', + poolOptions: { threads: { singleThread: true } }, + cache: { + dir: '../../node_modules/.vitest', + }, + environment: 'node', + include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'], + }, +}); diff --git a/nx.json b/nx.json index bebd69d65..c7603298b 100644 --- a/nx.json +++ b/nx.json @@ -28,6 +28,9 @@ "e2e": { "dependsOn": ["^build"] }, + "nxv-env-setup": { + "executor": "@push-based/nx-verdaccio:env-setup" + }, "@nx/vite:test": { "cache": true, "inputs": ["default", "^production"], @@ -68,23 +71,7 @@ "appsDir": "examples", "libsDir": "packages" }, - "generators": { - "@nx/react": { - "application": { - "style": "css", - "linter": "eslint", - "bundler": "vite", - "babel": true - }, - "component": { - "style": "css" - }, - "library": { - "style": "css", - "linter": "eslint" - } - } - }, + "generators": {}, "release": { "projects": ["packages/*"], "projectsRelationship": "fixed", diff --git a/package-lock.json b/package-lock.json index 80639ae4b..960950fda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "@nx/react": "17.3.2", "@nx/vite": "17.3.2", "@nx/workspace": "17.3.2", - "@push-based/nx-verdaccio": "0.0.0-alpha.25", + "@push-based/nx-verdaccio": "0.0.0-alpha.26", "@swc-node/register": "^1.10.9", "@swc/cli": "~0.1.62", "@swc/core": "^1.3.99", @@ -5457,9 +5457,9 @@ } }, "node_modules/@push-based/nx-verdaccio": { - "version": "0.0.0-alpha.25", - "resolved": "https://registry.npmjs.org/@push-based/nx-verdaccio/-/nx-verdaccio-0.0.0-alpha.25.tgz", - "integrity": "sha512-5keAr9Gpw0TjUEwtMZVu/qweBYPPHHxHRNaRJgw94uOGSwcQwFcYn92w3+Z4/VdXhM0/RINALGc+/DgG1PV5fg==", + "version": "0.0.0-alpha.26", + "resolved": "https://registry.npmjs.org/@push-based/nx-verdaccio/-/nx-verdaccio-0.0.0-alpha.26.tgz", + "integrity": "sha512-Go11Dg+w5Ntl5Ig8YNzVVPbpOG85aVszjyBIK0FvVBX+/QllQY1F4fP8K8fYnMJnO9v5Tao3cryGFY5Zo9i+/g==", "dev": true, "dependencies": { "@nx/devkit": "19.8.0", diff --git a/package.json b/package.json index da4f9fb46..354f89a4b 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@nx/react": "17.3.2", "@nx/vite": "17.3.2", "@nx/workspace": "17.3.2", - "@push-based/nx-verdaccio": "0.0.0-alpha.25", + "@push-based/nx-verdaccio": "0.0.0-alpha.26", "@swc-node/register": "^1.10.9", "@swc/cli": "~0.1.62", "@swc/core": "^1.3.99", diff --git a/static-environments/coverage-e2e-env/.gitignore b/static-environments/coverage-e2e-env/.gitignore new file mode 100644 index 000000000..9e76e5c81 --- /dev/null +++ b/static-environments/coverage-e2e-env/.gitignore @@ -0,0 +1,3 @@ +coverage +node_modules +.code-pushup diff --git a/static-environments/coverage-e2e-env/code-pushup.config.ts b/static-environments/coverage-e2e-env/code-pushup.config.ts new file mode 100644 index 000000000..6421554cf --- /dev/null +++ b/static-environments/coverage-e2e-env/code-pushup.config.ts @@ -0,0 +1,16 @@ +import coveragePlugin from '@code-pushup/coverage-plugin'; + +export default { + plugins: [ + await coveragePlugin({ + reports: ['coverage/lcov.info'], + coverageToolCommand: { + command: 'npx', + args: ['vitest', 'run', '--coverage'], + }, + }), + ], + categories: [ + + ], +}; diff --git a/static-environments/coverage-e2e-env/project.json b/static-environments/coverage-e2e-env/project.json new file mode 100644 index 000000000..f8d390e28 --- /dev/null +++ b/static-environments/coverage-e2e-env/project.json @@ -0,0 +1,8 @@ +{ + "name": "coverage-e2e-env", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "static-environments/coverage-e2e-env/src", + "projectType": "library", + "targets": {}, + "tags": ["scope:internal", "type:feature"] +} diff --git a/static-environments/coverage-e2e-env/src/index.mjs b/static-environments/coverage-e2e-env/src/index.mjs new file mode 100644 index 000000000..18178fd1a --- /dev/null +++ b/static-environments/coverage-e2e-env/src/index.mjs @@ -0,0 +1,16 @@ +export function untested() { + console.log('This function is not tested'); +}; + +export function get42() { + return 42; +}; + +export function isEven(num) { + if(num === undefined){ + return false; + } + const parsedNumber = parseInt(num, 10); + return parsedNumber % 2 === 0; +}; + diff --git a/static-environments/coverage-e2e-env/src/index.test.mjs b/static-environments/coverage-e2e-env/src/index.test.mjs new file mode 100644 index 000000000..992e13f71 --- /dev/null +++ b/static-environments/coverage-e2e-env/src/index.test.mjs @@ -0,0 +1,20 @@ +import {describe, expect, it} from "vitest"; +import {get42, isEven, untested} from "./index"; + +describe("get42", () => { + it("should return 42", async () => { + expect(get42()).toBe(42); + }); +}); + +describe("isEven", () => { + it("should return true for even number 42", async () => { + expect(isEven(42)).toBe(true); + }); + + it.todo("should return false for odd number 1") +}); + +describe.todo("untested", () => { + +}); diff --git a/static-environments/coverage-e2e-env/vite.config.ts b/static-environments/coverage-e2e-env/vite.config.ts new file mode 100644 index 000000000..7051bfcef --- /dev/null +++ b/static-environments/coverage-e2e-env/vite.config.ts @@ -0,0 +1,25 @@ +/// +import {dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {defineConfig} from 'vite'; + +export default defineConfig({ + root: fileURLToPath(dirname(import.meta.url)), + cacheDir: 'node_modules/.vite/coverage-e2e-env', + + test: { + reporters: ['basic'], + globals: true, + cache: { + dir: 'node_modules/.vitest', + }, + coverage: { + reporter: ['lcov', 'text'], + provider: 'v8', + reportsDirectory: 'coverage', + include: ['src/**/*.{js,mjs}'], + }, + environment: 'node', + include: ['src/**/*.{test,spec}.{js,mjs}'] + }, +}); From e8cba86a402a45534cabd009e570523094e168fd Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 18:57:05 +0100 Subject: [PATCH 02/16] config --- e2e/cli-e2e/tests/collect.e2e.test.ts | 55 ------------- .../__snapshots__/collect.e2e.test.ts.snap | 45 ++++++----- .../tests/collect.e2e.test.ts | 49 ++++++------ .../coverage-e2e-env/code-pushup.config.ts | 13 +++- .../code-pushup.existing-report.config.ts | 25 ++++++ .../coverage-e2e-env/mocks/fixtures/lcov.info | 78 +++++++++++++++++++ .../coverage-e2e-env/src/index.mjs | 9 +-- .../coverage-e2e-env/src/index.test.mjs | 18 ++--- .../coverage-e2e-env/vite.config.ts | 8 +- 9 files changed, 179 insertions(+), 121 deletions(-) create mode 100644 static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts create mode 100644 static-environments/coverage-e2e-env/mocks/fixtures/lcov.info diff --git a/e2e/cli-e2e/tests/collect.e2e.test.ts b/e2e/cli-e2e/tests/collect.e2e.test.ts index 5e301ab29..269fae9fb 100644 --- a/e2e/cli-e2e/tests/collect.e2e.test.ts +++ b/e2e/cli-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,3 @@ -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; import { type AuditReport, type PluginReport, @@ -65,59 +63,6 @@ describe('CLI collect', () => { expect(omitVariableReportData(report as Report)).toMatchSnapshot(); }); - it('should run Code coverage plugin which collects passed results and creates report.json', async () => { - /** - * The stats passed in the fixture are as follows - * 3 files: one partially covered, one with no coverage, one with full coverage - * Functions: 2 + 1 + 2 found | 1 + 0 + 2 covered (60% coverage) - * Branches: 10 + 2 + 5 found | 8 + 0 + 5 covered (76% coverage) - * Lines: 10 + 5 + 10 found | 7 + 0 + 10 covered (68% coverage) - */ - - const configPath = join( - fileURLToPath(dirname(import.meta.url)), - '..', - 'mocks', - 'fixtures', - 'code-pushup.config.ts', - ); - - const { code, stderr } = await executeProcess({ - command: 'code-pushup', - args: [ - 'collect', - '--no-progress', - `--config=${configPath}`, - '--persist.outputDir=tmp/e2e', - '--onlyPlugins=coverage', - ], - }); - - expect(code).toBe(0); - expect(stderr).toBe(''); - - const report = await readJsonFile(join('tmp', 'e2e', 'report.json')); - - expect(() => reportSchema.parse(report)).not.toThrow(); - expect(omitVariableReportData(report as Report)).toMatchSnapshot(); - }); - - it('should run Code coverage plugin that runs coverage tool and creates report.json', async () => { - const { code, stderr } = await executeProcess({ - command: 'code-pushup', - args: ['collect', '--no-progress', '--onlyPlugins=coverage'], - cwd: 'examples/react-todos-app', - }); - - expect(code).toBe(0); - expect(stderr).toBe(''); - - const report = await readJsonFile('tmp/e2e/react-todos-app/report.json'); - - expect(() => reportSchema.parse(report)).not.toThrow(); - expect(omitVariableReportData(report as Report)).toMatchSnapshot(); - }); - it('should create report.md', async () => { const { code, stderr } = await executeProcess({ command: 'code-pushup', diff --git a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap index 4dfa1545d..857acd4f4 100644 --- a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap +++ b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap @@ -2,7 +2,20 @@ exports[`collect report with coverage-plugin NPM package > should run Code coverage plugin that runs coverage tool and creates report.json 1`] = ` { - "categories": [], + "categories": [ + { + "refs": [ + { + "plugin": "coverage", + "slug": "coverage", + "type": "group", + "weight": 1, + }, + ], + "slug": "code-coverage", + "title": "Code coverage", + }, + ], "packageName": "@code-pushup/core", "plugins": [ { @@ -39,27 +52,17 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover "source": { "file": "static-environments/coverage-e2e-env/src/index.mjs", "position": { - "startLine": 11, - }, - }, - }, - { - "message": "1st branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "static-environments/coverage-e2e-env/src/index.mjs", - "position": { - "startLine": 15, + "startLine": 10, }, }, }, ], }, - "displayValue": "50 %", - "score": 0.5, + "displayValue": "66.7 %", + "score": 0.6667, "slug": "branch-coverage", "title": "Branch coverage", - "value": 50, + "value": 66.66666666666666, }, { "description": "Measures how many lines of code were executed in at least one test.", @@ -77,23 +80,23 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover }, }, { - "message": "Lines 12-13 are not covered in any test case.", + "message": "Lines 11-12 are not covered in any test case.", "severity": "warning", "source": { "file": "static-environments/coverage-e2e-env/src/index.mjs", "position": { - "endLine": 13, - "startLine": 12, + "endLine": 12, + "startLine": 11, }, }, }, ], }, - "displayValue": "75 %", - "score": 0.75, + "displayValue": "73.3 %", + "score": 0.7333, "slug": "line-coverage", "title": "Line coverage", - "value": 75, + "value": 73.33333333333333, }, ], "description": "Official Code PushUp code coverage plugin.", diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 5ed03a756..4b169df74 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -1,10 +1,10 @@ -import {dirname, join} from 'node:path'; -import {afterEach} from 'vitest'; -import {teardownTestFolder} from '@code-pushup/test-setup'; -import {fileURLToPath} from "node:url"; -import {executeProcess, readJsonFile} from "@code-pushup/utils"; -import {type Report, reportSchema} from "@code-pushup/models"; -import {omitVariableReportData} from "@code-pushup/test-utils"; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { afterEach } from 'vitest'; +import { type Report, reportSchema } from '@code-pushup/models'; +import { teardownTestFolder } from '@code-pushup/test-setup'; +import { omitVariableReportData } from '@code-pushup/test-utils'; +import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('collect report with coverage-plugin NPM package', () => { const envRoot = 'static-environments/coverage-e2e-env'; @@ -23,50 +23,49 @@ describe('collect report with coverage-plugin NPM package', () => { * Lines: 10 + 5 + 10 found | 7 + 0 + 10 covered (68% coverage) */ - const configPath = join( - fileURLToPath(dirname(import.meta.url)), - '..', - 'mocks', - 'fixtures', - 'code-pushup.config.ts', - ); - - const {code, stderr} = await executeProcess({ + const { code, stderr } = await executeProcess({ command: 'npx', args: [ '@code-pushup/cli', 'collect', '--no-progress', - `--config=${configPath}`, - '--persist.outputDir=tmp/e2e', + `--config=code-pushup.existing-report.config.ts`, '--onlyPlugins=coverage', ], + cwd: envRoot, }); expect(code).toBe(0); expect(stderr).toBe(''); - const report = await readJsonFile(join(envRoot, 'e2e', 'report.json')); + const report = await readJsonFile( + join(envRoot, '.code-pushup', 'report.json'), + ); expect(() => reportSchema.parse(report)).not.toThrow(); expect(omitVariableReportData(report as Report)).toMatchSnapshot(); }); it('should run Code coverage plugin that runs coverage tool and creates report.json', async () => { - const {code, stderr} = await executeProcess({ + const { code, stderr } = await executeProcess({ command: 'npx', - args: ['@code-pushup/cli', 'collect', '--no-progress', '--onlyPlugins=coverage'], - cwd: 'examples/react-todos-app', + args: [ + '@code-pushup/cli', + 'collect', + '--no-progress', + '--onlyPlugins=coverage', + ], + cwd: envRoot, }); expect(code).toBe(0); expect(stderr).toBe(''); - const report = await readJsonFile(join(envRoot, '.code-pushup/report.json')); + const report = await readJsonFile( + join(envRoot, '.code-pushup/report.json'), + ); expect(() => reportSchema.parse(report)).not.toThrow(); expect(omitVariableReportData(report as Report)).toMatchSnapshot(); }); - - }); diff --git a/static-environments/coverage-e2e-env/code-pushup.config.ts b/static-environments/coverage-e2e-env/code-pushup.config.ts index 6421554cf..7fdd945d5 100644 --- a/static-environments/coverage-e2e-env/code-pushup.config.ts +++ b/static-environments/coverage-e2e-env/code-pushup.config.ts @@ -11,6 +11,17 @@ export default { }), ], categories: [ - + { + slug: 'code-coverage', + title: 'Code coverage', + refs: [ + { + type: 'group', + plugin: 'coverage', + slug: 'coverage', + weight: 1, + }, + ], + }, ], }; diff --git a/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts b/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts new file mode 100644 index 000000000..3ecb63128 --- /dev/null +++ b/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts @@ -0,0 +1,25 @@ +import { join } from 'node:path'; +import coveragePlugin from '@code-pushup/coverage-plugin'; +import type { CoreConfig } from '@code-pushup/models'; + +export default { + plugins: [ + await coveragePlugin({ + reports: [join('e2e', 'cli-e2e', 'mocks', 'fixtures', 'lcov.info')], + }), + ], + categories: [ + { + slug: 'code-coverage', + title: 'Code coverage', + refs: [ + { + type: 'group', + plugin: 'coverage', + slug: 'coverage', + weight: 1, + }, + ], + }, + ], +} satisfies CoreConfig; diff --git a/static-environments/coverage-e2e-env/mocks/fixtures/lcov.info b/static-environments/coverage-e2e-env/mocks/fixtures/lcov.info new file mode 100644 index 000000000..474ad74e7 --- /dev/null +++ b/static-environments/coverage-e2e-env/mocks/fixtures/lcov.info @@ -0,0 +1,78 @@ +TN: +SF:src\lib\partly-covered\utils.ts +FN:2,formatReportScore +FN:6,calcDuration +FNF:2 +FNH:1 +FNDA:0,formatReportScore +FNDA:6,calcDuration +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,1 +LF:10 +LH:7 +BRDA:1,0,0,6 +BRDA:1,1,0,5 +BRDA:2,4,0,1 +BRDA:4,5,0,17 +BRDA:5,6,0,4 +BRDA:6,7,0,13 +BRDA:6,10,1,0 +BRDA:7,11,0,3 +BRDA:10,12,0,12 +BRDA:10,13,1,0 +BRF:10 +BRH:8 +end_of_record +SF:src\lib\not-covered\sorting.ts +FN:1,sortReport +FNF:1 +FNH:0 +FNDA:0,sortReport +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +LF:5 +LH:0 +BRDA:7,1,0,0 +BRDA:7,2,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\lib\fully-covered\scoring.ts +FN:2,scoreReport +FN:8,calculateScore +FNF:2 +FNH:2 +FNDA:3,scoreReport +FNDA:5,calculateScore +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +LF:10 +LH:10 +BRDA:1,0,0,5 +BRDA:2,1,0,1 +BRDA:2,2,1,4 +BRDA:2,3,2,3 +BRDA:6,4,0,4 +BRF:5 +BRH:5 +end_of_record diff --git a/static-environments/coverage-e2e-env/src/index.mjs b/static-environments/coverage-e2e-env/src/index.mjs index 18178fd1a..b698a1fac 100644 --- a/static-environments/coverage-e2e-env/src/index.mjs +++ b/static-environments/coverage-e2e-env/src/index.mjs @@ -1,16 +1,15 @@ export function untested() { console.log('This function is not tested'); -}; +} export function get42() { return 42; -}; +} export function isEven(num) { - if(num === undefined){ + if (num === undefined) { return false; } const parsedNumber = parseInt(num, 10); return parsedNumber % 2 === 0; -}; - +} diff --git a/static-environments/coverage-e2e-env/src/index.test.mjs b/static-environments/coverage-e2e-env/src/index.test.mjs index 992e13f71..efef0528b 100644 --- a/static-environments/coverage-e2e-env/src/index.test.mjs +++ b/static-environments/coverage-e2e-env/src/index.test.mjs @@ -1,20 +1,18 @@ -import {describe, expect, it} from "vitest"; -import {get42, isEven, untested} from "./index"; +import { describe, expect, it } from 'vitest'; +import { get42, isEven, untested } from './index'; -describe("get42", () => { - it("should return 42", async () => { +describe('get42', () => { + it('should return 42', async () => { expect(get42()).toBe(42); }); }); -describe("isEven", () => { - it("should return true for even number 42", async () => { +describe('isEven', () => { + it('should return true for even number 42', async () => { expect(isEven(42)).toBe(true); }); - it.todo("should return false for odd number 1") + it.todo('should return false for odd number 1'); }); -describe.todo("untested", () => { - -}); +describe.todo('untested', () => {}); diff --git a/static-environments/coverage-e2e-env/vite.config.ts b/static-environments/coverage-e2e-env/vite.config.ts index 7051bfcef..7a6636feb 100644 --- a/static-environments/coverage-e2e-env/vite.config.ts +++ b/static-environments/coverage-e2e-env/vite.config.ts @@ -1,7 +1,7 @@ /// -import {dirname} from 'node:path'; -import {fileURLToPath} from 'node:url'; -import {defineConfig} from 'vite'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { defineConfig } from 'vite'; export default defineConfig({ root: fileURLToPath(dirname(import.meta.url)), @@ -20,6 +20,6 @@ export default defineConfig({ include: ['src/**/*.{js,mjs}'], }, environment: 'node', - include: ['src/**/*.{test,spec}.{js,mjs}'] + include: ['src/**/*.{test,spec}.{js,mjs}'], }, }); From 69eba2522893ff4afb78aa28eaf28e18d93cffd5 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 19:01:08 +0100 Subject: [PATCH 03/16] polish --- .../__snapshots__/collect.e2e.test.ts.snap | 171 ++++++++++++++++++ .../tests/collect.e2e.test.ts | 3 +- .../code-pushup.existing-report.config.ts | 2 +- .../coverage-e2e-env/package.json | 17 ++ 4 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 static-environments/coverage-e2e-env/package.json diff --git a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap index 857acd4f4..610e3b0a3 100644 --- a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap +++ b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap @@ -130,3 +130,174 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover ], } `; + +exports[`collect report with coverage-plugin NPM package > should run Code coverage plugin which collects passed results and creates report.json 1`] = ` +{ + "categories": [ + { + "refs": [ + { + "plugin": "coverage", + "slug": "coverage", + "type": "group", + "weight": 1, + }, + ], + "slug": "code-coverage", + "title": "Code coverage", + }, + ], + "packageName": "@code-pushup/core", + "plugins": [ + { + "audits": [ + { + "description": "Measures how many functions were called in at least one test.", + "details": { + "issues": [ + { + "message": "Function formatReportScore is not called in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", + "position": { + "startLine": 2, + }, + }, + }, + { + "message": "Function sortReport is not called in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "position": { + "startLine": 1, + }, + }, + }, + ], + }, + "displayValue": "60 %", + "score": 0.6, + "slug": "function-coverage", + "title": "Function coverage", + "value": 60, + }, + { + "description": "Measures how many branches were executed after conditional statements in at least one test.", + "details": { + "issues": [ + { + "message": "2nd branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", + "position": { + "startLine": 6, + }, + }, + }, + { + "message": "2nd branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", + "position": { + "startLine": 10, + }, + }, + }, + { + "message": "1st branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "position": { + "startLine": 7, + }, + }, + }, + { + "message": "2nd branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "position": { + "startLine": 7, + }, + }, + }, + ], + }, + "displayValue": "76.5 %", + "score": 0.7647, + "slug": "branch-coverage", + "title": "Branch coverage", + "value": 76.47058823529412, + }, + { + "description": "Measures how many lines of code were executed in at least one test.", + "details": { + "issues": [ + { + "message": "Lines 7-9 are not covered in any test case.", + "severity": "warning", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", + "position": { + "endLine": 9, + "startLine": 7, + }, + }, + }, + { + "message": "Lines 1-5 are not covered in any test case.", + "severity": "warning", + "source": { + "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "position": { + "endLine": 5, + "startLine": 1, + }, + }, + }, + ], + }, + "displayValue": "68 %", + "score": 0.68, + "slug": "line-coverage", + "title": "Line coverage", + "value": 68, + }, + ], + "description": "Official Code PushUp code coverage plugin.", + "docsUrl": "https://www.npmjs.com/package/@code-pushup/coverage-plugin/", + "groups": [ + { + "description": "Group containing all defined coverage types as audits.", + "refs": [ + { + "slug": "function-coverage", + "weight": 6, + }, + { + "slug": "branch-coverage", + "weight": 3, + }, + { + "slug": "line-coverage", + "weight": 1, + }, + ], + "slug": "coverage", + "title": "Code coverage metrics", + }, + ], + "icon": "folder-coverage-open", + "packageName": "@code-pushup/coverage-plugin", + "slug": "coverage", + "title": "Code coverage", + }, + ], +} +`; diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 4b169df74..6b3a01e42 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,4 @@ -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { join } from 'node:path'; import { afterEach } from 'vitest'; import { type Report, reportSchema } from '@code-pushup/models'; import { teardownTestFolder } from '@code-pushup/test-setup'; diff --git a/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts b/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts index 3ecb63128..9f6fffbb8 100644 --- a/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts +++ b/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts @@ -5,7 +5,7 @@ import type { CoreConfig } from '@code-pushup/models'; export default { plugins: [ await coveragePlugin({ - reports: [join('e2e', 'cli-e2e', 'mocks', 'fixtures', 'lcov.info')], + reports: [join('mocks', 'fixtures', 'lcov.info')], }), ], categories: [ diff --git a/static-environments/coverage-e2e-env/package.json b/static-environments/coverage-e2e-env/package.json new file mode 100644 index 000000000..a300af90f --- /dev/null +++ b/static-environments/coverage-e2e-env/package.json @@ -0,0 +1,17 @@ +{ + "name": "coverage-e2e-env", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@code-pushup/coverage-plugin": "^0.54.0", + "@code-pushup/models": "^0.54.0", + "@code-pushup/utils": "^0.54.0" + }, + "description": "" +} From ff441116c136acd4d5d0310d21b007bda6d2b232 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 19:02:34 +0100 Subject: [PATCH 04/16] polish --- e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 6b3a01e42..747fe0571 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -14,14 +14,6 @@ describe('collect report with coverage-plugin NPM package', () => { }); it('should run Code coverage plugin which collects passed results and creates report.json', async () => { - /** - * The stats passed in the fixture are as follows - * 3 files: one partially covered, one with no coverage, one with full coverage - * Functions: 2 + 1 + 2 found | 1 + 0 + 2 covered (60% coverage) - * Branches: 10 + 2 + 5 found | 8 + 0 + 5 covered (76% coverage) - * Lines: 10 + 5 + 10 found | 7 + 0 + 10 covered (68% coverage) - */ - const { code, stderr } = await executeProcess({ command: 'npx', args: [ From 9ddce4df4d051d5791e470aa4b5c20e30b0d716a Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 19:08:41 +0100 Subject: [PATCH 05/16] remove duplicate CP runs --- .../react-todos-app/code-pushup.config.js | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/examples/react-todos-app/code-pushup.config.js b/examples/react-todos-app/code-pushup.config.js index dcef94a7f..988dca804 100644 --- a/examples/react-todos-app/code-pushup.config.js +++ b/examples/react-todos-app/code-pushup.config.js @@ -1,4 +1,3 @@ -import coveragePlugin from '../../dist/packages/plugin-coverage'; import eslintPlugin from '../../dist/packages/plugin-eslint'; const eslintAuditRef = (slug, weight) => ({ @@ -13,31 +12,12 @@ export default { outputDir: '../../tmp/e2e/react-todos-app', }, plugins: [ - await coveragePlugin({ - reports: ['../../coverage/react-todos-app/lcov.info'], - coverageToolCommand: { - command: 'npx', - args: ['vitest', 'run', '--coverage'], - }, - }), await eslintPlugin({ eslintrc: '.eslintrc.js', patterns: ['src/**/*.js', 'src/**/*.jsx'], }), ], categories: [ - { - slug: 'code-coverage', - title: 'Code coverage', - refs: [ - { - type: 'group', - plugin: 'coverage', - slug: 'coverage', - weight: 1, - }, - ], - }, { slug: 'bug-prevention', title: 'Bug prevention', @@ -60,7 +40,6 @@ export default { eslintAuditRef('react-hooks-exhaustive-deps', 2), ], }, - { slug: 'code-style', title: 'Code style', From 3239423359f83022f8101a9b36d4c17b2286305d Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 19:37:59 +0100 Subject: [PATCH 06/16] add test script --- static-environments/coverage-e2e-env/code-pushup.config.ts | 4 ++-- static-environments/coverage-e2e-env/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/static-environments/coverage-e2e-env/code-pushup.config.ts b/static-environments/coverage-e2e-env/code-pushup.config.ts index 7fdd945d5..8d506c569 100644 --- a/static-environments/coverage-e2e-env/code-pushup.config.ts +++ b/static-environments/coverage-e2e-env/code-pushup.config.ts @@ -5,8 +5,8 @@ export default { await coveragePlugin({ reports: ['coverage/lcov.info'], coverageToolCommand: { - command: 'npx', - args: ['vitest', 'run', '--coverage'], + command: 'npm', + args: ['run', 'test'], }, }), ], diff --git a/static-environments/coverage-e2e-env/package.json b/static-environments/coverage-e2e-env/package.json index a300af90f..34be6d532 100644 --- a/static-environments/coverage-e2e-env/package.json +++ b/static-environments/coverage-e2e-env/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "npx vitest run --coverage" }, "keywords": [], "author": "", From 3ad8ee4b6c4be3be57d953108501a694c0c23403 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 Nov 2024 19:47:38 +0100 Subject: [PATCH 07/16] verbose gh action --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 845def216..a8ad36da1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,7 +120,7 @@ jobs: - name: Install dependencies run: npm ci - name: E2E test affected projects - run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 + run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 --verbose - name: E2E test cli-e2e project (due to bugs in the setup it has to run last :( ) run: npx nx run cli-e2e:e2e-old From a624b5aa582613597ce6976c71ba305763bf8fa3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Nov 2024 02:34:14 +0100 Subject: [PATCH 08/16] adjust tests --- e2e/plugin-coverage-e2e/project.json | 5 +++++ nx.json | 1 + static-environments/coverage-e2e-env/package.json | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/e2e/plugin-coverage-e2e/project.json b/e2e/plugin-coverage-e2e/project.json index fdf8f2e3c..4c4f76881 100644 --- a/e2e/plugin-coverage-e2e/project.json +++ b/e2e/plugin-coverage-e2e/project.json @@ -11,6 +11,11 @@ "lintFilePatterns": ["e2e/plugin-coverage-e2e/**/*.ts"] } }, + "nxv-e2e": { + "options": { + "environmentRoot": "static-environments/coverage-e2e-env" + } + }, "nxv-env-setup": { "options": { "environmentRoot": "static-environments/coverage-e2e-env" diff --git a/nx.json b/nx.json index c7603298b..299156fe9 100644 --- a/nx.json +++ b/nx.json @@ -28,6 +28,7 @@ "e2e": { "dependsOn": ["^build"] }, + "nxv-e2e": {}, "nxv-env-setup": { "executor": "@push-based/nx-verdaccio:env-setup" }, diff --git a/static-environments/coverage-e2e-env/package.json b/static-environments/coverage-e2e-env/package.json index 34be6d532..c132d93f1 100644 --- a/static-environments/coverage-e2e-env/package.json +++ b/static-environments/coverage-e2e-env/package.json @@ -8,10 +8,11 @@ "keywords": [], "author": "", "license": "ISC", + "description": "", "dependencies": { + "@code-pushup/core": "^0.54.0", "@code-pushup/coverage-plugin": "^0.54.0", "@code-pushup/models": "^0.54.0", "@code-pushup/utils": "^0.54.0" - }, - "description": "" + } } From c32e1589e6401802049496bef1eada5f27245c72 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 11 Nov 2024 18:29:40 +0100 Subject: [PATCH 09/16] cleanup --- .../plugin-coverage-e2e/__test-env__}/.gitignore | 0 .../plugin-coverage-e2e/__test-env__}/code-pushup.config.ts | 0 .../__test-env__}/code-pushup.existing-report.config.ts | 0 .../__test-env__}/mocks/fixtures/lcov.info | 0 .../plugin-coverage-e2e/__test-env__}/package.json | 4 ++-- .../plugin-coverage-e2e/__test-env__}/project.json | 2 +- .../plugin-coverage-e2e/__test-env__}/src/index.mjs | 0 .../plugin-coverage-e2e/__test-env__}/src/index.test.mjs | 2 +- .../plugin-coverage-e2e/__test-env__}/vite.config.ts | 0 e2e/plugin-coverage-e2e/project.json | 6 +++--- e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts | 6 +++--- e2e/plugin-coverage-e2e/tsconfig.test.json | 1 + 12 files changed, 11 insertions(+), 10 deletions(-) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/.gitignore (100%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/code-pushup.config.ts (100%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/code-pushup.existing-report.config.ts (100%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/mocks/fixtures/lcov.info (100%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/package.json (93%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/project.json (72%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/src/index.mjs (100%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/src/index.test.mjs (87%) rename {static-environments/coverage-e2e-env => e2e/plugin-coverage-e2e/__test-env__}/vite.config.ts (100%) diff --git a/static-environments/coverage-e2e-env/.gitignore b/e2e/plugin-coverage-e2e/__test-env__/.gitignore similarity index 100% rename from static-environments/coverage-e2e-env/.gitignore rename to e2e/plugin-coverage-e2e/__test-env__/.gitignore diff --git a/static-environments/coverage-e2e-env/code-pushup.config.ts b/e2e/plugin-coverage-e2e/__test-env__/code-pushup.config.ts similarity index 100% rename from static-environments/coverage-e2e-env/code-pushup.config.ts rename to e2e/plugin-coverage-e2e/__test-env__/code-pushup.config.ts diff --git a/static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts b/e2e/plugin-coverage-e2e/__test-env__/code-pushup.existing-report.config.ts similarity index 100% rename from static-environments/coverage-e2e-env/code-pushup.existing-report.config.ts rename to e2e/plugin-coverage-e2e/__test-env__/code-pushup.existing-report.config.ts diff --git a/static-environments/coverage-e2e-env/mocks/fixtures/lcov.info b/e2e/plugin-coverage-e2e/__test-env__/mocks/fixtures/lcov.info similarity index 100% rename from static-environments/coverage-e2e-env/mocks/fixtures/lcov.info rename to e2e/plugin-coverage-e2e/__test-env__/mocks/fixtures/lcov.info diff --git a/static-environments/coverage-e2e-env/package.json b/e2e/plugin-coverage-e2e/__test-env__/package.json similarity index 93% rename from static-environments/coverage-e2e-env/package.json rename to e2e/plugin-coverage-e2e/__test-env__/package.json index c132d93f1..ac964b1c9 100644 --- a/static-environments/coverage-e2e-env/package.json +++ b/e2e/plugin-coverage-e2e/__test-env__/package.json @@ -8,11 +8,11 @@ "keywords": [], "author": "", "license": "ISC", - "description": "", "dependencies": { "@code-pushup/core": "^0.54.0", "@code-pushup/coverage-plugin": "^0.54.0", "@code-pushup/models": "^0.54.0", "@code-pushup/utils": "^0.54.0" - } + }, + "description": "" } diff --git a/static-environments/coverage-e2e-env/project.json b/e2e/plugin-coverage-e2e/__test-env__/project.json similarity index 72% rename from static-environments/coverage-e2e-env/project.json rename to e2e/plugin-coverage-e2e/__test-env__/project.json index f8d390e28..4a70f3435 100644 --- a/static-environments/coverage-e2e-env/project.json +++ b/e2e/plugin-coverage-e2e/__test-env__/project.json @@ -1,6 +1,6 @@ { "name": "coverage-e2e-env", - "$schema": "../../node_modules/nx/schemas/project-schema.json", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "static-environments/coverage-e2e-env/src", "projectType": "library", "targets": {}, diff --git a/static-environments/coverage-e2e-env/src/index.mjs b/e2e/plugin-coverage-e2e/__test-env__/src/index.mjs similarity index 100% rename from static-environments/coverage-e2e-env/src/index.mjs rename to e2e/plugin-coverage-e2e/__test-env__/src/index.mjs diff --git a/static-environments/coverage-e2e-env/src/index.test.mjs b/e2e/plugin-coverage-e2e/__test-env__/src/index.test.mjs similarity index 87% rename from static-environments/coverage-e2e-env/src/index.test.mjs rename to e2e/plugin-coverage-e2e/__test-env__/src/index.test.mjs index efef0528b..d02988166 100644 --- a/static-environments/coverage-e2e-env/src/index.test.mjs +++ b/e2e/plugin-coverage-e2e/__test-env__/src/index.test.mjs @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { get42, isEven, untested } from './index'; +import { get42, isEven, untested } from './index.mjs'; describe('get42', () => { it('should return 42', async () => { diff --git a/static-environments/coverage-e2e-env/vite.config.ts b/e2e/plugin-coverage-e2e/__test-env__/vite.config.ts similarity index 100% rename from static-environments/coverage-e2e-env/vite.config.ts rename to e2e/plugin-coverage-e2e/__test-env__/vite.config.ts diff --git a/e2e/plugin-coverage-e2e/project.json b/e2e/plugin-coverage-e2e/project.json index 4c4f76881..14dd9ca93 100644 --- a/e2e/plugin-coverage-e2e/project.json +++ b/e2e/plugin-coverage-e2e/project.json @@ -13,12 +13,12 @@ }, "nxv-e2e": { "options": { - "environmentRoot": "static-environments/coverage-e2e-env" + "environmentRoot": "e2e/plugin-coverage-e2e/__test-env__" } }, "nxv-env-setup": { "options": { - "environmentRoot": "static-environments/coverage-e2e-env" + "environmentRoot": "e2e/plugin-coverage-e2e/__test-env__" } }, "e2e": { @@ -28,6 +28,6 @@ } } }, - "implicitDependencies": ["cli", "plugin-coverage", "coverage-e2e-env"], + "implicitDependencies": ["cli", "plugin-coverage"], "tags": ["scope:plugin", "type:e2e"] } diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 747fe0571..dd7081fa5 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -6,11 +6,11 @@ import { omitVariableReportData } from '@code-pushup/test-utils'; import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('collect report with coverage-plugin NPM package', () => { - const envRoot = 'static-environments/coverage-e2e-env'; - const baseDir = join(envRoot, '__tests__'); + const envRoot = 'e2e/plugin-coverage-e2e/__test-env__'; + const coverageDir = join(envRoot, '.code-pushup'); afterEach(async () => { - await teardownTestFolder(baseDir); + await teardownTestFolder(coverageDir); }); it('should run Code coverage plugin which collects passed results and creates report.json', async () => { diff --git a/e2e/plugin-coverage-e2e/tsconfig.test.json b/e2e/plugin-coverage-e2e/tsconfig.test.json index 10c7f79de..22ad6e52a 100644 --- a/e2e/plugin-coverage-e2e/tsconfig.test.json +++ b/e2e/plugin-coverage-e2e/tsconfig.test.json @@ -5,6 +5,7 @@ "types": ["vitest/globals", "vitest/importMeta", "vite/client", "node"], "target": "ES2020" }, + "exclude": [], "include": [ "vite.config.e2e.ts", "tests/**/*.e2e.test.ts", From ded72c012de5c3c189c4e3a399d680a3bbb756cf Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Nov 2024 18:36:40 +0100 Subject: [PATCH 10/16] refactor e2e env setup --- .../__test-env__/.gitignore | 3 -- .../__test-env__/project.json | 8 ---- .../basic-setup}/code-pushup.config.ts | 0 .../fixtures/basic-setup}/package.json | 4 -- .../fixtures/basic-setup}/src/index.mjs | 0 .../fixtures/basic-setup}/src/index.test.mjs | 0 .../fixtures/basic-setup}/vite.config.ts | 0 .../existing-report/code-pushup.config.ts} | 2 +- .../existing-report/coverage}/lcov.info | 0 e2e/plugin-coverage-e2e/project.json | 10 ----- .../tests/collect.e2e.test.ts | 42 +++++++++---------- 11 files changed, 22 insertions(+), 47 deletions(-) delete mode 100644 e2e/plugin-coverage-e2e/__test-env__/.gitignore delete mode 100644 e2e/plugin-coverage-e2e/__test-env__/project.json rename e2e/plugin-coverage-e2e/{__test-env__ => mocks/fixtures/basic-setup}/code-pushup.config.ts (100%) rename e2e/plugin-coverage-e2e/{__test-env__ => mocks/fixtures/basic-setup}/package.json (60%) rename e2e/plugin-coverage-e2e/{__test-env__ => mocks/fixtures/basic-setup}/src/index.mjs (100%) rename e2e/plugin-coverage-e2e/{__test-env__ => mocks/fixtures/basic-setup}/src/index.test.mjs (100%) rename e2e/plugin-coverage-e2e/{__test-env__ => mocks/fixtures/basic-setup}/vite.config.ts (100%) rename e2e/plugin-coverage-e2e/{__test-env__/code-pushup.existing-report.config.ts => mocks/fixtures/existing-report/code-pushup.config.ts} (89%) rename e2e/plugin-coverage-e2e/{__test-env__/mocks/fixtures => mocks/fixtures/existing-report/coverage}/lcov.info (100%) diff --git a/e2e/plugin-coverage-e2e/__test-env__/.gitignore b/e2e/plugin-coverage-e2e/__test-env__/.gitignore deleted file mode 100644 index 9e76e5c81..000000000 --- a/e2e/plugin-coverage-e2e/__test-env__/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage -node_modules -.code-pushup diff --git a/e2e/plugin-coverage-e2e/__test-env__/project.json b/e2e/plugin-coverage-e2e/__test-env__/project.json deleted file mode 100644 index 4a70f3435..000000000 --- a/e2e/plugin-coverage-e2e/__test-env__/project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "coverage-e2e-env", - "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "static-environments/coverage-e2e-env/src", - "projectType": "library", - "targets": {}, - "tags": ["scope:internal", "type:feature"] -} diff --git a/e2e/plugin-coverage-e2e/__test-env__/code-pushup.config.ts b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/code-pushup.config.ts similarity index 100% rename from e2e/plugin-coverage-e2e/__test-env__/code-pushup.config.ts rename to e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/code-pushup.config.ts diff --git a/e2e/plugin-coverage-e2e/__test-env__/package.json b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/package.json similarity index 60% rename from e2e/plugin-coverage-e2e/__test-env__/package.json rename to e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/package.json index ac964b1c9..61a96ca4c 100644 --- a/e2e/plugin-coverage-e2e/__test-env__/package.json +++ b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/package.json @@ -9,10 +9,6 @@ "author": "", "license": "ISC", "dependencies": { - "@code-pushup/core": "^0.54.0", - "@code-pushup/coverage-plugin": "^0.54.0", - "@code-pushup/models": "^0.54.0", - "@code-pushup/utils": "^0.54.0" }, "description": "" } diff --git a/e2e/plugin-coverage-e2e/__test-env__/src/index.mjs b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/src/index.mjs similarity index 100% rename from e2e/plugin-coverage-e2e/__test-env__/src/index.mjs rename to e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/src/index.mjs diff --git a/e2e/plugin-coverage-e2e/__test-env__/src/index.test.mjs b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/src/index.test.mjs similarity index 100% rename from e2e/plugin-coverage-e2e/__test-env__/src/index.test.mjs rename to e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/src/index.test.mjs diff --git a/e2e/plugin-coverage-e2e/__test-env__/vite.config.ts b/e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/vite.config.ts similarity index 100% rename from e2e/plugin-coverage-e2e/__test-env__/vite.config.ts rename to e2e/plugin-coverage-e2e/mocks/fixtures/basic-setup/vite.config.ts diff --git a/e2e/plugin-coverage-e2e/__test-env__/code-pushup.existing-report.config.ts b/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts similarity index 89% rename from e2e/plugin-coverage-e2e/__test-env__/code-pushup.existing-report.config.ts rename to e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts index 9f6fffbb8..d955bbba0 100644 --- a/e2e/plugin-coverage-e2e/__test-env__/code-pushup.existing-report.config.ts +++ b/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts @@ -5,7 +5,7 @@ import type { CoreConfig } from '@code-pushup/models'; export default { plugins: [ await coveragePlugin({ - reports: [join('mocks', 'fixtures', 'lcov.info')], + reports: [join('coverage', 'lcov.info')], }), ], categories: [ diff --git a/e2e/plugin-coverage-e2e/__test-env__/mocks/fixtures/lcov.info b/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/coverage/lcov.info similarity index 100% rename from e2e/plugin-coverage-e2e/__test-env__/mocks/fixtures/lcov.info rename to e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/coverage/lcov.info diff --git a/e2e/plugin-coverage-e2e/project.json b/e2e/plugin-coverage-e2e/project.json index 14dd9ca93..8a0932adf 100644 --- a/e2e/plugin-coverage-e2e/project.json +++ b/e2e/plugin-coverage-e2e/project.json @@ -11,16 +11,6 @@ "lintFilePatterns": ["e2e/plugin-coverage-e2e/**/*.ts"] } }, - "nxv-e2e": { - "options": { - "environmentRoot": "e2e/plugin-coverage-e2e/__test-env__" - } - }, - "nxv-env-setup": { - "options": { - "environmentRoot": "e2e/plugin-coverage-e2e/__test-env__" - } - }, "e2e": { "executor": "@nx/vite:test", "options": { diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index dd7081fa5..b5c285d44 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -1,36 +1,41 @@ +import { cp } from 'node:fs/promises'; import { join } from 'node:path'; -import { afterEach } from 'vitest'; +import { afterAll, afterEach, beforeAll } from 'vitest'; import { type Report, reportSchema } from '@code-pushup/models'; import { teardownTestFolder } from '@code-pushup/test-setup'; import { omitVariableReportData } from '@code-pushup/test-utils'; import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('collect report with coverage-plugin NPM package', () => { - const envRoot = 'e2e/plugin-coverage-e2e/__test-env__'; - const coverageDir = join(envRoot, '.code-pushup'); + const envRoot = 'tmp/e2e/plugin-coverage-e2e'; + const fixtureDir = join('e2e', 'plugin-coverage-e2e', 'mocks', 'fixtures'); + const basicDir = join(envRoot, 'basic-setup'); + const existingDir = join(envRoot, 'existing-setup'); + beforeAll(async () => { + await cp(fixtureDir, envRoot, { recursive: true }); + }); + afterAll(async () => { + await teardownTestFolder(join(basicDir)); + await teardownTestFolder(join(existingDir)); + }); afterEach(async () => { - await teardownTestFolder(coverageDir); + await teardownTestFolder(join(basicDir, '.code-pushup')); + await teardownTestFolder(join(existingDir, '.code-pushup')); }); it('should run Code coverage plugin which collects passed results and creates report.json', async () => { const { code, stderr } = await executeProcess({ command: 'npx', - args: [ - '@code-pushup/cli', - 'collect', - '--no-progress', - `--config=code-pushup.existing-report.config.ts`, - '--onlyPlugins=coverage', - ], - cwd: envRoot, + args: ['@code-pushup/cli', 'collect', '--no-progress'], + cwd: basicDir, }); expect(code).toBe(0); expect(stderr).toBe(''); const report = await readJsonFile( - join(envRoot, '.code-pushup', 'report.json'), + join(basicDir, '.code-pushup', 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); @@ -40,20 +45,15 @@ describe('collect report with coverage-plugin NPM package', () => { it('should run Code coverage plugin that runs coverage tool and creates report.json', async () => { const { code, stderr } = await executeProcess({ command: 'npx', - args: [ - '@code-pushup/cli', - 'collect', - '--no-progress', - '--onlyPlugins=coverage', - ], - cwd: envRoot, + args: ['@code-pushup/cli', 'collect', '--no-progress'], + cwd: existingDir, }); expect(code).toBe(0); expect(stderr).toBe(''); const report = await readJsonFile( - join(envRoot, '.code-pushup/report.json'), + join(existingDir, '.code-pushup', 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); From cb4e0f903e0160753f4e9be5e0965aa200e9df9a Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Nov 2024 18:40:08 +0100 Subject: [PATCH 11/16] cleanup env setup --- .../__snapshots__/collect.e2e.test.ts.snap | 164 +++++++++--------- .../tests/collect.e2e.test.ts | 2 +- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap index 610e3b0a3..d15a8626b 100644 --- a/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap +++ b/e2e/plugin-coverage-e2e/tests/__snapshots__/collect.e2e.test.ts.snap @@ -25,10 +25,20 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover "details": { "issues": [ { - "message": "Function untested is not called in any test case.", + "message": "Function formatReportScore is not called in any test case.", + "severity": "error", + "source": { + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/partly-covered/utils.ts", + "position": { + "startLine": 2, + }, + }, + }, + { + "message": "Function sortReport is not called in any test case.", "severity": "error", "source": { - "file": "static-environments/coverage-e2e-env/src/index.mjs", + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/not-covered/sorting.ts", "position": { "startLine": 1, }, @@ -36,67 +46,97 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover }, ], }, - "displayValue": "66.7 %", - "score": 0.6667, + "displayValue": "60 %", + "score": 0.6, "slug": "function-coverage", "title": "Function coverage", - "value": 66.66666666666666, + "value": 60, }, { "description": "Measures how many branches were executed after conditional statements in at least one test.", "details": { "issues": [ { - "message": "1st branch is not taken in any test case.", + "message": "2nd branch is not taken in any test case.", "severity": "error", "source": { - "file": "static-environments/coverage-e2e-env/src/index.mjs", + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/partly-covered/utils.ts", + "position": { + "startLine": 6, + }, + }, + }, + { + "message": "2nd branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/partly-covered/utils.ts", "position": { "startLine": 10, }, }, }, + { + "message": "1st branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/not-covered/sorting.ts", + "position": { + "startLine": 7, + }, + }, + }, + { + "message": "2nd branch is not taken in any test case.", + "severity": "error", + "source": { + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/not-covered/sorting.ts", + "position": { + "startLine": 7, + }, + }, + }, ], }, - "displayValue": "66.7 %", - "score": 0.6667, + "displayValue": "76.5 %", + "score": 0.7647, "slug": "branch-coverage", "title": "Branch coverage", - "value": 66.66666666666666, + "value": 76.47058823529412, }, { "description": "Measures how many lines of code were executed in at least one test.", "details": { "issues": [ { - "message": "Lines 2-3 are not covered in any test case.", + "message": "Lines 7-9 are not covered in any test case.", "severity": "warning", "source": { - "file": "static-environments/coverage-e2e-env/src/index.mjs", + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/partly-covered/utils.ts", "position": { - "endLine": 3, - "startLine": 2, + "endLine": 9, + "startLine": 7, }, }, }, { - "message": "Lines 11-12 are not covered in any test case.", + "message": "Lines 1-5 are not covered in any test case.", "severity": "warning", "source": { - "file": "static-environments/coverage-e2e-env/src/index.mjs", + "file": "tmp/e2e/plugin-coverage-e2e/existing-report/src/lib/not-covered/sorting.ts", "position": { - "endLine": 12, - "startLine": 11, + "endLine": 5, + "startLine": 1, }, }, }, ], }, - "displayValue": "73.3 %", - "score": 0.7333, + "displayValue": "68 %", + "score": 0.68, "slug": "line-coverage", "title": "Line coverage", - "value": 73.33333333333333, + "value": 68, }, ], "description": "Official Code PushUp code coverage plugin.", @@ -156,20 +196,10 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover "details": { "issues": [ { - "message": "Function formatReportScore is not called in any test case.", - "severity": "error", - "source": { - "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", - "position": { - "startLine": 2, - }, - }, - }, - { - "message": "Function sortReport is not called in any test case.", + "message": "Function untested is not called in any test case.", "severity": "error", "source": { - "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "file": "tmp/e2e/plugin-coverage-e2e/basic-setup/src/index.mjs", "position": { "startLine": 1, }, @@ -177,97 +207,67 @@ exports[`collect report with coverage-plugin NPM package > should run Code cover }, ], }, - "displayValue": "60 %", - "score": 0.6, + "displayValue": "66.7 %", + "score": 0.6667, "slug": "function-coverage", "title": "Function coverage", - "value": 60, + "value": 66.66666666666666, }, { "description": "Measures how many branches were executed after conditional statements in at least one test.", "details": { "issues": [ - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", - "position": { - "startLine": 6, - }, - }, - }, - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", - "position": { - "startLine": 10, - }, - }, - }, { "message": "1st branch is not taken in any test case.", "severity": "error", "source": { - "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "file": "tmp/e2e/plugin-coverage-e2e/basic-setup/src/index.mjs", "position": { - "startLine": 7, - }, - }, - }, - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", - "position": { - "startLine": 7, + "startLine": 10, }, }, }, ], }, - "displayValue": "76.5 %", - "score": 0.7647, + "displayValue": "66.7 %", + "score": 0.6667, "slug": "branch-coverage", "title": "Branch coverage", - "value": 76.47058823529412, + "value": 66.66666666666666, }, { "description": "Measures how many lines of code were executed in at least one test.", "details": { "issues": [ { - "message": "Lines 7-9 are not covered in any test case.", + "message": "Lines 2-3 are not covered in any test case.", "severity": "warning", "source": { - "file": "static-environments/coverage-e2e-env/src/lib/partly-covered/utils.ts", + "file": "tmp/e2e/plugin-coverage-e2e/basic-setup/src/index.mjs", "position": { - "endLine": 9, - "startLine": 7, + "endLine": 3, + "startLine": 2, }, }, }, { - "message": "Lines 1-5 are not covered in any test case.", + "message": "Lines 11-12 are not covered in any test case.", "severity": "warning", "source": { - "file": "static-environments/coverage-e2e-env/src/lib/not-covered/sorting.ts", + "file": "tmp/e2e/plugin-coverage-e2e/basic-setup/src/index.mjs", "position": { - "endLine": 5, - "startLine": 1, + "endLine": 12, + "startLine": 11, }, }, }, ], }, - "displayValue": "68 %", - "score": 0.68, + "displayValue": "73.3 %", + "score": 0.7333, "slug": "line-coverage", "title": "Line coverage", - "value": 68, + "value": 73.33333333333333, }, ], "description": "Official Code PushUp code coverage plugin.", diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index b5c285d44..2a7fa6a08 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -10,7 +10,7 @@ describe('collect report with coverage-plugin NPM package', () => { const envRoot = 'tmp/e2e/plugin-coverage-e2e'; const fixtureDir = join('e2e', 'plugin-coverage-e2e', 'mocks', 'fixtures'); const basicDir = join(envRoot, 'basic-setup'); - const existingDir = join(envRoot, 'existing-setup'); + const existingDir = join(envRoot, 'existing-report'); beforeAll(async () => { await cp(fixtureDir, envRoot, { recursive: true }); From 22a6908554090ad5286b33d3add7110af477f04b Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Nov 2024 18:45:17 +0100 Subject: [PATCH 12/16] fix snapshots --- .../__snapshots__/collect.e2e.test.ts.snap | 420 ------------------ 1 file changed, 420 deletions(-) diff --git a/e2e/cli-e2e/tests/__snapshots__/collect.e2e.test.ts.snap b/e2e/cli-e2e/tests/__snapshots__/collect.e2e.test.ts.snap index 47a9e0f07..35945e037 100644 --- a/e2e/cli-e2e/tests/__snapshots__/collect.e2e.test.ts.snap +++ b/e2e/cli-e2e/tests/__snapshots__/collect.e2e.test.ts.snap @@ -1,425 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`CLI collect > should run Code coverage plugin that runs coverage tool and creates report.json 1`] = ` -{ - "categories": [ - { - "refs": [ - { - "plugin": "coverage", - "slug": "coverage", - "type": "group", - "weight": 1, - }, - ], - "slug": "code-coverage", - "title": "Code coverage", - }, - ], - "packageName": "@code-pushup/core", - "plugins": [ - { - "audits": [ - { - "description": "Measures how many functions were called in at least one test.", - "details": { - "issues": [ - { - "message": "Function onSubmit is not called in any test case.", - "severity": "error", - "source": { - "file": "examples/react-todos-app/src/components/CreateTodo.jsx", - "position": { - "startLine": 13, - }, - }, - }, - { - "message": "Function onInput is not called in any test case.", - "severity": "error", - "source": { - "file": "examples/react-todos-app/src/components/CreateTodo.jsx", - "position": { - "startLine": 21, - }, - }, - }, - { - "message": "Function onInput is not called in any test case.", - "severity": "error", - "source": { - "file": "examples/react-todos-app/src/components/TodoFilter.jsx", - "position": { - "startLine": 9, - }, - }, - }, - { - "message": "Function onChange is not called in any test case.", - "severity": "error", - "source": { - "file": "examples/react-todos-app/src/components/TodoFilter.jsx", - "position": { - "startLine": 17, - }, - }, - }, - ], - }, - "displayValue": "55.6 %", - "score": 0.5556, - "slug": "function-coverage", - "title": "Function coverage", - "value": 55.55555555555556, - }, - { - "description": "Measures how many branches were executed after conditional statements in at least one test.", - "details": { - "issues": [ - { - "message": "1st branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "examples/react-todos-app/src/index.jsx", - "position": { - "startLine": 1, - }, - }, - }, - ], - }, - "displayValue": "87.5 %", - "score": 0.875, - "slug": "branch-coverage", - "title": "Branch coverage", - "value": 87.5, - }, - { - "description": "Measures how many lines of code were executed in at least one test.", - "details": { - "issues": [ - { - "message": "Lines 1-6 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/index.jsx", - "position": { - "endLine": 6, - "startLine": 1, - }, - }, - }, - { - "message": "Lines 14-17 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/components/CreateTodo.jsx", - "position": { - "endLine": 17, - "startLine": 14, - }, - }, - }, - { - "message": "Lines 22-23 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/components/CreateTodo.jsx", - "position": { - "endLine": 23, - "startLine": 22, - }, - }, - }, - { - "message": "Lines 10-11 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/components/TodoFilter.jsx", - "position": { - "endLine": 11, - "startLine": 10, - }, - }, - }, - { - "message": "Lines 18-19 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/components/TodoFilter.jsx", - "position": { - "endLine": 19, - "startLine": 18, - }, - }, - }, - { - "message": "Lines 7-28 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/components/TodoList.jsx", - "position": { - "endLine": 28, - "startLine": 7, - }, - }, - }, - { - "message": "Lines 12-13 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/hooks/useTodos.js", - "position": { - "endLine": 13, - "startLine": 12, - }, - }, - }, - { - "message": "Lines 18-37 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/hooks/useTodos.js", - "position": { - "endLine": 37, - "startLine": 18, - }, - }, - }, - { - "message": "Lines 41-45 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/hooks/useTodos.js", - "position": { - "endLine": 45, - "startLine": 41, - }, - }, - }, - { - "message": "Lines 54-60 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "examples/react-todos-app/src/hooks/useTodos.js", - "position": { - "endLine": 60, - "startLine": 54, - }, - }, - }, - ], - }, - "displayValue": "62.1 %", - "score": 0.6211, - "slug": "line-coverage", - "title": "Line coverage", - "value": 62.10526315789474, - }, - ], - "description": "Official Code PushUp code coverage plugin.", - "docsUrl": "https://www.npmjs.com/package/@code-pushup/coverage-plugin/", - "groups": [ - { - "description": "Group containing all defined coverage types as audits.", - "refs": [ - { - "slug": "function-coverage", - "weight": 6, - }, - { - "slug": "branch-coverage", - "weight": 3, - }, - { - "slug": "line-coverage", - "weight": 1, - }, - ], - "slug": "coverage", - "title": "Code coverage metrics", - }, - ], - "icon": "folder-coverage-open", - "packageName": "@code-pushup/coverage-plugin", - "slug": "coverage", - "title": "Code coverage", - }, - ], -} -`; - -exports[`CLI collect > should run Code coverage plugin which collects passed results and creates report.json 1`] = ` -{ - "categories": [ - { - "refs": [ - { - "plugin": "coverage", - "slug": "coverage", - "type": "group", - "weight": 1, - }, - ], - "slug": "code-coverage", - "title": "Code coverage", - }, - ], - "packageName": "@code-pushup/core", - "plugins": [ - { - "audits": [ - { - "description": "Measures how many functions were called in at least one test.", - "details": { - "issues": [ - { - "message": "Function formatReportScore is not called in any test case.", - "severity": "error", - "source": { - "file": "src/lib/partly-covered/utils.ts", - "position": { - "startLine": 2, - }, - }, - }, - { - "message": "Function sortReport is not called in any test case.", - "severity": "error", - "source": { - "file": "src/lib/not-covered/sorting.ts", - "position": { - "startLine": 1, - }, - }, - }, - ], - }, - "displayValue": "60 %", - "score": 0.6, - "slug": "function-coverage", - "title": "Function coverage", - "value": 60, - }, - { - "description": "Measures how many branches were executed after conditional statements in at least one test.", - "details": { - "issues": [ - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "src/lib/partly-covered/utils.ts", - "position": { - "startLine": 6, - }, - }, - }, - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "src/lib/partly-covered/utils.ts", - "position": { - "startLine": 10, - }, - }, - }, - { - "message": "1st branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "src/lib/not-covered/sorting.ts", - "position": { - "startLine": 7, - }, - }, - }, - { - "message": "2nd branch is not taken in any test case.", - "severity": "error", - "source": { - "file": "src/lib/not-covered/sorting.ts", - "position": { - "startLine": 7, - }, - }, - }, - ], - }, - "displayValue": "76.5 %", - "score": 0.7647, - "slug": "branch-coverage", - "title": "Branch coverage", - "value": 76.47058823529412, - }, - { - "description": "Measures how many lines of code were executed in at least one test.", - "details": { - "issues": [ - { - "message": "Lines 7-9 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "src/lib/partly-covered/utils.ts", - "position": { - "endLine": 9, - "startLine": 7, - }, - }, - }, - { - "message": "Lines 1-5 are not covered in any test case.", - "severity": "warning", - "source": { - "file": "src/lib/not-covered/sorting.ts", - "position": { - "endLine": 5, - "startLine": 1, - }, - }, - }, - ], - }, - "displayValue": "68 %", - "score": 0.68, - "slug": "line-coverage", - "title": "Line coverage", - "value": 68, - }, - ], - "description": "Official Code PushUp code coverage plugin.", - "docsUrl": "https://www.npmjs.com/package/@code-pushup/coverage-plugin/", - "groups": [ - { - "description": "Group containing all defined coverage types as audits.", - "refs": [ - { - "slug": "function-coverage", - "weight": 6, - }, - { - "slug": "branch-coverage", - "weight": 3, - }, - { - "slug": "line-coverage", - "weight": 1, - }, - ], - "slug": "coverage", - "title": "Code coverage metrics", - }, - ], - "icon": "folder-coverage-open", - "packageName": "@code-pushup/coverage-plugin", - "slug": "coverage", - "title": "Code coverage", - }, - ], -} -`; - exports[`CLI collect > should run ESLint plugin and create report.json 1`] = ` { "categories": [ From 0a477cbb6469f316be39eae23b5cedc8a9394d98 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Nov 2024 18:50:25 +0100 Subject: [PATCH 13/16] remove check for warning and error --- e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 2a7fa6a08..c4e387910 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -25,14 +25,13 @@ describe('collect report with coverage-plugin NPM package', () => { }); it('should run Code coverage plugin which collects passed results and creates report.json', async () => { - const { code, stderr } = await executeProcess({ + const { code } = await executeProcess({ command: 'npx', args: ['@code-pushup/cli', 'collect', '--no-progress'], cwd: basicDir, }); expect(code).toBe(0); - expect(stderr).toBe(''); const report = await readJsonFile( join(basicDir, '.code-pushup', 'report.json'), @@ -43,14 +42,13 @@ describe('collect report with coverage-plugin NPM package', () => { }); it('should run Code coverage plugin that runs coverage tool and creates report.json', async () => { - const { code, stderr } = await executeProcess({ + const { code } = await executeProcess({ command: 'npx', args: ['@code-pushup/cli', 'collect', '--no-progress'], cwd: existingDir, }); expect(code).toBe(0); - expect(stderr).toBe(''); const report = await readJsonFile( join(existingDir, '.code-pushup', 'report.json'), From 1b066e0a2f0826fbded3dd459d0856b3c7f351fb Mon Sep 17 00:00:00 2001 From: Michael Hladky <10064416+BioPhoton@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:18:13 +0100 Subject: [PATCH 14/16] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8ad36da1..af4732928 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,7 +120,7 @@ jobs: - name: Install dependencies run: npm ci - name: E2E test affected projects - run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 --verbose + run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 - name: E2E test cli-e2e project (due to bugs in the setup it has to run last :( ) run: npx nx run cli-e2e:e2e-old From d165dddb44cd5d32107e984c99803d0641c02744 Mon Sep 17 00:00:00 2001 From: Michael Hladky <10064416+BioPhoton@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:18:26 +0100 Subject: [PATCH 15/16] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index af4732928..845def216 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,7 +120,7 @@ jobs: - name: Install dependencies run: npm ci - name: E2E test affected projects - run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 + run: npx nx affected -t nxv-e2e --exclude cli-e2e --parallel=1 - name: E2E test cli-e2e project (due to bugs in the setup it has to run last :( ) run: npx nx run cli-e2e:e2e-old From 127608e95788b73ed6bbbb3dcfb2c27e1326bde1 Mon Sep 17 00:00:00 2001 From: Michael Hladky <10064416+BioPhoton@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:01:36 +0100 Subject: [PATCH 16/16] Update e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matěj Chalk <34691111+matejchalk@users.noreply.github.com> --- e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index c4e387910..673c56d63 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -16,8 +16,8 @@ describe('collect report with coverage-plugin NPM package', () => { await cp(fixtureDir, envRoot, { recursive: true }); }); afterAll(async () => { - await teardownTestFolder(join(basicDir)); - await teardownTestFolder(join(existingDir)); + await teardownTestFolder(basicDir); + await teardownTestFolder(existingDir); }); afterEach(async () => { await teardownTestFolder(join(basicDir, '.code-pushup'));