-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Reporting] Fix error handling for job handler in route (#60161)
* fix bogus rison error * add generate route test * update test name
- Loading branch information
Showing
2 changed files
with
147 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
140 changes: 140 additions & 0 deletions
140
x-pack/legacy/plugins/reporting/server/routes/generation.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License; | ||
* you may not use this file except in compliance with the Elastic License. | ||
*/ | ||
|
||
import Hapi from 'hapi'; | ||
import { createMockReportingCore } from '../../test_helpers'; | ||
import { Logger, ServerFacade } from '../../types'; | ||
import { ReportingCore, ReportingSetupDeps } from '../../server/types'; | ||
|
||
jest.mock('./lib/authorized_user_pre_routing', () => ({ | ||
authorizedUserPreRoutingFactory: () => () => ({}), | ||
})); | ||
jest.mock('./lib/reporting_feature_pre_routing', () => ({ | ||
reportingFeaturePreRoutingFactory: () => () => () => ({ | ||
jobTypes: ['unencodedJobType', 'base64EncodedJobType'], | ||
}), | ||
})); | ||
|
||
import { registerJobGenerationRoutes } from './generation'; | ||
|
||
let mockServer: Hapi.Server; | ||
let mockReportingPlugin: ReportingCore; | ||
const mockLogger = ({ | ||
error: jest.fn(), | ||
debug: jest.fn(), | ||
} as unknown) as Logger; | ||
|
||
beforeEach(async () => { | ||
mockServer = new Hapi.Server({ | ||
debug: false, | ||
port: 8080, | ||
routes: { log: { collect: true } }, | ||
}); | ||
mockServer.config = () => ({ get: jest.fn(), has: jest.fn() }); | ||
mockReportingPlugin = await createMockReportingCore(); | ||
mockReportingPlugin.getEnqueueJob = async () => | ||
jest.fn().mockImplementation(() => ({ toJSON: () => '{ "job": "data" }' })); | ||
}); | ||
|
||
const mockPlugins = { | ||
elasticsearch: { | ||
adminClient: { callAsInternalUser: jest.fn() }, | ||
}, | ||
security: null, | ||
}; | ||
|
||
const getErrorsFromRequest = (request: Hapi.Request) => { | ||
// @ts-ignore error property doesn't exist on RequestLog | ||
return request.logs.filter(log => log.tags.includes('error')).map(log => log.error); // NOTE: error stack is available | ||
}; | ||
|
||
test(`returns 400 if there are no job params`, async () => { | ||
registerJobGenerationRoutes( | ||
mockReportingPlugin, | ||
(mockServer as unknown) as ServerFacade, | ||
(mockPlugins as unknown) as ReportingSetupDeps, | ||
mockLogger | ||
); | ||
|
||
const options = { | ||
method: 'POST', | ||
url: '/api/reporting/generate/printablePdf', | ||
}; | ||
|
||
const { payload, request } = await mockServer.inject(options); | ||
expect(payload).toMatchInlineSnapshot( | ||
`"{\\"statusCode\\":400,\\"error\\":\\"Bad Request\\",\\"message\\":\\"A jobParams RISON string is required\\"}"` | ||
); | ||
|
||
const errorLogs = getErrorsFromRequest(request); | ||
expect(errorLogs).toMatchInlineSnapshot(` | ||
Array [ | ||
[Error: A jobParams RISON string is required], | ||
] | ||
`); | ||
}); | ||
|
||
test(`returns 400 if job params is invalid`, async () => { | ||
registerJobGenerationRoutes( | ||
mockReportingPlugin, | ||
(mockServer as unknown) as ServerFacade, | ||
(mockPlugins as unknown) as ReportingSetupDeps, | ||
mockLogger | ||
); | ||
|
||
const options = { | ||
method: 'POST', | ||
url: '/api/reporting/generate/printablePdf', | ||
payload: { jobParams: `foo:` }, | ||
}; | ||
|
||
const { payload, request } = await mockServer.inject(options); | ||
expect(payload).toMatchInlineSnapshot( | ||
`"{\\"statusCode\\":400,\\"error\\":\\"Bad Request\\",\\"message\\":\\"invalid rison: foo:\\"}"` | ||
); | ||
|
||
const errorLogs = getErrorsFromRequest(request); | ||
expect(errorLogs).toMatchInlineSnapshot(` | ||
Array [ | ||
[Error: invalid rison: foo:], | ||
] | ||
`); | ||
}); | ||
|
||
test(`returns 500 if job handler throws an error`, async () => { | ||
mockReportingPlugin.getEnqueueJob = async () => | ||
jest.fn().mockImplementation(() => ({ | ||
toJSON: () => { | ||
throw new Error('you found me'); | ||
}, | ||
})); | ||
|
||
registerJobGenerationRoutes( | ||
mockReportingPlugin, | ||
(mockServer as unknown) as ServerFacade, | ||
(mockPlugins as unknown) as ReportingSetupDeps, | ||
mockLogger | ||
); | ||
|
||
const options = { | ||
method: 'POST', | ||
url: '/api/reporting/generate/printablePdf', | ||
payload: { jobParams: `abc` }, | ||
}; | ||
|
||
const { payload, request } = await mockServer.inject(options); | ||
expect(payload).toMatchInlineSnapshot( | ||
`"{\\"statusCode\\":500,\\"error\\":\\"Internal Server Error\\",\\"message\\":\\"An internal server error occurred\\"}"` | ||
); | ||
|
||
const errorLogs = getErrorsFromRequest(request); | ||
expect(errorLogs).toMatchInlineSnapshot(` | ||
Array [ | ||
[Error: you found me], | ||
[Error: you found me], | ||
] | ||
`); | ||
}); |