1
0
Fork 0
toolkit/packages/core/__tests__/lib.test.ts

173 lines
5.3 KiB
TypeScript
Raw Normal View History

2019-05-21 21:08:25 +00:00
import {ExitCode} from '@actions/exit'
2019-05-21 14:11:39 +00:00
import * as os from 'os'
import * as path from 'path'
import * as core from '../src/core'
2019-05-16 20:40:21 +00:00
2019-05-21 21:08:25 +00:00
/* eslint-disable @typescript-eslint/unbound-method */
const testEnvVars = {
'my var': '',
'special char var \r\n];': '',
'my var2': '',
'my secret': '',
'special char secret \r\n];': '',
'my secret2': '',
PATH: `path1${path.delimiter}path2`,
// Set inputs
INPUT_MY_INPUT: 'val',
INPUT_MISSING: '',
'INPUT_SPECIAL_CHARS_\'\t"\\': '\'\t"\\ repsonse '
}
2019-05-16 20:40:21 +00:00
describe('@actions/core', () => {
2019-05-21 14:11:39 +00:00
beforeEach(() => {
for (const key in testEnvVars)
process.env[key] = testEnvVars[key as keyof typeof testEnvVars]
process.stdout.write = jest.fn()
})
2019-05-21 14:11:39 +00:00
afterEach(() => {
for (const key in testEnvVars) Reflect.deleteProperty(testEnvVars, key)
2019-05-21 14:11:39 +00:00
})
it('exportVariable produces the correct command and sets the env', () => {
core.exportVariable('my var', 'var val')
2019-05-21 18:40:57 +00:00
assertWriteCalls([`##[set-env name=my var;]var val${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('exportVariable escapes variable names', () => {
core.exportVariable('special char var \r\n];', 'special val')
expect(process.env['special char var \r\n];']).toBe('special val')
2019-05-21 16:34:47 +00:00
assertWriteCalls([
2019-05-21 18:40:57 +00:00
`##[set-env name=special char var %0D%0A%5D%3B;]special val${os.EOL}`
2019-05-21 16:34:47 +00:00
])
2019-05-21 14:11:39 +00:00
})
it('exportVariable escapes variable values', () => {
core.exportVariable('my var2', 'var val\r\n')
expect(process.env['my var2']).toBe('var val\r\n')
2019-05-21 18:40:57 +00:00
assertWriteCalls([`##[set-env name=my var2;]var val%0D%0A${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
2019-05-21 18:38:29 +00:00
it('exportSecret produces the correct commands and sets the env', () => {
core.exportSecret('my secret', 'secret val')
2019-05-21 14:11:39 +00:00
expect(process.env['my secret']).toBe('secret val')
2019-05-21 16:34:47 +00:00
assertWriteCalls([
2019-05-21 18:40:57 +00:00
`##[set-env name=my secret;]secret val${os.EOL}`,
`##[set-secret]secret val${os.EOL}`
2019-05-21 16:34:47 +00:00
])
2019-05-21 14:11:39 +00:00
})
2019-05-21 18:38:29 +00:00
it('exportSecret escapes secret names', () => {
core.exportSecret('special char secret \r\n];', 'special secret val')
2019-05-21 14:11:39 +00:00
expect(process.env['special char secret \r\n];']).toBe('special secret val')
2019-05-21 16:34:47 +00:00
assertWriteCalls([
2019-05-21 18:40:57 +00:00
`##[set-env name=special char secret %0D%0A%5D%3B;]special secret val${
2019-05-21 14:11:39 +00:00
os.EOL
2019-05-21 16:34:47 +00:00
}`,
`##[set-secret]special secret val${os.EOL}`
2019-05-21 16:34:47 +00:00
])
2019-05-21 14:11:39 +00:00
})
2019-05-21 18:38:29 +00:00
it('exportSecret escapes secret values', () => {
core.exportSecret('my secret2', 'secret val\r\n')
2019-05-21 14:11:39 +00:00
expect(process.env['my secret2']).toBe('secret val\r\n')
2019-05-21 16:34:47 +00:00
assertWriteCalls([
2019-05-21 18:40:57 +00:00
`##[set-env name=my secret2;]secret val%0D%0A${os.EOL}`,
`##[set-secret]secret val%0D%0A${os.EOL}`
2019-05-21 16:34:47 +00:00
])
2019-05-21 14:11:39 +00:00
})
it('prependPath produces the correct commands and sets the env', () => {
core.addPath('myPath')
expect(process.env['PATH']).toBe(
`myPath${path.delimiter}path1${path.delimiter}path2`
)
assertWriteCalls([`##[add-path]myPath${os.EOL}`])
})
2019-05-21 14:11:39 +00:00
it('getInput gets non-required input', () => {
expect(core.getInput('my input')).toBe('val')
})
it('getInput gets required input', () => {
expect(core.getInput('my input', {required: true})).toBe('val')
})
it('getInput throws on missing required input', () => {
expect(() => core.getInput('missing', {required: true})).toThrow(
'Input required and not supplied: missing'
)
})
it('getInput doesnt throw on missing non-required input', () => {
expect(core.getInput('missing', {required: false})).toBe('')
})
it('getInput is case insensitive', () => {
expect(core.getInput('My InPuT')).toBe('val')
})
it('getInput handles special characters', () => {
expect(core.getInput('special chars_\'\t"\\')).toBe('\'\t"\\ repsonse')
})
it('setNeutral sets the correct exit code', () => {
core.setFailed('Failure message')
2019-05-21 21:08:25 +00:00
expect(process.exitCode).toBe(ExitCode.Failure)
2019-05-21 14:11:39 +00:00
})
it('setFailure sets the correct exit code and failure message', () => {
core.setFailed('Failure message')
2019-05-21 21:08:25 +00:00
expect(process.exitCode).toBe(ExitCode.Failure)
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[error]Failure message${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('setFailure escapes the failure message', () => {
core.setFailed('Failure \r\n\nmessage\r')
2019-05-21 21:08:25 +00:00
expect(process.exitCode).toBe(ExitCode.Failure)
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[error]Failure %0D%0A%0Amessage%0D${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('error sets the correct error message', () => {
core.error('Error message')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[error]Error message${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('error escapes the error message', () => {
core.error('Error message\r\n\n')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[error]Error message%0D%0A%0A${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('warning sets the correct message', () => {
core.warning('Warning')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[warning]Warning${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('warning escapes the message', () => {
core.warning('\r\nwarning\n')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[warning]%0D%0Awarning%0A${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('debug sets the correct message', () => {
core.debug('Debug')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[debug]Debug${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
it('debug escapes the message', () => {
core.debug('\r\ndebug\n')
2019-05-21 16:34:47 +00:00
assertWriteCalls([`##[debug]%0D%0Adebug%0A${os.EOL}`])
2019-05-21 14:11:39 +00:00
})
})
2019-05-21 16:34:47 +00:00
// Assert that process.stdout.write calls called only with the given arguments.
2019-05-21 21:08:25 +00:00
function assertWriteCalls(calls: string[]): void {
2019-05-21 16:34:47 +00:00
expect(process.stdout.write).toHaveBeenCalledTimes(calls.length)
for (let i = 0; i < calls.length; i++) {
expect(process.stdout.write).toHaveBeenNthCalledWith(i + 1, calls[i])
}
}