mirror of
https://code.forgejo.org/actions/cache.git
synced 2024-11-05 10:12:55 +01:00
177 lines
4.2 KiB
TypeScript
177 lines
4.2 KiB
TypeScript
import { getCacheVersion, retry } from "../src/cacheHttpClient";
|
|
import { CompressionMethod, Inputs } from "../src/constants";
|
|
import * as testUtils from "../src/utils/testUtils";
|
|
|
|
afterEach(() => {
|
|
testUtils.clearInputs();
|
|
});
|
|
|
|
test("getCacheVersion with path input and compression method undefined returns version", async () => {
|
|
testUtils.setInput(Inputs.Path, "node_modules");
|
|
|
|
const result = getCacheVersion();
|
|
|
|
expect(result).toEqual(
|
|
"b3e0c6cb5ecf32614eeb2997d905b9c297046d7cbf69062698f25b14b4cb0985"
|
|
);
|
|
});
|
|
|
|
test("getCacheVersion with zstd compression returns version", async () => {
|
|
testUtils.setInput(Inputs.Path, "node_modules");
|
|
const result = getCacheVersion(CompressionMethod.Zstd);
|
|
|
|
expect(result).toEqual(
|
|
"273877e14fd65d270b87a198edbfa2db5a43de567c9a548d2a2505b408befe24"
|
|
);
|
|
});
|
|
|
|
test("getCacheVersion with gzip compression does not change vesion", async () => {
|
|
testUtils.setInput(Inputs.Path, "node_modules");
|
|
const result = getCacheVersion(CompressionMethod.Gzip);
|
|
|
|
expect(result).toEqual(
|
|
"b3e0c6cb5ecf32614eeb2997d905b9c297046d7cbf69062698f25b14b4cb0985"
|
|
);
|
|
});
|
|
|
|
test("getCacheVersion with no input throws", async () => {
|
|
expect(() => getCacheVersion()).toThrow();
|
|
});
|
|
|
|
interface TestResponse {
|
|
statusCode: number;
|
|
result: string | null;
|
|
}
|
|
|
|
function handleResponse(
|
|
response: TestResponse | undefined
|
|
): Promise<TestResponse> {
|
|
if (!response) {
|
|
fail("Retry method called too many times");
|
|
}
|
|
|
|
if (response.statusCode === 999) {
|
|
throw Error("Test Error");
|
|
} else {
|
|
return Promise.resolve(response);
|
|
}
|
|
}
|
|
|
|
async function testRetryExpectingResult(
|
|
responses: Array<TestResponse>,
|
|
expectedResult: string | null
|
|
): Promise<void> {
|
|
responses = responses.reverse(); // Reverse responses since we pop from end
|
|
|
|
const actualResult = await retry(
|
|
"test",
|
|
() => handleResponse(responses.pop()),
|
|
(response: TestResponse) => response.statusCode
|
|
);
|
|
|
|
expect(actualResult.result).toEqual(expectedResult);
|
|
}
|
|
|
|
async function testRetryExpectingError(
|
|
responses: Array<TestResponse>
|
|
): Promise<void> {
|
|
responses = responses.reverse(); // Reverse responses since we pop from end
|
|
|
|
expect(
|
|
retry(
|
|
"test",
|
|
() => handleResponse(responses.pop()),
|
|
(response: TestResponse) => response.statusCode
|
|
)
|
|
).rejects.toBeInstanceOf(Error);
|
|
}
|
|
|
|
test("retry works on successful response", async () => {
|
|
await testRetryExpectingResult(
|
|
[
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
],
|
|
"Ok"
|
|
);
|
|
});
|
|
|
|
test("retry works after retryable status code", async () => {
|
|
await testRetryExpectingResult(
|
|
[
|
|
{
|
|
statusCode: 503,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
],
|
|
"Ok"
|
|
);
|
|
});
|
|
|
|
test("retry fails after exhausting retries", async () => {
|
|
await testRetryExpectingError([
|
|
{
|
|
statusCode: 503,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 503,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
]);
|
|
});
|
|
|
|
test("retry fails after non-retryable status code", async () => {
|
|
await testRetryExpectingError([
|
|
{
|
|
statusCode: 500,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
]);
|
|
});
|
|
|
|
test("retry works after error", async () => {
|
|
await testRetryExpectingResult(
|
|
[
|
|
{
|
|
statusCode: 999,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
],
|
|
"Ok"
|
|
);
|
|
});
|
|
|
|
test("retry returns after client error", async () => {
|
|
await testRetryExpectingResult(
|
|
[
|
|
{
|
|
statusCode: 400,
|
|
result: null
|
|
},
|
|
{
|
|
statusCode: 200,
|
|
result: "Ok"
|
|
}
|
|
],
|
|
null
|
|
);
|
|
});
|