test-attest-provenance: name: Test attest-provenance action 17 changes: 17 additions & alot of additions __tests__/index.test.ts Viewed Original file line number Diff line number Diff line change @@ -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() }) }) 103 changes: 103 additions & 0 deletions103 __tests__/main.test.ts Viewed Original file line number Diff line number Diff line change @@ -0,0 +1,103 @@ 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 action', () => { 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) // Define the expected object const expectedObject = { 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' } } } Collaborator @bdehamer bdehamer on Feb 29, 2024 Instead of having this big, expected fixture here this is a good use case for .toMatchSnapshot(). See https://github.com/actions/toolkit/blob/0c735ba79dc9a148f98956164de52845f2e6f057/packages/attest/__tests__/provenance.test.ts#L25 for an example. @webmasterdevices Reply... // Use the expected object in the test assertion expect(setOutputMock).toHaveBeenNthCalledWith( 1, 'predicate', expectedObject ) expect(setOutputMock).toHaveBeenNthCalledWith( 2, 'predicate-type', 'https://slsa.dev/provenance/v1' ) process.env = originalEnv }) }) 1 change: 1 addition & 0 deletions1 jest.setup.js Viewed Original file line number Diff line number Diff line change @@ -0,0 +1 @@ process.stdout.write = jest.fn() 3 changes: 3 additions & 0 deletions3 package.json Viewed Original file line number Diff line number Diff line change @@ -46,6 +46,9 @@ "js", "ts" ], "setupFilesAfterEnv": [ "./jest.setup.js" ], "testMatch": [ "**/*.test.ts" ], Unchanged files with check annotations Preview .github/linters/tsconfig.json { Check warning on line 1 in .github/linters/tsconfig.json GitHub Actions / Lint Codebase File ignored by default. "$schema": "https://json.schemastore.org/tsconfig", "extends": "../../tsconfig.json", "compilerOptions": { .prettierrc.json { Check warning on line 1 in .prettierrc.json GitHub Actions / Lint Codebase File ignored by default. "printWidth": 80, "tabWidth": 2, "useTabs": false, Footer © 2025 GitHub, Inc. Footer navigation Terms Privacy Security Status Docs Contact Manage cookies Do not share my personal information