diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a588bd2..572223a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,7 +47,7 @@ jobs: - name: Check coverage run: | - if [ -f ./coverage/clover.xml ]; then + if [ -f ./coverage/clover.xml ] && [ ! -f ./coverage/allSkipped.txt ]; then echo "RUN_CODECOV=true" >> $GITHUB_ENV else echo "RUN_CODECOV=false" >> $GITHUB_ENV @@ -217,7 +217,7 @@ jobs: - name: Check coverage run: | - if [ -f ./coverage/clover.xml ]; then + if [ -f ./coverage/clover.xml ] && [ ! -f ./coverage/allSkipped.txt ]; then echo "RUN_CODECOV=true" >> $GITHUB_ENV else echo "RUN_CODECOV=false" >> $GITHUB_ENV diff --git a/__tests__/.setup/skipped-reporter.d.mts b/__tests__/.setup/skipped-reporter.d.mts new file mode 100644 index 0000000..2e48569 --- /dev/null +++ b/__tests__/.setup/skipped-reporter.d.mts @@ -0,0 +1,19 @@ +/** + * Copyright 2026 actions-toolkit authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type {Reporter} from 'vitest/node'; + +export declare const vitestAllSkippedReporter: () => Reporter; diff --git a/__tests__/.setup/skipped-reporter.mjs b/__tests__/.setup/skipped-reporter.mjs new file mode 100644 index 0000000..1ebb6ae --- /dev/null +++ b/__tests__/.setup/skipped-reporter.mjs @@ -0,0 +1,59 @@ +/** + * Copyright 2026 actions-toolkit authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fs from 'node:fs'; +import path from 'node:path'; + +export const vitestAllSkippedReporter = () => { + let vitest; + let hasExecutedTest; + let hasAnyCollectedTest; + + const getFlagPath = () => { + const reportsDirectory = vitest?.config?.coverage?.reportsDirectory ?? 'coverage'; + return path.join(reportsDirectory, 'allSkipped.txt'); + }; + + return { + onInit(ctx) { + vitest = ctx; + hasExecutedTest = false; + hasAnyCollectedTest = false; + }, + onTestCaseReady() { + hasAnyCollectedTest = true; + }, + onTestCaseResult(testCase) { + const state = testCase.result()?.state; + if (state === 'passed' || state === 'failed') { + hasExecutedTest = true; + } + }, + onTestRunEnd() { + if (!vitest?.config?.coverage?.enabled) { + return; + } + const allSkipped = hasAnyCollectedTest && !hasExecutedTest; + const flagPath = getFlagPath(); + if (allSkipped) { + fs.mkdirSync(path.dirname(flagPath), {recursive: true}); + fs.writeFileSync(flagPath, ''); + } else if (fs.existsSync(flagPath)) { + fs.rmSync(flagPath); + } + } + }; +}; diff --git a/vitest.config.itg.ts b/vitest.config.itg.ts index df8312a..a1f02d6 100644 --- a/vitest.config.itg.ts +++ b/vitest.config.itg.ts @@ -15,6 +15,7 @@ */ import {defineConfig} from 'vitest/config'; +import {vitestAllSkippedReporter} from './__tests__/.setup/skipped-reporter.mjs'; export default defineConfig({ test: { @@ -22,11 +23,12 @@ export default defineConfig({ environment: 'node', include: ['**/*.test.itg.ts'], testTimeout: 1800000, + reporters: ['default', vitestAllSkippedReporter()], coverage: { provider: 'v8', reporter: ['clover'], include: ['src/**/*.ts'], - exclude: ['src/**/index.ts'] + exclude: ['src/**/index.ts', '__tests__/**', 'lib/**'] } } }); diff --git a/vitest.config.ts b/vitest.config.ts index 9a86010..51538c2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -15,6 +15,7 @@ */ import {defineConfig} from 'vitest/config'; +import {vitestAllSkippedReporter} from './__tests__/.setup/skipped-reporter.mjs'; export default defineConfig({ test: { @@ -22,11 +23,12 @@ export default defineConfig({ environment: 'node', setupFiles: ['./__tests__/.setup/setup.unit.ts'], include: ['**/*.test.ts'], + reporters: ['default', vitestAllSkippedReporter()], coverage: { provider: 'v8', reporter: ['clover'], include: ['src/**/*.ts'], - exclude: ['src/**/index.ts'] + exclude: ['src/**/index.ts', '__tests__/**', 'lib/**'] } } });