diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 50a3b0c..a26814e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,9 +41,10 @@ jobs: - name: Lint id: npm-lint run: npm run lint - # - name: Test - # id: npm-ci-test - # run: npm run ci-test + + - name: Test + id: npm-ci-test + run: npm run ci-test test-attest-provenance: name: Test attest-provenance action diff --git a/__tests__/__snapshots__/main.test.ts.snap b/__tests__/__snapshots__/main.test.ts.snap new file mode 100644 index 0000000..7b0e3a8 --- /dev/null +++ b/__tests__/__snapshots__/main.test.ts.snap @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`main successfully run main 1`] = ` +{ + "buildDefinition": { + "buildType": "https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1", + "externalParameters": { + "workflow": { + "path": ".github/workflows/main.yml", + "ref": "main", + "repository": "https://github.com/owner/repo", + }, + }, + "internalParameters": { + "github": { + "event_name": "push", + "repository_id": "repo-id", + "repository_owner_id": "owner-id", + }, + }, + "resolvedDependencies": [ + { + "digest": { + "gitCommit": "babca52ab0c93ae16539e5923cb0d7403b9a093b", + }, + "uri": "git+https://github.com/owner/repo@refs/heads/main", + }, + ], + }, + "runDetails": { + "builder": { + "id": "https://github.com/actions/runner/github-hosted", + }, + "metadata": { + "invocationId": "https://github.com/owner/repo/actions/runs/run-id/attempts/run-attempt", + }, + }, +} +`; diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts new file mode 100644 index 0000000..34a4dfe --- /dev/null +++ b/__tests__/index.test.ts @@ -0,0 +1,17 @@ +/** + * Unit tests for the action's entrypoint, src/index.ts + */ + +import * as main from '../src/main' + +// Mock the action's entrypoint +const runMock = jest.spyOn(main, 'run').mockImplementation() + +describe('index', () => { + it('calls run when imported', async () => { + // eslint-disable-next-line @typescript-eslint/no-require-imports + require('../src/index') + + expect(runMock).toHaveBeenCalled() + }) +}) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts new file mode 100644 index 0000000..a19e3e4 --- /dev/null +++ b/__tests__/main.test.ts @@ -0,0 +1,60 @@ +import * as core from '@actions/core' +import * as main from '../src/main' + +// Mock the GitHub Actions core library +jest.mock('@actions/core') +const setOutputMock = jest.spyOn(core, 'setOutput') +const setFailedMock = jest.spyOn(core, 'setFailed') + +// Ensure that setFailed doesn't set an exit code during tests +setFailedMock.mockImplementation(() => {}) + +describe('main', () => { + let outputs = {} as Record + + beforeEach(() => { + jest.resetAllMocks() + setOutputMock.mockImplementation((key, value) => { + outputs[key] = value + }) + }) + + afterEach(() => { + outputs = {} + }) + + it('successfully run main', async () => { + const originalEnv = process.env + process.env = { + ...originalEnv, + GITHUB_REPOSITORY: 'owner/repo', + GITHUB_REF: 'refs/heads/main', + GITHUB_SHA: 'babca52ab0c93ae16539e5923cb0d7403b9a093b', + GITHUB_WORKFLOW_REF: 'owner/repo/.github/workflows/main.yml@main', + GITHUB_SERVER_URL: 'https://github.com', + GITHUB_EVENT_NAME: 'push', + GITHUB_REPOSITORY_ID: 'repo-id', + GITHUB_REPOSITORY_OWNER_ID: 'owner-id', + GITHUB_RUN_ID: 'run-id', + GITHUB_RUN_ATTEMPT: 'run-attempt', + RUNNER_ENVIRONMENT: 'github-hosted' + } + + // Run the main function + await main.run() + + // Verify that outputs were set correctly + expect(setOutputMock).toHaveBeenCalledTimes(2) + + // Use the expected object in the test assertion + expect(outputs['predicate']).toMatchSnapshot() + + expect(setOutputMock).toHaveBeenNthCalledWith( + 2, + 'predicate-type', + 'https://slsa.dev/provenance/v1' + ) + + process.env = originalEnv + }) +}) diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 0000000..a535bd6 --- /dev/null +++ b/jest.setup.js @@ -0,0 +1 @@ +process.stdout.write = jest.fn() diff --git a/package.json b/package.json index 1d74d7d..3cecf36 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,9 @@ "js", "ts" ], + "setupFilesAfterEnv": [ + "./jest.setup.js" + ], "testMatch": [ "**/*.test.ts" ],