import test from "ava"; import { resolveToolsInput } from "../config/resolve-tools-input"; import { RepositoryPropertyName } from "../feature-flags/properties"; import type { RepositoryProperties } from "../feature-flags/properties"; import { getRecordingLogger, LoggedMessage, setupTests, } from "../testing-utils"; setupTests(test); test("resolveToolsInput returns undefined when no tools input or repository property is set", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const result = resolveToolsInput(undefined, true, {}, logger); t.is(result, undefined); t.is(loggedMessages.length, 0); }); test("resolveToolsInput returns workflow input when only workflow input is provided", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const result = resolveToolsInput("latest", true, {}, logger); t.is(result, "latest"); t.is(loggedMessages.length, 1); t.is( loggedMessages[0].message, "Setting tools: latest based on workflow input.", ); }); test("resolveToolsInput returns repository property when only repository property is provided", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const repositoryProperties: RepositoryProperties = { [RepositoryPropertyName.TOOLS]: "toolcache", }; const result = resolveToolsInput( undefined, true, repositoryProperties, logger, ); t.is(result, "toolcache"); t.is(loggedMessages.length, 1); t.is( loggedMessages[0].message, "Setting tools: toolcache based on the 'github-codeql-tools' repository property.", ); }); test("resolveToolsInput prioritizes workflow input over repository property", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const repositoryProperties: RepositoryProperties = { [RepositoryPropertyName.TOOLS]: "toolcache", }; const result = resolveToolsInput( "nightly", true, repositoryProperties, logger, ); t.is(result, "nightly"); t.is(loggedMessages.length, 1); t.is( loggedMessages[0].message, "Setting tools: nightly based on workflow input.", ); }); test("resolveToolsInput treats empty string workflow input as not set", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const repositoryProperties: RepositoryProperties = { [RepositoryPropertyName.TOOLS]: "toolcache", }; const result = resolveToolsInput("", true, repositoryProperties, logger); t.is(result, "toolcache"); t.is(loggedMessages.length, 1); t.is( loggedMessages[0].message, "Setting tools: toolcache based on the 'github-codeql-tools' repository property.", ); }); test("resolveToolsInput returns undefined when repository property is undefined", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const repositoryProperties: RepositoryProperties = { [RepositoryPropertyName.TOOLS]: undefined, }; const result = resolveToolsInput( undefined, true, repositoryProperties, logger, ); t.is(result, undefined); t.is(loggedMessages.length, 0); }); test("resolveToolsInput returns repository property when fallback is disabled", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const repositoryProperties: RepositoryProperties = { [RepositoryPropertyName.TOOLS]: "toolcache", }; const result = resolveToolsInput( undefined, false, repositoryProperties, logger, ); t.is(result, "toolcache"); t.is(loggedMessages.length, 1); t.is( loggedMessages[0].message, "Setting tools: toolcache based on the 'github-codeql-tools' repository property.", ); }); test("resolveToolsInput does not log when fallback is disabled and repository property is not set", (t) => { const loggedMessages: LoggedMessage[] = []; const logger = getRecordingLogger(loggedMessages); const result = resolveToolsInput(undefined, false, {}, logger); t.is(result, undefined); t.is(loggedMessages.length, 0); });