diff --git a/__tests__/saveOnly.test.ts b/__tests__/saveOnly.test.ts index 5a7f8b0..e670c90 100644 --- a/__tests__/saveOnly.test.ts +++ b/__tests__/saveOnly.test.ts @@ -11,12 +11,12 @@ jest.mock("@actions/cache"); jest.mock("../src/utils/actionUtils"); beforeAll(() => { - jest.spyOn(core, "getInput").mockImplementation((name, options) => { - return jest.requireActual("@actions/core").getInput(name, options); + jest.spyOn(core, "getInput").mockImplementation(name => { + return testUtils.getInput(name); }); - jest.spyOn(core, "setOutput").mockImplementation((key, value) => { - return jest.requireActual("@actions/core").getInput(key, value); + jest.spyOn(core, "getState").mockImplementation(name => { + return jest.requireActual("@actions/core").getState(name); }); jest.spyOn(actionUtils, "getInputAsArray").mockImplementation( diff --git a/__tests__/stateProvider.test.ts b/__tests__/stateProvider.test.ts index 255b5fb..540e065 100644 --- a/__tests__/stateProvider.test.ts +++ b/__tests__/stateProvider.test.ts @@ -1,11 +1,12 @@ import * as core from "@actions/core"; -import { Events, RefKey, State } from "../src/constants"; +import { Events, Inputs, RefKey, State } from "../src/constants"; import { IStateProvider, NullStateProvider, StateProvider } from "../src/stateProvider"; +import * as testUtils from "../src/utils/testUtils"; jest.mock("@actions/core"); @@ -58,32 +59,43 @@ test("StateProvider saves states", async () => { }); test("NullStateProvider saves outputs", async () => { + const states = new Map(); + + const getInputMock = jest + .spyOn(core, "getInput") + .mockImplementation(key => testUtils.getInput(key)); + const getStateMock = jest .spyOn(core, "getState") - .mockImplementation(name => - jest.requireActual("@actions/core").getState(name) - ); + .mockImplementation(key => { + return jest.requireActual("@actions/core").getState(key); + }); const setOutputMock = jest .spyOn(core, "setOutput") .mockImplementation((key, value) => { - return jest.requireActual("@actions/core").setOutput(key, value); + states.set(key, value); }); const saveStateMock = jest .spyOn(core, "saveState") .mockImplementation((key, value) => { - return jest.requireActual("@actions/core").saveState(key, value); + states.set(key, value); }); const cacheMatchedKey = "node-cache"; + const cachePrimaryKey = "primary-key"; const nullStateProvider: IStateProvider = new NullStateProvider(); - nullStateProvider.setState(State.CacheMatchedKey, "outputValue"); - nullStateProvider.setState(State.CachePrimaryKey, cacheMatchedKey); - nullStateProvider.getState("outputKey"); - nullStateProvider.getCacheState(); + testUtils.setInput(Inputs.Key, cachePrimaryKey); + nullStateProvider.setState(State.CachePrimaryKey, cachePrimaryKey); + nullStateProvider.setState(State.CacheMatchedKey, cacheMatchedKey); + const output1 = nullStateProvider.getState(State.CachePrimaryKey); + const output2 = nullStateProvider.getCacheState(); expect(getStateMock).toHaveBeenCalledTimes(0); + expect(getInputMock).toHaveBeenCalledTimes(1); + expect(output1).toBe("primary-key"); + expect(output2).toBe(undefined); expect(setOutputMock).toHaveBeenCalledTimes(2); expect(saveStateMock).toHaveBeenCalledTimes(0); }); diff --git a/dist/restore-only/index.js b/dist/restore-only/index.js index f676abb..0daba23 100644 --- a/dist/restore-only/index.js +++ b/dist/restore-only/index.js @@ -9413,15 +9413,24 @@ exports.StateProvider = StateProvider; class NullStateProvider extends StateProviderBase { constructor() { super(...arguments); + this.stateToInputMap = new Map([ + [constants_1.State.CachePrimaryKey, constants_1.Inputs.Key] + ]); this.stateToOutputMap = new Map([ [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] ]); this.setState = (key, value) => { - core.setOutput(this.stateToOutputMap.get(key), value); + if (this.stateToOutputMap.has(key)) { + core.setOutput(this.stateToOutputMap.get(key), value); + } + }; + this.getState = (key) => { + if (!this.stateToInputMap.has(key)) { + return ""; + } + return core.getInput(this.stateToInputMap.get(key)); }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - this.getState = (key) => ""; } } exports.NullStateProvider = NullStateProvider; diff --git a/dist/restore/index.js b/dist/restore/index.js index 6415478..0f028df 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -9413,15 +9413,24 @@ exports.StateProvider = StateProvider; class NullStateProvider extends StateProviderBase { constructor() { super(...arguments); + this.stateToInputMap = new Map([ + [constants_1.State.CachePrimaryKey, constants_1.Inputs.Key] + ]); this.stateToOutputMap = new Map([ [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] ]); this.setState = (key, value) => { - core.setOutput(this.stateToOutputMap.get(key), value); + if (this.stateToOutputMap.has(key)) { + core.setOutput(this.stateToOutputMap.get(key), value); + } + }; + this.getState = (key) => { + if (!this.stateToInputMap.has(key)) { + return ""; + } + return core.getInput(this.stateToInputMap.get(key)); }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - this.getState = (key) => ""; } } exports.NullStateProvider = NullStateProvider; diff --git a/dist/save-only/index.js b/dist/save-only/index.js index 0d3295c..f5844f1 100644 --- a/dist/save-only/index.js +++ b/dist/save-only/index.js @@ -9469,15 +9469,24 @@ exports.StateProvider = StateProvider; class NullStateProvider extends StateProviderBase { constructor() { super(...arguments); + this.stateToInputMap = new Map([ + [constants_1.State.CachePrimaryKey, constants_1.Inputs.Key] + ]); this.stateToOutputMap = new Map([ [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] ]); this.setState = (key, value) => { - core.setOutput(this.stateToOutputMap.get(key), value); + if (this.stateToOutputMap.has(key)) { + core.setOutput(this.stateToOutputMap.get(key), value); + } + }; + this.getState = (key) => { + if (!this.stateToInputMap.has(key)) { + return ""; + } + return core.getInput(this.stateToInputMap.get(key)); }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - this.getState = (key) => ""; } } exports.NullStateProvider = NullStateProvider; @@ -41164,8 +41173,7 @@ function saveImpl(stateProvider) { } // If restore has stored a primary key in state, reuse that // Else re-evaluate from inputs - const primaryKey = stateProvider.getState(constants_1.State.CachePrimaryKey) || - core.getInput(constants_1.Inputs.Key); + const primaryKey = stateProvider.getState(constants_1.State.CachePrimaryKey); if (!primaryKey) { utils.logWarning(`Key is not specified.`); return; diff --git a/dist/save/index.js b/dist/save/index.js index 1b0a733..8b982f0 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -9413,15 +9413,24 @@ exports.StateProvider = StateProvider; class NullStateProvider extends StateProviderBase { constructor() { super(...arguments); + this.stateToInputMap = new Map([ + [constants_1.State.CachePrimaryKey, constants_1.Inputs.Key] + ]); this.stateToOutputMap = new Map([ [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] ]); this.setState = (key, value) => { - core.setOutput(this.stateToOutputMap.get(key), value); + if (this.stateToOutputMap.has(key)) { + core.setOutput(this.stateToOutputMap.get(key), value); + } + }; + this.getState = (key) => { + if (!this.stateToInputMap.has(key)) { + return ""; + } + return core.getInput(this.stateToInputMap.get(key)); }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - this.getState = (key) => ""; } } exports.NullStateProvider = NullStateProvider; @@ -41108,8 +41117,7 @@ function saveImpl(stateProvider) { } // If restore has stored a primary key in state, reuse that // Else re-evaluate from inputs - const primaryKey = stateProvider.getState(constants_1.State.CachePrimaryKey) || - core.getInput(constants_1.Inputs.Key); + const primaryKey = stateProvider.getState(constants_1.State.CachePrimaryKey); if (!primaryKey) { utils.logWarning(`Key is not specified.`); return; diff --git a/src/saveImpl.ts b/src/saveImpl.ts index 5fd4513..f589e76 100644 --- a/src/saveImpl.ts +++ b/src/saveImpl.ts @@ -28,9 +28,7 @@ async function saveImpl(stateProvider: IStateProvider): Promise { // If restore has stored a primary key in state, reuse that // Else re-evaluate from inputs - const primaryKey = - stateProvider.getState(State.CachePrimaryKey) || - core.getInput(Inputs.Key); + const primaryKey = stateProvider.getState(State.CachePrimaryKey); if (!primaryKey) { utils.logWarning(`Key is not specified.`); diff --git a/src/stateProvider.ts b/src/stateProvider.ts index beb41e5..131ec69 100644 --- a/src/stateProvider.ts +++ b/src/stateProvider.ts @@ -1,6 +1,6 @@ import * as core from "@actions/core"; -import { Outputs, State } from "./constants"; +import { Inputs, Outputs, State } from "./constants"; export interface IStateProvider { setState(key: string, value: string): void; @@ -33,14 +33,25 @@ export class StateProvider extends StateProviderBase { } export class NullStateProvider extends StateProviderBase { + stateToInputMap = new Map([ + [State.CachePrimaryKey, Inputs.Key] + ]); + stateToOutputMap = new Map([ [State.CacheMatchedKey, Outputs.CacheMatchedKey], [State.CachePrimaryKey, Outputs.CachePrimaryKey] ]); setState = (key: string, value: string) => { - core.setOutput(this.stateToOutputMap.get(key) as string, value); + if (this.stateToOutputMap.has(key)) { + core.setOutput(this.stateToOutputMap.get(key) as string, value); + } + }; + + getState = (key: string) => { + if (!this.stateToInputMap.has(key)) { + return ""; + } + return core.getInput(this.stateToInputMap.get(key) as string); }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getState = (key: string) => ""; } diff --git a/src/utils/testUtils.ts b/src/utils/testUtils.ts index c0a3f43..845cee9 100644 --- a/src/utils/testUtils.ts +++ b/src/utils/testUtils.ts @@ -9,6 +9,10 @@ export function setInput(name: string, value: string): void { process.env[getInputName(name)] = value; } +export function getInput(name: string): string { + return process.env[getInputName(name)] as string; +} + interface CacheInput { path: string; key: string;