Skip to content

Commit fb60566

Browse files
committed
Missing files
1 parent 063bb8b commit fb60566

2 files changed

Lines changed: 199 additions & 0 deletions

File tree

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import test from "ava";
2+
3+
import { resolveToolsInput } from "../config/resolve-tools-input";
4+
import { RepositoryPropertyName } from "../feature-flags/properties";
5+
import type { RepositoryProperties } from "../feature-flags/properties";
6+
import {
7+
getRecordingLogger,
8+
LoggedMessage,
9+
setupTests,
10+
} from "../testing-utils";
11+
12+
setupTests(test);
13+
14+
test("resolveToolsInput returns undefined when no tools input or repository property is set", (t) => {
15+
const loggedMessages: LoggedMessage[] = [];
16+
const logger = getRecordingLogger(loggedMessages);
17+
18+
const result = resolveToolsInput(undefined, true, {}, logger);
19+
20+
t.is(result, undefined);
21+
t.is(loggedMessages.length, 0);
22+
});
23+
24+
test("resolveToolsInput returns workflow input when only workflow input is provided", (t) => {
25+
const loggedMessages: LoggedMessage[] = [];
26+
const logger = getRecordingLogger(loggedMessages);
27+
28+
const result = resolveToolsInput("latest", true, {}, logger);
29+
30+
t.is(result, "latest");
31+
t.is(loggedMessages.length, 1);
32+
t.is(
33+
loggedMessages[0].message,
34+
"Setting tools: latest based on workflow input.",
35+
);
36+
});
37+
38+
test("resolveToolsInput returns repository property when only repository property is provided", (t) => {
39+
const loggedMessages: LoggedMessage[] = [];
40+
const logger = getRecordingLogger(loggedMessages);
41+
42+
const repositoryProperties: RepositoryProperties = {
43+
[RepositoryPropertyName.TOOLS]: "toolcache",
44+
};
45+
const result = resolveToolsInput(
46+
undefined,
47+
true,
48+
repositoryProperties,
49+
logger,
50+
);
51+
52+
t.is(result, "toolcache");
53+
t.is(loggedMessages.length, 1);
54+
t.is(
55+
loggedMessages[0].message,
56+
"Setting tools: toolcache based on the 'github-codeql-tools' repository property.",
57+
);
58+
});
59+
60+
test("resolveToolsInput prioritizes workflow input over repository property", (t) => {
61+
const loggedMessages: LoggedMessage[] = [];
62+
const logger = getRecordingLogger(loggedMessages);
63+
64+
const repositoryProperties: RepositoryProperties = {
65+
[RepositoryPropertyName.TOOLS]: "toolcache",
66+
};
67+
const result = resolveToolsInput(
68+
"nightly",
69+
true,
70+
repositoryProperties,
71+
logger,
72+
);
73+
74+
t.is(result, "nightly");
75+
t.is(loggedMessages.length, 1);
76+
t.is(
77+
loggedMessages[0].message,
78+
"Setting tools: nightly based on workflow input.",
79+
);
80+
});
81+
82+
test("resolveToolsInput treats empty string workflow input as not set", (t) => {
83+
const loggedMessages: LoggedMessage[] = [];
84+
const logger = getRecordingLogger(loggedMessages);
85+
86+
const repositoryProperties: RepositoryProperties = {
87+
[RepositoryPropertyName.TOOLS]: "toolcache",
88+
};
89+
const result = resolveToolsInput("", true, repositoryProperties, logger);
90+
91+
t.is(result, "toolcache");
92+
t.is(loggedMessages.length, 1);
93+
t.is(
94+
loggedMessages[0].message,
95+
"Setting tools: toolcache based on the 'github-codeql-tools' repository property.",
96+
);
97+
});
98+
99+
test("resolveToolsInput returns undefined when repository property is undefined", (t) => {
100+
const loggedMessages: LoggedMessage[] = [];
101+
const logger = getRecordingLogger(loggedMessages);
102+
103+
const repositoryProperties: RepositoryProperties = {
104+
[RepositoryPropertyName.TOOLS]: undefined,
105+
};
106+
const result = resolveToolsInput(
107+
undefined,
108+
true,
109+
repositoryProperties,
110+
logger,
111+
);
112+
113+
t.is(result, undefined);
114+
t.is(loggedMessages.length, 0);
115+
});
116+
117+
test("resolveToolsInput ignores repository property when fallback is disabled", (t) => {
118+
const loggedMessages: LoggedMessage[] = [];
119+
const logger = getRecordingLogger(loggedMessages);
120+
121+
const repositoryProperties: RepositoryProperties = {
122+
[RepositoryPropertyName.TOOLS]: "toolcache",
123+
};
124+
const result = resolveToolsInput(
125+
undefined,
126+
false,
127+
repositoryProperties,
128+
logger,
129+
);
130+
131+
t.is(result, undefined);
132+
t.is(loggedMessages.length, 1);
133+
const fallbackDisabledMessage = String(loggedMessages[0].message);
134+
t.true(
135+
/Ignoring 'github-codeql-tools' repository property because it is only supported for dynamic workflows\./.test(
136+
fallbackDisabledMessage,
137+
),
138+
);
139+
});
140+
141+
test("resolveToolsInput does not log when fallback is disabled and repository property is not set", (t) => {
142+
const loggedMessages: LoggedMessage[] = [];
143+
const logger = getRecordingLogger(loggedMessages);
144+
145+
const result = resolveToolsInput(undefined, false, {}, logger);
146+
147+
t.is(result, undefined);
148+
t.is(loggedMessages.length, 0);
149+
});

src/config/resolve-tools-input.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {
2+
RepositoryProperties,
3+
RepositoryPropertyName,
4+
} from "../feature-flags/properties";
5+
import { Logger } from "../logging";
6+
7+
/**
8+
* Resolves the effective tools input by combining the workflow input and repository properties.
9+
* The explicit `tools` workflow input takes precedence. If none is provided,
10+
* falls back to the repository property (if set and enabled for this workflow).
11+
*
12+
* @param toolsWorkflowInput - The value of the `tools` workflow input, if provided.
13+
* @param allowRepositoryPropertyFallback - Whether the repository property fallback is enabled.
14+
* @param repositoryProperties - The parsed repository properties.
15+
* @param logger - Logger for outputting resolution messages.
16+
* @returns The effective tools input value.
17+
*/
18+
export function resolveToolsInput(
19+
toolsWorkflowInput: string | undefined,
20+
allowRepositoryPropertyFallback: boolean,
21+
repositoryProperties: RepositoryProperties,
22+
logger: Logger,
23+
): string | undefined {
24+
if (toolsWorkflowInput) {
25+
logger.info(
26+
`Setting tools: ${toolsWorkflowInput} based on workflow input.`,
27+
);
28+
return toolsWorkflowInput;
29+
}
30+
31+
const toolsPropertyValue = repositoryProperties[RepositoryPropertyName.TOOLS];
32+
33+
if (!allowRepositoryPropertyFallback) {
34+
if (toolsPropertyValue) {
35+
logger.info(
36+
`No explicit tools input was provided. Ignoring '${RepositoryPropertyName.TOOLS}' repository property because it is only supported for dynamic workflows.`,
37+
);
38+
}
39+
return undefined;
40+
}
41+
42+
if (toolsPropertyValue) {
43+
logger.info(
44+
`Setting tools: ${toolsPropertyValue} based on the '${RepositoryPropertyName.TOOLS}' repository property.`,
45+
);
46+
return toolsPropertyValue;
47+
}
48+
49+
return undefined;
50+
}

0 commit comments

Comments
 (0)