mirror of
				https://github.com/actions/cache.git
				synced 2025-11-04 13:29:10 +08:00 
			
		
		
		
	Add unit tests for actionUtils (#93)
* Add unit tests for actionUtils * Fix file size on ubuntu and test name * Remove unused import
This commit is contained in:
		
							
								
								
									
										1
									
								
								__tests__/__fixtures__/helloWorld.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								__tests__/__fixtures__/helloWorld.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					hello world
 | 
				
			||||||
							
								
								
									
										226
									
								
								__tests__/actionUtils.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								__tests__/actionUtils.test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					import * as core from "@actions/core";
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@@ -299,7 +299,7 @@ test("restore with a pull request event and cache found", async () => {
 | 
				
			|||||||
    const cacheEntry: ArtifactCacheEntry = {
 | 
					    const cacheEntry: ArtifactCacheEntry = {
 | 
				
			||||||
        cacheKey: key,
 | 
					        cacheKey: key,
 | 
				
			||||||
        scope: "refs/heads/master",
 | 
					        scope: "refs/heads/master",
 | 
				
			||||||
        archiveLocation: "https://www.example.com/download"
 | 
					        archiveLocation: "www.actionscache.test/download"
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const getCacheMock = jest.spyOn(cacheHttpClient, "getCacheEntry");
 | 
					    const getCacheMock = jest.spyOn(cacheHttpClient, "getCacheEntry");
 | 
				
			||||||
    getCacheMock.mockImplementation(() => {
 | 
					    getCacheMock.mockImplementation(() => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,7 +70,11 @@ export function setOutputAndState(
 | 
				
			|||||||
export function getCacheState(): ArtifactCacheEntry | undefined {
 | 
					export function getCacheState(): ArtifactCacheEntry | undefined {
 | 
				
			||||||
    const stateData = core.getState(State.CacheResult);
 | 
					    const stateData = core.getState(State.CacheResult);
 | 
				
			||||||
    core.debug(`State: ${stateData}`);
 | 
					    core.debug(`State: ${stateData}`);
 | 
				
			||||||
    return (stateData && JSON.parse(stateData)) as ArtifactCacheEntry;
 | 
					    if (stateData) {
 | 
				
			||||||
 | 
					        return JSON.parse(stateData) as ArtifactCacheEntry;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return undefined;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function resolvePath(filePath: string): string {
 | 
					export function resolvePath(filePath: string): string {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user