2019-11-13 16:13:00 -05:00
|
|
|
import * as core from "@actions/core";
|
2020-03-18 09:43:56 -04:00
|
|
|
import * as fs from "fs";
|
2019-11-13 16:13:00 -05:00
|
|
|
import * as os from "os";
|
|
|
|
import * as path from "path";
|
|
|
|
|
|
|
|
import { Events, Outputs, State } from "../src/constants";
|
|
|
|
import { ArtifactCacheEntry } from "../src/contracts";
|
|
|
|
import * as actionUtils from "../src/utils/actionUtils";
|
|
|
|
|
|
|
|
jest.mock("@actions/core");
|
|
|
|
jest.mock("os");
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
delete process.env[Events.Key];
|
|
|
|
});
|
|
|
|
|
|
|
|
test("getArchiveFileSize returns file size", () => {
|
|
|
|
const filePath = path.join(__dirname, "__fixtures__", "helloWorld.txt");
|
|
|
|
|
|
|
|
const size = actionUtils.getArchiveFileSize(filePath);
|
|
|
|
|
|
|
|
expect(size).toBe(11);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with undefined cache entry returns false", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry = undefined;
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with empty cache entry returns false", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {};
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with different keys returns false", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "linux-"
|
|
|
|
};
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with different key accents returns false", () => {
|
|
|
|
const key = "linux-áccent";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "linux-accent"
|
|
|
|
};
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with same key returns true", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "linux-rust"
|
|
|
|
};
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isExactKeyMatch with same key and different casing returns true", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "LINUX-RUST"
|
|
|
|
};
|
|
|
|
|
|
|
|
expect(actionUtils.isExactKeyMatch(key, cacheEntry)).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("setOutputAndState with undefined entry to set cache-hit output", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry = undefined;
|
|
|
|
|
|
|
|
const setOutputMock = jest.spyOn(core, "setOutput");
|
|
|
|
const saveStateMock = jest.spyOn(core, "saveState");
|
|
|
|
|
|
|
|
actionUtils.setOutputAndState(key, cacheEntry);
|
|
|
|
|
|
|
|
expect(setOutputMock).toHaveBeenCalledWith(Outputs.CacheHit, "false");
|
|
|
|
expect(setOutputMock).toHaveBeenCalledTimes(1);
|
|
|
|
|
|
|
|
expect(saveStateMock).toHaveBeenCalledTimes(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("setOutputAndState with exact match to set cache-hit output and state", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "linux-rust"
|
|
|
|
};
|
|
|
|
|
|
|
|
const setOutputMock = jest.spyOn(core, "setOutput");
|
|
|
|
const saveStateMock = jest.spyOn(core, "saveState");
|
|
|
|
|
|
|
|
actionUtils.setOutputAndState(key, cacheEntry);
|
|
|
|
|
|
|
|
expect(setOutputMock).toHaveBeenCalledWith(Outputs.CacheHit, "true");
|
|
|
|
expect(setOutputMock).toHaveBeenCalledTimes(1);
|
|
|
|
|
|
|
|
expect(saveStateMock).toHaveBeenCalledWith(
|
|
|
|
State.CacheResult,
|
|
|
|
JSON.stringify(cacheEntry)
|
|
|
|
);
|
|
|
|
expect(saveStateMock).toHaveBeenCalledTimes(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("setOutputAndState with no exact match to set cache-hit output and state", () => {
|
|
|
|
const key = "linux-rust";
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "linux-rust-bb828da54c148048dd17899ba9fda624811cfb43"
|
|
|
|
};
|
|
|
|
|
|
|
|
const setOutputMock = jest.spyOn(core, "setOutput");
|
|
|
|
const saveStateMock = jest.spyOn(core, "saveState");
|
|
|
|
|
|
|
|
actionUtils.setOutputAndState(key, cacheEntry);
|
|
|
|
|
|
|
|
expect(setOutputMock).toHaveBeenCalledWith(Outputs.CacheHit, "false");
|
|
|
|
expect(setOutputMock).toHaveBeenCalledTimes(1);
|
|
|
|
|
|
|
|
expect(saveStateMock).toHaveBeenCalledWith(
|
|
|
|
State.CacheResult,
|
|
|
|
JSON.stringify(cacheEntry)
|
|
|
|
);
|
|
|
|
expect(saveStateMock).toHaveBeenCalledTimes(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("getCacheState with no state returns undefined", () => {
|
|
|
|
const getStateMock = jest.spyOn(core, "getState");
|
|
|
|
getStateMock.mockImplementation(() => {
|
|
|
|
return "";
|
|
|
|
});
|
|
|
|
|
|
|
|
const state = actionUtils.getCacheState();
|
|
|
|
|
|
|
|
expect(state).toBe(undefined);
|
|
|
|
|
|
|
|
expect(getStateMock).toHaveBeenCalledWith(State.CacheResult);
|
|
|
|
expect(getStateMock).toHaveBeenCalledTimes(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("getCacheState with valid state", () => {
|
|
|
|
const cacheEntry: ArtifactCacheEntry = {
|
|
|
|
cacheKey: "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43",
|
|
|
|
scope: "refs/heads/master",
|
|
|
|
creationTime: "2019-11-13T19:18:02+00:00",
|
|
|
|
archiveLocation: "www.actionscache.test/download"
|
|
|
|
};
|
|
|
|
const getStateMock = jest.spyOn(core, "getState");
|
|
|
|
getStateMock.mockImplementation(() => {
|
|
|
|
return JSON.stringify(cacheEntry);
|
|
|
|
});
|
|
|
|
|
|
|
|
const state = actionUtils.getCacheState();
|
|
|
|
|
|
|
|
expect(state).toEqual(cacheEntry);
|
|
|
|
|
|
|
|
expect(getStateMock).toHaveBeenCalledWith(State.CacheResult);
|
|
|
|
expect(getStateMock).toHaveBeenCalledTimes(1);
|
|
|
|
});
|
|
|
|
|
2019-11-21 14:37:54 -05:00
|
|
|
test("logWarning logs a message with a warning prefix", () => {
|
|
|
|
const message = "A warning occurred.";
|
|
|
|
|
|
|
|
const infoMock = jest.spyOn(core, "info");
|
|
|
|
|
|
|
|
actionUtils.logWarning(message);
|
|
|
|
|
|
|
|
expect(infoMock).toHaveBeenCalledWith(`[warning]${message}`);
|
|
|
|
});
|
|
|
|
|
2019-11-13 16:13:00 -05:00
|
|
|
test("isValidEvent returns false for unknown event", () => {
|
|
|
|
const event = "foo";
|
|
|
|
process.env[Events.Key] = event;
|
|
|
|
|
|
|
|
const isValidEvent = actionUtils.isValidEvent();
|
|
|
|
|
|
|
|
expect(isValidEvent).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("resolvePath with no ~ in path", () => {
|
|
|
|
const filePath = ".cache/yarn";
|
|
|
|
|
|
|
|
const resolvedPath = actionUtils.resolvePath(filePath);
|
|
|
|
|
|
|
|
const expectedPath = path.resolve(filePath);
|
|
|
|
expect(resolvedPath).toBe(expectedPath);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("resolvePath with ~ in path", () => {
|
|
|
|
const filePath = "~/.cache/yarn";
|
|
|
|
|
|
|
|
const homedir = jest.requireActual("os").homedir();
|
|
|
|
const homedirMock = jest.spyOn(os, "homedir");
|
|
|
|
homedirMock.mockImplementation(() => {
|
|
|
|
return homedir;
|
|
|
|
});
|
|
|
|
|
|
|
|
const resolvedPath = actionUtils.resolvePath(filePath);
|
|
|
|
|
|
|
|
const expectedPath = path.join(homedir, ".cache/yarn");
|
|
|
|
expect(resolvedPath).toBe(expectedPath);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("resolvePath with home not found", () => {
|
|
|
|
const filePath = "~/.cache/yarn";
|
|
|
|
const homedirMock = jest.spyOn(os, "homedir");
|
|
|
|
homedirMock.mockImplementation(() => {
|
|
|
|
return "";
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(() => actionUtils.resolvePath(filePath)).toThrow(
|
|
|
|
"Unable to resolve `~` to HOME"
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isValidEvent returns true for push event", () => {
|
|
|
|
const event = Events.Push;
|
|
|
|
process.env[Events.Key] = event;
|
|
|
|
|
|
|
|
const isValidEvent = actionUtils.isValidEvent();
|
|
|
|
|
|
|
|
expect(isValidEvent).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test("isValidEvent returns true for pull request event", () => {
|
|
|
|
const event = Events.PullRequest;
|
|
|
|
process.env[Events.Key] = event;
|
|
|
|
|
|
|
|
const isValidEvent = actionUtils.isValidEvent();
|
|
|
|
|
|
|
|
expect(isValidEvent).toBe(true);
|
|
|
|
});
|
2020-03-18 09:43:56 -04:00
|
|
|
|
|
|
|
test("unlinkFile unlinks file", async () => {
|
|
|
|
const testDirectory = fs.mkdtempSync("unlinkFileTest");
|
|
|
|
const testFile = path.join(testDirectory, "test.txt");
|
|
|
|
fs.writeFileSync(testFile, "hello world");
|
|
|
|
|
|
|
|
await actionUtils.unlinkFile(testFile);
|
|
|
|
|
|
|
|
expect(fs.existsSync(testFile)).toBe(false);
|
|
|
|
|
|
|
|
fs.rmdirSync(testDirectory);
|
|
|
|
});
|