From bc93b04b0ca361d2da9e6dece7b00c0bf4d93eb2 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 17 Oct 2025 11:43:00 +0100 Subject: [PATCH] Add `initAnalysisKinds` for `analysis-kinds` enablement logic --- src/analyses.test.ts | 33 ++++++++++++++++++++++++++++++++ src/analyses.ts | 45 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/analyses.test.ts b/src/analyses.test.ts index 2c314c2c1..e48cc47d5 100644 --- a/src/analyses.test.ts +++ b/src/analyses.test.ts @@ -1,12 +1,19 @@ import test from "ava"; +import * as sinon from "sinon"; +import * as actionsUtil from "./actions-util"; import { AnalysisKind, + initAnalysisKinds, parseAnalysisKinds, supportedAnalysisKinds, } from "./analyses"; +import { getRunnerLogger } from "./logging"; +import { setupTests } from "./testing-utils"; import { ConfigurationError } from "./util"; +setupTests(test); + test("All known analysis kinds can be parsed successfully", async (t) => { for (const analysisKind of supportedAnalysisKinds) { t.deepEqual(await parseAnalysisKinds(analysisKind), [analysisKind]); @@ -34,3 +41,29 @@ test("Parsing analysis kinds requires at least one analysis kind", async (t) => instanceOf: ConfigurationError, }); }); + +test("initAnalysisKinds - returns expected analysis kinds for `analysis-kinds` input", async (t) => { + const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); + requiredInputStub + .withArgs("analysis-kinds") + .returns("code-scanning,code-quality"); + const result = await initAnalysisKinds(getRunnerLogger(true)); + t.assert(result.includes(AnalysisKind.CodeScanning)); + t.assert(result.includes(AnalysisKind.CodeQuality)); +}); + +test("initAnalysisKinds - includes `code-quality` when deprecated `quality-queries` input is used", async (t) => { + const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); + requiredInputStub.withArgs("analysis-kinds").returns("code-scanning"); + const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput"); + optionalInputStub.withArgs("quality-queries").returns("code-quality"); + const result = await initAnalysisKinds(getRunnerLogger(true)); + t.assert(result.includes(AnalysisKind.CodeScanning)); + t.assert(result.includes(AnalysisKind.CodeQuality)); +}); + +test("initAnalysisKinds - throws if `analysis-kinds` input is invalid", async (t) => { + const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); + requiredInputStub.withArgs("analysis-kinds").returns("no-such-thing"); + await t.throwsAsync(initAnalysisKinds(getRunnerLogger(true))); +}); diff --git a/src/analyses.ts b/src/analyses.ts index 7cac51a34..2c5d20b11 100644 --- a/src/analyses.ts +++ b/src/analyses.ts @@ -1,4 +1,8 @@ -import { fixCodeQualityCategory } from "./actions-util"; +import { + fixCodeQualityCategory, + getOptionalInput, + getRequiredInput, +} from "./actions-util"; import { Logger } from "./logging"; import { ConfigurationError } from "./util"; @@ -41,6 +45,45 @@ export async function parseAnalysisKinds( ); } +/** + * Initialises the analysis kinds for the analysis based on the `analysis-kinds` input. + * This function will also use the deprecated `quality-queries` input as an indicator to enable `code-quality`. + * If the `analysis-kinds` input cannot be parsed, a `ConfigurationError` is thrown. + * + * @param logger The logger to use. + * @returns The array of enabled analysis kinds. + * @throws A `ConfigurationError` if the `analysis-kinds` input cannot be parsed. + */ +export async function initAnalysisKinds( + logger: Logger, +): Promise { + const analysisKinds = await parseAnalysisKinds( + getRequiredInput("analysis-kinds"), + ); + + // Warn that `quality-queries` is deprecated if there is an argument for it. + const qualityQueriesInput = getOptionalInput("quality-queries"); + + if (qualityQueriesInput !== undefined) { + logger.warning( + "The `quality-queries` input is deprecated and will be removed in a future version of the CodeQL Action. " + + "Use the `analysis-kinds` input to configure different analysis kinds instead.", + ); + } + + // For backwards compatibility, add Code Quality to the enabled analysis kinds + // if an input to `quality-queries` was specified. We should remove this once + // `quality-queries` is no longer used. + if ( + !analysisKinds.includes(AnalysisKind.CodeQuality) && + qualityQueriesInput !== undefined + ) { + analysisKinds.push(AnalysisKind.CodeQuality); + } + + return analysisKinds; +} + /** The queries to use for Code Quality analyses. */ export const codeQualityQueries: string[] = ["code-quality"];