Skip to content

Commit

Permalink
add omit input, deprecate others
Browse files Browse the repository at this point in the history
  • Loading branch information
robherley committed Apr 7, 2024
1 parent 4c6caba commit 982e0a2
Show file tree
Hide file tree
Showing 7 changed files with 293 additions and 124 deletions.
3 changes: 1 addition & 2 deletions __tests__/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ export const removeSummaryFile = async () => {
export const setupActionsInputs = () => {
process.env['INPUT_MODULEDIRECTORY'] = testModuleDirectory
process.env['INPUT_TESTARGUMENTS'] = testArguments
process.env['INPUT_OMITUNTESTEDPACKAGES'] = 'false'
process.env['INPUT_OMITPIE'] = 'false'
process.env['INPUT_OMIT'] = ''
}

export const createFakeGoModule = async () => {
Expand Down
83 changes: 83 additions & 0 deletions __tests__/inputs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import * as core from '@actions/core'
import { OmitOption, getInputs } from '../src/inputs'

jest.mock('@actions/core')

const mockGetInput = core.getInput as jest.MockedFunction<typeof core.getInput>
const mockGetBooleanInput = core.getBooleanInput as jest.MockedFunction<
typeof core.getBooleanInput
>

const mockInput = (name: string, value: string) => {
mockGetInput.mockImplementation((n: string) => (n === name ? value : ''))
}

describe('renderer', () => {
beforeEach(() => {
jest.resetAllMocks()
})

it('uses default values', () => {
mockGetInput.mockReturnValue('')
const inputs = getInputs()

expect(inputs).toEqual({
moduleDirectory: '.',
testArguments: ['./...'],
fromJSONFile: null,
omit: new Set(),
})
})

it('parses moduleDirectory', () => {
mockInput('moduleDirectory', 'foo')
const inputs = getInputs()

expect(inputs.moduleDirectory).toEqual('foo')
})

it('parses testArguments', () => {
mockInput('testArguments', 'foo bar')
const inputs = getInputs()

expect(inputs.testArguments).toEqual(['foo', 'bar'])
})

it('parses fromJSONFile', () => {
mockInput('fromJSONFile', 'foo.json')
const inputs = getInputs()

expect(inputs.fromJSONFile).toEqual('foo.json')
})

it('parses omit', () => {
mockInput(
'omit',
[...Object.values(OmitOption), 'foo', 'bar', 'baz'].join('\n')
)
const inputs = getInputs()

expect(inputs.omit).toEqual(new Set(Object.values(OmitOption)))
})

it('supports deprecated inputs', () => {
mockGetInput.mockImplementation((name: string) => {
switch (name) {
case 'omitUntestedPackages':
case 'omitSuccessfulPackages':
case 'omitPie':
return 'true'
default:
return ''
}
})

mockGetBooleanInput.mockReturnValue(true)

const inputs = getInputs()
expect(inputs.omit).toEqual(
new Set([OmitOption.Skipped, OmitOption.Successful, OmitOption.Pie])
)
expect(core.warning).toHaveBeenCalled()
})
})
60 changes: 47 additions & 13 deletions __tests__/renderer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
import { parseTestEvents } from '../src/events'
import Renderer from '../src/renderer'
import { SummaryTableCell } from '@actions/core/lib/summary'
import { OmitOption } from '../src/inputs'

const loadSummaryHTML = async (): Promise<cheerio.CheerioAPI> => {
const file = await fs.readFile(testSummaryFilePath, { encoding: 'utf8' })
Expand All @@ -26,9 +27,7 @@ const getRenderer = async (): Promise<Renderer> => {
'github.com/robherley/go-test-example',
testEvents,
'', // stderr
false, // omitUntestedPackages
false, // omitSuccessfulPackages
false // omitPie
new Set()
)
}

Expand Down Expand Up @@ -105,9 +104,7 @@ describe('renderer', () => {
'github.com/robherley/empty-module',
[],
'',
false,
false,
false
new Set()
)
await renderer.writeSummary()

Expand Down Expand Up @@ -169,9 +166,9 @@ describe('renderer', () => {
expect($.text()).toContain(pieData)
})

it('does not render pie when omitPie is true', async () => {
it('does not render pie when pie in omit', async () => {
const renderer = await getRenderer()
renderer.omitPie = true
renderer.omit.add(OmitOption.Pie)
await renderer.writeSummary()
const $ = await loadSummaryHTML()

Expand Down Expand Up @@ -201,22 +198,22 @@ describe('renderer', () => {
})
})

it('renders correct number of table rows when omitUntestedPackages is true', async () => {
it('renders correct number of table rows when skipped is in omit', async () => {
const renderer = await getRenderer()
renderer.omitUntestedPackages = true
renderer.omit.add(OmitOption.Skipped)
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('tr')).toHaveLength(7)
})

it('renders correct number of table rows when omitUntestedPackages is true', async () => {
it('renders correct number of table rows when successful is in omit', async () => {
const renderer = await getRenderer()
renderer.omitUntestedPackages = true
renderer.omit.add(OmitOption.Successful)
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('tr')).toHaveLength(7)
expect($('tr')).toHaveLength(5)
})

it('does not render stderr when empty', async () => {
Expand All @@ -237,4 +234,41 @@ describe('renderer', () => {
expect($('summary:contains(Standard Error Output)')).toHaveLength(1)
expect($('details:contains(hello world)')).toHaveLength(1)
})

it('does not render stderr when in omit', async () => {
const renderer = await getRenderer()
renderer.omit.add(OmitOption.Stderr)
renderer.stderr = 'i should not be rendered'
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('summary:contains(Standard Error Output)')).toHaveLength(0)
})

it('renders package test and output list', async () => {
const renderer = await getRenderer()
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('summary:contains(🧪 Tests)')).toHaveLength(4)
expect($('summary:contains(🖨️ Output)')).toHaveLength(4)
})

it('does not render package test list when in omit', async () => {
const renderer = await getRenderer()
renderer.omit.add(OmitOption.PackageTests)
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('summary:contains(🧪 Tests)')).toHaveLength(0)
})

it('does not render package output list when in omit', async () => {
const renderer = await getRenderer()
renderer.omit.add(OmitOption.PackageOutput)
await renderer.writeSummary()
const $ = await loadSummaryHTML()

expect($('summary:contains(🖨️ Output)')).toHaveLength(0)
})
})
26 changes: 0 additions & 26 deletions __tests__/runner.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,6 @@ describe('runner', () => {
setupActionsInputs()
})

it("sets defaults if inputs aren't set", async () => {
delete process.env['INPUT_MODULEDIRECTORY']
delete process.env['INPUT_TESTARGUMENTS']
delete process.env['INPUT_OMITUNTESTEDPACKAGES']
delete process.env['INPUT_OMITPIE']

const runner = new Runner()
expect(runner.moduleDirectory).toBe('.')
expect(runner.testArguments).toEqual(['./...'])
expect(runner.omitUntestedPackages).toEqual(false)
expect(runner.omitPie).toEqual(false)
})

it('uses inputs if they are set', async () => {
process.env['INPUT_MODULEDIRECTORY'] = '/some/random/directory'
process.env['INPUT_TESTARGUMENTS'] = '-foo -bar\t-baz'
process.env['INPUT_OMITUNTESTEDPACKAGES'] = 'true'
process.env['INPUT_OMITPIE'] = 'true'

const runner = new Runner()
expect(runner.moduleDirectory).toBe('/some/random/directory')
expect(runner.testArguments).toEqual(['-foo', '-bar', '-baz'])
expect(runner.omitUntestedPackages).toEqual(true)
expect(runner.omitPie).toEqual(true)
})

it('resolves module name from go.mod', async () => {
const runner = new Runner()
const modName = await runner.findModuleName()
Expand Down
112 changes: 112 additions & 0 deletions src/inputs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import * as core from '@actions/core'

export interface Inputs {
moduleDirectory: string
testArguments: string[]
fromJSONFile: string | null
omit: Set<OmitOption>
}

export enum OmitOption {
// Omit untested packages from the summary
Skipped = 'skipped',
// Omit successful packages from the summary
Successful = 'successful',
// Omit the pie chart from the summary
Pie = 'pie',
// Omit the package test output
PackageOutput = 'pkg-output',
// Omit the package test list
PackageTests = 'pkg-tests',
// Omit stderr
Stderr = 'stderr',
}

export const defaultInputs = (): Inputs => ({
moduleDirectory: '.',
testArguments: ['./...'],
fromJSONFile: null,
omit: new Set(),
})

/**
* Parses the action inputs from the environment
* @returns the parsed inputs
*/
export function getInputs(): Inputs {
const inputs = defaultInputs()

getDeprecatedOmitInputs().forEach(option => {
inputs.omit.add(option)
})

const moduleDirectory = core.getInput('moduleDirectory')
if (moduleDirectory) {
inputs.moduleDirectory = moduleDirectory
}

const testArguments = core.getInput('testArguments')
if (testArguments) {
inputs.testArguments = testArguments.split(/\s/).filter(arg => arg.length)
}

const fromJSONFile = core.getInput('fromJSONFile')
if (fromJSONFile) {
inputs.fromJSONFile = fromJSONFile
}

const omit = core.getInput('omit')
if (omit) {
omit
.split(/\s/)
.filter(option =>
Object.values(OmitOption).includes(option as OmitOption)
)
.forEach(option => inputs.omit.add(option as OmitOption))
}

return inputs
}

/**
* Parses the deprecated omit inputs
* @returns the parsed omit options
*/
function getDeprecatedOmitInputs(): OmitOption[] {
const omitOptions: OmitOption[] = []
const usedDeprecated: string[] = []

const omitUntestedPackages = core.getInput('omitUntestedPackages')
if (omitUntestedPackages) {
usedDeprecated.push('omitUntestedPackages')
if (core.getBooleanInput('omitUntestedPackages')) {
omitOptions.push(OmitOption.Skipped)
}
}

const omitSuccessfulPackages = core.getInput('omitSuccessfulPackages')
if (omitSuccessfulPackages) {
usedDeprecated.push('omitSuccessfulPackages')
if (core.getBooleanInput('omitSuccessfulPackages')) {
omitOptions.push(OmitOption.Successful)
}
}

const omitPie = core.getInput('omitPie')
if (omitPie) {
usedDeprecated.push('omitPie')
if (core.getBooleanInput('omitPie')) {
omitOptions.push(OmitOption.Pie)
}
}

if (usedDeprecated.length > 0) {
core.warning(
`The following inputs are deprecated and will be removed in the next major version: ${Array.from(
usedDeprecated
).join(', ')}. Please use the \`omit\` input instead.`
)
}

return omitOptions
}

0 comments on commit 982e0a2

Please sign in to comment.