import dedent from 'dedent'
import * as github from '@actions/github'
import {afterEach, describe, expect, it} from '@jest/globals'
import {BuildResult} from '../../src/build-results'
import {jobMarker, renderSummaryTable} from '../../src/job-summary'
const MATRIX_INPUT_ENV = 'INPUT_WORKFLOW-JOB-CONTEXT'
function fakeContext(workflow: string, job: string): typeof github.context {
return {workflow, job} as unknown as typeof github.context
}
const successfulHelpBuild: BuildResult = {
rootProjectName: 'root',
rootProjectDir: '/',
requestedTasks: 'help',
gradleVersion: '8.0',
gradleHomeDir: '/opt/gradle',
buildFailed: false,
configCacheHit: false,
buildScanUri: 'https://scans.gradle.com/s/abc123',
buildScanFailed: false
}
const failedHelpBuild: BuildResult = {
...successfulHelpBuild,
buildFailed: true
}
const longArgsBuild: BuildResult = {
...successfulHelpBuild,
requestedTasks: 'check publishMyLongNamePluginPublicationToMavenCentral publishMyLongNamePluginPublicationToPluginPortal',
}
const scanPublishDisabledBuild: BuildResult = {
...successfulHelpBuild,
buildScanUri: '',
buildScanFailed: false,
}
const scanPublishFailedBuild: BuildResult = {
...successfulHelpBuild,
buildScanUri: '',
buildScanFailed: true,
}
describe('renderSummaryTable', () => {
describe('renders', () => {
it('successful build', () => {
const table = renderSummaryTable([successfulHelpBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
help |
8.0 |
:white_check_mark: |
 |
`);
})
it('failed build', () => {
const table = renderSummaryTable([failedHelpBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
help |
8.0 |
:x: |
 |
`);
})
describe('when build scan', () => {
it('publishing disabled', () => {
const table = renderSummaryTable([scanPublishDisabledBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
help |
8.0 |
:white_check_mark: |
 |
`);
})
it('publishing failed', () => {
const table = renderSummaryTable([scanPublishFailedBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
help |
8.0 |
:white_check_mark: |
 |
`);
})
})
it('multiple builds', () => {
const table = renderSummaryTable([successfulHelpBuild, failedHelpBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
help |
8.0 |
:white_check_mark: |
 |
| root |
help |
8.0 |
:x: |
 |
`);
})
it('truncating long requested tasks', () => {
const table = renderSummaryTable([longArgsBuild])
expect(table.trim()).toBe(dedent`
| Gradle Root Project |
Requested Tasks |
Gradle Version |
Build Outcome |
Build Scan® |
| root |
check publishMyLongNamePluginPublicationToMavenCentral publ… |
8.0 |
:white_check_mark: |
 |
`);
})
})
})
describe('jobMarker', () => {
const original = process.env[MATRIX_INPUT_ENV]
afterEach(() => {
if (original === undefined) {
delete process.env[MATRIX_INPUT_ENV]
} else {
process.env[MATRIX_INPUT_ENV] = original
}
})
it('builds a hidden marker from the workflow and job', () => {
process.env[MATRIX_INPUT_ENV] = 'null'
const marker = jobMarker(fakeContext('CI', 'build'))
expect(marker).toBe('')
})
it('includes the job matrix in the marker', () => {
process.env[MATRIX_INPUT_ENV] = JSON.stringify({os: 'ubuntu', java: '17'})
const marker = jobMarker(fakeContext('CI', 'build'))
expect(marker).toBe('')
})
})