/** * Unit tests for the action's main functionality, src/main.ts * * These should be run as if the action was called from a workflow. * Specifically, the inputs listed in `action.yml` should be set as environment * variables following the pattern `INPUT_`. */ import * as core from '@actions/core' import * as main from '../src/main' // Mock the GitHub Actions core library //const debugMock = jest.spyOn(core, 'debug') const infoMock = jest.spyOn(core, 'info').mockImplementation() const getInputMock = jest.spyOn(core, 'getInput').mockImplementation() const setFailedMock = jest.spyOn(core, 'setFailed').mockImplementation() const setOutputMock = jest.spyOn(core, 'setOutput').mockImplementation() // Mock the action's main function const runMock = jest.spyOn(main, 'run') describe('action', () => { beforeEach(() => { jest.clearAllMocks() }) it('sets the time output', async () => { // Set the action's inputs as return values from core.getInput() getInputMock.mockImplementation((name: string): string => { switch (name) { case 'milliseconds': return '500' default: return '' } }) await main.run() expect(runMock).toHaveReturned() expect(infoMock).toHaveBeenCalledWith(expect.stringMatching(/.*/)) expect(infoMock).toHaveBeenCalledWith(expect.stringMatching(/.*/)) expect(setOutputMock).toHaveBeenCalledWith( 'time', expect.stringMatching(/.*/) ) }) it('sets a failed status', async () => { // Set the action's inputs as return values from core.getInput() getInputMock.mockImplementation((name: string): string => { switch (name) { case 'milliseconds': return 'this is not a number' default: return '' } }) await main.run() expect(runMock).toHaveReturned() expect(setFailedMock).toHaveBeenNthCalledWith( 1, 'milliseconds not a number' ) }) })