From c6ec8d17a4eca28a60e976771cd2c8b4dd09dddc Mon Sep 17 00:00:00 2001 From: Josh Johanning Date: Fri, 7 Nov 2025 15:15:16 -0600 Subject: [PATCH 1/2] chore: empty commit to sync branch From 2a9db9a3181e43475e19f3b25497a588f9c21b9c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:22:20 +0000 Subject: [PATCH 2/2] feat: validate that at least one check is enabled Add validation to ensure at least one of 'check-commits' or 'check-pull-request' is enabled. If both are set to false, the action will fail with a clear error message. Changes: - Add validation check in src/index.js (lines 42-48) - Add 4 comprehensive test cases in __tests__/index.test.js - All 55 JavaScript tests + 29 bash tests passing Co-authored-by: joshjohanning <19912012+joshjohanning@users.noreply.github.com> --- __tests__/index.test.js | 78 +++++++++++++++++++++++++++++++++++++++++ src/index.js | 8 +++++ 2 files changed, 86 insertions(+) diff --git a/__tests__/index.test.js b/__tests__/index.test.js index c6f7f94..2a3e2ef 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -128,6 +128,84 @@ describe('Azure DevOps Commit Validator', () => { // Restore context mockContext.payload.pull_request = originalPR; }); + + it('should fail if both check-commits and check-pull-request are false', async () => { + mockGetInput.mockImplementation(name => { + if (name === 'check-commits') return 'false'; + if (name === 'check-pull-request') return 'false'; + if (name === 'github-token') return 'github-token'; + return 'false'; + }); + + await run(); + + expect(mockSetFailed).toHaveBeenCalledWith( + "At least one of 'check-commits' or 'check-pull-request' must be set to true. Both are currently set to false." + ); + }); + + it('should pass when only check-commits is enabled', async () => { + mockGetInput.mockImplementation(name => { + if (name === 'check-commits') return 'true'; + if (name === 'check-pull-request') return 'false'; + if (name === 'github-token') return 'github-token'; + if (name === 'fail-if-missing-workitem-commit-link') return 'false'; + return 'false'; + }); + + mockOctokit.rest.pulls.listCommits.mockResolvedValue({ + data: [] + }); + + await run(); + + expect(mockSetFailed).not.toHaveBeenCalled(); + }); + + it('should pass when only check-pull-request is enabled', async () => { + mockGetInput.mockImplementation(name => { + if (name === 'check-commits') return 'false'; + if (name === 'check-pull-request') return 'true'; + if (name === 'github-token') return 'github-token'; + return 'false'; + }); + + mockOctokit.rest.pulls.get.mockResolvedValue({ + data: { + title: 'Test PR AB#123', + body: 'Test body' + } + }); + + await run(); + + expect(mockSetFailed).not.toHaveBeenCalled(); + }); + + it('should pass when both checks are enabled', async () => { + mockGetInput.mockImplementation(name => { + if (name === 'check-commits') return 'true'; + if (name === 'check-pull-request') return 'true'; + if (name === 'github-token') return 'github-token'; + if (name === 'fail-if-missing-workitem-commit-link') return 'false'; + return 'false'; + }); + + mockOctokit.rest.pulls.listCommits.mockResolvedValue({ + data: [] + }); + + mockOctokit.rest.pulls.get.mockResolvedValue({ + data: { + title: 'Test PR AB#123', + body: 'Test body' + } + }); + + await run(); + + expect(mockSetFailed).not.toHaveBeenCalled(); + }); }); describe('Commit validation', () => { diff --git a/src/index.js b/src/index.js index fa41214..fd7587a 100644 --- a/src/index.js +++ b/src/index.js @@ -39,6 +39,14 @@ export async function run() { const commentOnFailure = core.getInput('comment-on-failure') === 'true'; const validateWorkItemExistsFlag = core.getInput('validate-work-item-exists') === 'true'; + // Validate that at least one check is enabled + if (!checkPullRequest && !checkCommits) { + core.setFailed( + "At least one of 'check-commits' or 'check-pull-request' must be set to true. Both are currently set to false." + ); + return; + } + // Get context const context = github.context; const pullNumber = context.payload.pull_request?.number;