Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Reporting/New Platform] Provide async access to server-side dependencies #56824

Merged
merged 12 commits into from
Feb 14, 2020
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

import { cryptoFactory } from '../../../server/lib/crypto';
import { createMockServer } from '../../../test_helpers/create_mock_server';
import { createMockServer } from '../../../test_helpers';
import { Logger } from '../../../types';
import { decryptJobHeaders } from './decrypt_job_headers';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { createMockServer } from '../../../test_helpers/create_mock_server';
import { getConditionalHeaders, getCustomLogo } from './index';
import { createMockReportingPlugin, createMockServer } from '../../../test_helpers';
import { JobDocPayload } from '../../../types';
import { JobDocPayloadPDF } from '../../printable_pdf/types';
import { getConditionalHeaders, getCustomLogo } from './index';

let mockReportingPlugin: any;
let mockServer: any;
beforeEach(() => {
beforeEach(async () => {
mockReportingPlugin = createMockReportingPlugin();
mockServer = createMockServer('');
});

Expand Down Expand Up @@ -148,56 +150,84 @@ describe('conditions', () => {
});

test('uses basePath from job when creating saved object service', async () => {
const logo = 'custom-logo';
const mockUiSettingsClient = { get: () => Promise.resolve(logo) };
mockReportingPlugin.getUiSettingsServiceFactory = jest
.fn()
.mockResolvedValueOnce(mockUiSettingsClient);
mockReportingPlugin.getSavedObjectsClient = jest.fn();

const permittedHeaders = {
foo: 'bar',
baz: 'quix',
};

const conditionalHeaders = await getConditionalHeaders({
job: {} as JobDocPayload<any>,
filteredHeaders: permittedHeaders,
server: mockServer,
});

const logo = 'custom-logo';
mockServer.uiSettingsServiceFactory().get.mockReturnValue(logo);

const jobBasePath = '/sbp/s/marketing';
await getCustomLogo({
reporting: mockReportingPlugin,
job: { basePath: jobBasePath } as JobDocPayloadPDF,
conditionalHeaders,
server: mockServer,
});

expect(mockServer.savedObjects.getScopedSavedObjectsClient.mock.calls[0][0].getBasePath()).toBe(
jobBasePath
);
const getBasePath = mockReportingPlugin.getSavedObjectsClient.mock.calls[0][0].getBasePath;
expect(getBasePath()).toBe(jobBasePath);
});

test(`uses basePath from server if job doesn't have a basePath when creating saved object service`, async () => {
const logo = 'custom-logo';
const mockUiSettingsClient = { get: () => Promise.resolve(logo) };
mockReportingPlugin.getUiSettingsServiceFactory = jest
.fn()
.mockResolvedValueOnce(mockUiSettingsClient);
mockReportingPlugin.getSavedObjectsClient = jest.fn();

const permittedHeaders = {
foo: 'bar',
baz: 'quix',
};

const conditionalHeaders = await getConditionalHeaders({
job: {} as JobDocPayload<any>,
filteredHeaders: permittedHeaders,
server: mockServer,
});

const logo = 'custom-logo';
mockServer.uiSettingsServiceFactory().get.mockReturnValue(logo);

await getCustomLogo({
reporting: mockReportingPlugin,
job: {} as JobDocPayloadPDF,
conditionalHeaders,
server: mockServer,
});

expect(mockServer.savedObjects.getScopedSavedObjectsClient.mock.calls[0][0].getBasePath()).toBe(
'/sbp'
);
const getBasePath = mockReportingPlugin.getSavedObjectsClient.mock.calls[0][0].getBasePath;
expect(getBasePath()).toBe(`/sbp`);
expect(mockReportingPlugin.getSavedObjectsClient.mock.calls[0]).toMatchInlineSnapshot(`
Array [
Object {
"getBasePath": [Function],
"headers": Object {
"baz": "quix",
"foo": "bar",
},
"path": "/",
"raw": Object {
"req": Object {
"url": "/",
},
},
"route": Object {
"settings": Object {},
},
"url": Object {
"href": "/",
},
},
]
`);
});

describe('config formatting', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { createMockServer } from '../../../test_helpers/create_mock_server';
import { getConditionalHeaders, getCustomLogo } from './index';
import { ReportingPlugin } from '../../../server/plugin';
import { createMockReportingPlugin, createMockServer } from '../../../test_helpers';
import { ServerFacade } from '../../../types';
import { JobDocPayloadPDF } from '../../printable_pdf/types';
import { getConditionalHeaders, getCustomLogo } from './index';

let mockServer: any;
beforeEach(() => {
let mockReportingPlugin: ReportingPlugin;
let mockServer: ServerFacade;
beforeEach(async () => {
mockReportingPlugin = await createMockReportingPlugin();
mockServer = createMockServer('');
});

Expand All @@ -19,19 +23,30 @@ test(`gets logo from uiSettings`, async () => {
baz: 'quix',
};

const mockGet = jest.fn();
mockGet.mockImplementationOnce((...args: any[]) => {
if (args[0] === 'xpackReporting:customPdfLogo') {
return 'purple pony';
}
throw new Error('wrong caller args!');
});
mockReportingPlugin.getUiSettingsServiceFactory = jest.fn().mockResolvedValue({
get: mockGet,
});

const conditionalHeaders = await getConditionalHeaders({
job: {} as JobDocPayloadPDF,
filteredHeaders: permittedHeaders,
server: mockServer,
});

const { logo } = await getCustomLogo({
reporting: mockReportingPlugin,
job: {} as JobDocPayloadPDF,
conditionalHeaders,
server: mockServer,
});

mockServer.uiSettingsServiceFactory().get.mockReturnValue(logo);

expect(mockServer.uiSettingsServiceFactory().get).toBeCalledWith('xpackReporting:customPdfLogo');
expect(mockGet).toBeCalledWith('xpackReporting:customPdfLogo');
expect(logo).toBe('purple pony');
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@
*/

import { UI_SETTINGS_CUSTOM_PDF_LOGO } from '../../../common/constants';
import { ReportingPlugin } from '../../../server/plugin';
import { ConditionalHeaders, ServerFacade } from '../../../types';
import { JobDocPayloadPDF } from '../../printable_pdf/types'; // Logo is PDF only

export const getCustomLogo = async ({
reporting,
server,
job,
conditionalHeaders,
}: {
reporting: ReportingPlugin;
server: ServerFacade;
job: JobDocPayloadPDF;
conditionalHeaders: ConditionalHeaders;
Expand All @@ -27,19 +30,12 @@ export const getCustomLogo = async ({
getBasePath: () => job.basePath || serverBasePath,
path: '/',
route: { settings: {} },
url: {
href: '/',
},
raw: {
req: {
url: '/',
},
},
url: { href: '/' },
raw: { req: { url: '/' } },
};

const savedObjects = server.savedObjects;
const savedObjectsClient = savedObjects.getScopedSavedObjectsClient(fakeRequest);
const uiSettings = server.uiSettingsServiceFactory({ savedObjectsClient });
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed legacy dependency here

const savedObjectsClient = await reporting.getSavedObjectsClient(fakeRequest);
const uiSettings = await reporting.getUiSettingsServiceFactory(savedObjectsClient);
const logo: string = await uiSettings.get(UI_SETTINGS_CUSTOM_PDF_LOGO);
return { conditionalHeaders, logo };
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { createMockServer } from '../../../test_helpers/create_mock_server';
import { createMockServer } from '../../../test_helpers';
import { ServerFacade } from '../../../types';
import { JobDocPayloadPNG } from '../../png/types';
import { JobDocPayloadPDF } from '../../printable_pdf/types';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
*/

import * as Rx from 'rxjs';
import { first, concatMap, take, toArray, mergeMap } from 'rxjs/operators';
import { ServerFacade, CaptureConfig, HeadlessChromiumDriverFactory } from '../../../../types';
import { ScreenshotResults, ScreenshotObservableOpts } from './types';
import { injectCustomCss } from './inject_css';
import { openUrl } from './open_url';
import { waitForRenderComplete } from './wait_for_render';
import { getNumberOfItems } from './get_number_of_items';
import { waitForElementsToBeInDOM } from './wait_for_dom_elements';
import { getTimeRange } from './get_time_range';
import { concatMap, first, mergeMap, take, toArray } from 'rxjs/operators';
import { CaptureConfig, HeadlessChromiumDriverFactory, ServerFacade } from '../../../../types';
import { getElementPositionAndAttributes } from './get_element_position_data';
import { getNumberOfItems } from './get_number_of_items';
import { getScreenshots } from './get_screenshots';
import { getTimeRange } from './get_time_range';
import { injectCustomCss } from './inject_css';
import { openUrl } from './open_url';
import { scanPage } from './scan_page';
import { skipTelemetry } from './skip_telemetry';
import { ScreenshotObservableOpts, ScreenshotResults } from './types';
import { waitForElementsToBeInDOM } from './wait_for_dom_elements';
import { waitForRenderComplete } from './wait_for_render';

export function screenshotsObservableFactory(
server: ServerFacade,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ import {
ESQueueCreateJobFn,
} from '../../../types';
import { JobParamsDiscoverCsv } from '../types';
import { ReportingPlugin } from '../../../server/plugin';

export const createJobFactory: CreateJobFactory<ESQueueCreateJobFn<
JobParamsDiscoverCsv
>> = function createJobFactoryFn(server: ServerFacade) {
>> = function createJobFactoryFn(reporting: ReportingPlugin, server: ServerFacade) {
const crypto = cryptoFactory(server);

return async function createJob(
Expand Down
Loading