UNPKG

1.53 kBPlain TextView Raw
1import catchErrors from './catch-errors'
2import logger from './logger'
3
4describe('catch errors', () => {
5 let reset: () => void
6 let closeHandler: jest.Mock<{}>
7
8 beforeEach(() => {
9 closeHandler = jest.fn().mockResolvedValue(undefined)
10 jest.spyOn(logger, 'fatal').mockReturnValue(undefined)
11 jest.spyOn(process, 'exit').mockImplementation(() => {
12 /* noop */
13 })
14 reset = catchErrors([closeHandler])
15 })
16
17 afterEach(() => {
18 reset()
19 jest.restoreAllMocks()
20 })
21
22 it('should catch uncaught exceptions and exit the process', async () => {
23 const err = new Error()
24 process.emit('uncaughtException', err)
25 // wait for promises
26 await new Promise((resolve) => setImmediate(resolve))
27 expect(logger.fatal).toHaveBeenCalledWith(err, 'uncaught exception')
28 expect(closeHandler).toHaveBeenCalled()
29 expect(process.exit).toHaveBeenCalledWith(1)
30 })
31
32 it('should catch unhandled promise rejections', async () => {
33 jest.spyOn(logger, 'fatal').mockReturnValue(undefined)
34 jest.spyOn(process, 'exit').mockImplementation(() => {
35 /* noop */
36 })
37 const reason = new Error()
38 const promise = new Promise(() => {
39 /* don't care */
40 })
41 process.emit('unhandledRejection', reason, promise)
42 // wait for promises
43 await new Promise((resolve) => setImmediate(resolve))
44 expect(logger.fatal).toHaveBeenCalledWith(reason, 'unhandled promise rejection')
45 expect(closeHandler).toHaveBeenCalled()
46 expect(process.exit).toHaveBeenCalledWith(1)
47 })
48})