1
0
Fork 0

Make use of @actions/exit in @actions/toolkit

pull/1/head
Jonathan Clem 2019-04-20 10:54:42 -04:00
parent cca9523c73
commit b3e79eb868
No known key found for this signature in database
GPG Key ID: 48C5B22E9FD6E80F
4 changed files with 73 additions and 83 deletions

View File

@ -1,36 +1,37 @@
import * as exitPkg from '@actions/exit'
import {Signale} from 'signale'
import {Exit, ExitCode} from '../src/exit'
import {Exit} from '../src/exit'
describe('Exit', () => {
const tests: [keyof Exit, keyof Signale, ExitCode][] = [
['success', 'success', ExitCode.Success],
['neutral', 'info', ExitCode.Neutral],
['failure', 'fatal', ExitCode.Failure]
]
jest.mock('@actions/exit')
describe.each(tests)('%s', (method, log, code) => {
let logger: Signale
let exit: Exit
const tests: [keyof Exit, keyof Signale][] = [
['success', 'success'],
['neutral', 'info'],
['failure', 'fatal']
]
beforeEach(() => {
// Create a logger to mock
logger = new Signale()
logger.success = jest.fn()
logger.info = jest.fn()
logger.fatal = jest.fn()
describe.each(tests)('%s', (method, log) => {
let logger: Signale
let exit: Exit
process.exit = jest.fn<never, [number]>()
exit = new Exit(logger)
})
beforeEach(() => {
// Create a logger to mock
logger = new Signale()
logger.success = jest.fn()
logger.info = jest.fn()
logger.fatal = jest.fn()
it('exits with the expected code', () => {
exit[method]()
expect(process.exit).toHaveBeenCalledWith(code)
})
process.exit = jest.fn<never, [number]>()
exit = new Exit(logger)
})
it('logs the expected message', () => {
exit[method]('hello')
expect(logger[log]).toHaveBeenCalledWith('hello')
})
it('exits with the expected method', () => {
exit[method]()
expect(exitPkg[method]).toHaveBeenCalled()
})
it('logs the expected message', () => {
exit[method]('hello')
expect(logger[log]).toHaveBeenCalledWith('hello')
})
})

View File

@ -1,50 +1,50 @@
import * as exitPkg from '@actions/exit'
import {Signale} from 'signale'
import {ExitCode} from '../src/exit'
import {Toolkit} from '../src/toolkit'
describe('Toolkit', () => {
describe('.run', () => {
it('runs a sync function', async () => {
const cb = jest.fn(() => true)
const value = await Toolkit.run(cb)
expect(cb).toHaveBeenCalledWith(expect.any(Toolkit))
expect(value).toBe(true)
})
jest.mock('@actions/exit')
it('runs an async function', async () => {
const cb = jest.fn(async () => true)
const value = await Toolkit.run(cb)
expect(cb).toHaveBeenCalledWith(expect.any(Toolkit))
expect(value).toBe(true)
})
it('logs and fails when an error occurs', async () => {
const err = new Error()
const exitFailure = jest.fn()
await Toolkit.run(async tk => {
tk.exit.failure = exitFailure
throw err
})
expect(exitFailure).toHaveBeenCalledWith(err)
})
describe('.run', () => {
it('runs a sync function', async () => {
const cb = jest.fn(() => true)
const value = await Toolkit.run(cb)
expect(cb).toHaveBeenCalledWith(expect.any(Toolkit))
expect(value).toBe(true)
})
it('asserts required keys are present', async () => {
const missingKey = '__DOES_NOT_EXIST__'
it('runs an async function', async () => {
const cb = jest.fn(async () => true)
const value = await Toolkit.run(cb)
expect(cb).toHaveBeenCalledWith(expect.any(Toolkit))
expect(value).toBe(true)
})
Reflect.deleteProperty(process.env, missingKey)
it('logs and fails when an error occurs', async () => {
const err = new Error()
const exitFailure = jest.fn()
const logger = new Signale()
logger.fatal = jest.fn()
jest.spyOn(process, 'exit').mockImplementation()
await Toolkit.run(async tk => {
tk.exit.failure = exitFailure
throw err
})
new Toolkit({logger, requiredEnv: [missingKey]})
expect(process.exit).toHaveBeenCalledWith(ExitCode.Failure)
expect(logger.fatal)
.toHaveBeenCalledWith(`The following environment variables are required for this action to run:
- __DOES_NOT_EXIST__`)
expect(exitFailure).toHaveBeenCalledWith(err)
})
})
it('asserts required keys are present', async () => {
const missingKey = '__DOES_NOT_EXIST__'
Reflect.deleteProperty(process.env, missingKey)
const logger = new Signale()
logger.fatal = jest.fn()
jest.spyOn(process, 'exit').mockImplementation()
new Toolkit({logger, requiredEnv: [missingKey]})
expect(exitPkg.failure).toHaveBeenCalled()
expect(logger.fatal)
.toHaveBeenCalledWith(`The following environment variables are required for this action to run:
- __DOES_NOT_EXIST__`)
})

View File

@ -31,8 +31,8 @@
"url": "https://github.com/actions/toolkit/issues"
},
"dependencies": {
"@actions/exit": "^0.0.0",
"@octokit/rest": "^16.25.0",
"signale": "^1.4.0"
},
"devDependencies": {}
}
}

View File

@ -1,17 +1,6 @@
import * as exit from '@actions/exit'
import {Signale} from 'signale'
/**
* The code to exit an action
*/
export enum ExitCode {
Success = 0,
Failure = 1,
Neutral = 78
}
// TODO: These exit codes may not behave as expected on the new runtime, due to
// complexities of async logging and sync exiting.
/**
* A class that wraps some basic methods of exiting from an action
*/
@ -23,7 +12,7 @@ export class Exit {
*/
success(message?: string) {
if (message) this.logger.success(message)
process.exit(ExitCode.Success)
exit.success()
}
/**
@ -31,7 +20,7 @@ export class Exit {
*/
neutral(message?: string) {
if (message) this.logger.info(message)
process.exit(ExitCode.Neutral)
exit.neutral()
}
/**
@ -39,6 +28,6 @@ export class Exit {
*/
failure(message?: string) {
if (message) this.logger.fatal(message)
process.exit(ExitCode.Failure)
exit.failure()
}
}