1 | import catchErrors from './catch-errors'
|
2 | import logger from './logger'
|
3 |
|
4 | describe('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 |
|
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 |
|
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 |
|
36 | })
|
37 | const reason = new Error()
|
38 | const promise = new Promise(() => {
|
39 |
|
40 | })
|
41 | process.emit('unhandledRejection', reason, promise)
|
42 |
|
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 | })
|