Skip to content

Commit

Permalink
Typescripted the common functions and broke out tests to individual t…
Browse files Browse the repository at this point in the history
…est files
  • Loading branch information
bgaddis56 committed Nov 8, 2018
1 parent 28b8a68 commit bf8d7e8
Show file tree
Hide file tree
Showing 15 changed files with 662 additions and 350 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* 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 { memoize } from 'lodash';
// import { KbnServer } from '../../../types';
import { addForceNowQuerystring } from './index';

let config: any;
let mockServer: any;
beforeEach(() => {
config = {
'xpack.reporting.encryptionKey': 'testencryptionkey',
'server.basePath': '/sbp',
'server.host': 'localhost',
'server.port': 5601,
};
mockServer = {
expose: () => {
' ';
},
config: memoize(() => ({ get: jest.fn() })),
info: {
protocol: 'http',
},
plugins: {
elasticsearch: {
getCluster: memoize(() => {
return {
callWithRequest: jest.fn(),
};
}),
},
},
savedObjects: {
getScopedSavedObjectsClient: jest.fn(),
},
uiSettingsServiceFactory: jest.fn().mockReturnValue({ get: jest.fn() }),
};

mockServer.config().get.mockImplementation((key: any) => {
return config[key];
});
});

test(`fails if no URL is passed`, async () => {
await expect(
addForceNowQuerystring({
job: {},
server: mockServer,
})
).rejects.toBeDefined();
});

test(`adds forceNow to hash's query, if it exists`, async () => {
const forceNow = '2000-01-01T00:00:00.000Z';
const { urls } = await addForceNowQuerystring({
job: { relativeUrl: '/app/kibana#/something', forceNow },
server: mockServer,
});

expect(urls[0]).toEqual(
'http://localhost:5601/sbp/app/kibana#/something?forceNow=2000-01-01T00%3A00%3A00.000Z'
);
});

test(`appends forceNow to hash's query, if it exists`, async () => {
const forceNow = '2000-01-01T00:00:00.000Z';

const { urls } = await addForceNowQuerystring({
job: {
relativeUrl: '/app/kibana#/something?_g=something',
forceNow,
},
server: mockServer,
});

expect(urls[0]).toEqual(
'http://localhost:5601/sbp/app/kibana#/something?_g=something&forceNow=2000-01-01T00%3A00%3A00.000Z'
);
});

test(`doesn't append forceNow query to url, if it doesn't exists`, async () => {
const { urls } = await addForceNowQuerystring({
job: {
relativeUrl: '/app/kibana#/something',
},
server: mockServer,
});

expect(urls[0]).toEqual('http://localhost:5601/sbp/app/kibana#/something');
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// @ts-ignore
import url from 'url';
import { ConditionalHeaders, KbnServer, ReportingJob } from '../../../types';
import { getAbsoluteUrlFactory } from './get_absolute_url';

function getSavedObjectAbsoluteUrl(job, relativeUrl, server) {
const getAbsoluteUrl = getAbsoluteUrlFactory(server);
function getSavedObjectAbsoluteUrl(job: ReportingJob, relativeUrl: string, server: KbnServer) {
const getAbsoluteUrl: any = getAbsoluteUrlFactory(server);

if (relativeUrl) {
const { pathname: path, hash, search } = url.parse(relativeUrl);
Expand All @@ -17,37 +19,46 @@ function getSavedObjectAbsoluteUrl(job, relativeUrl, server) {
throw new Error(`Unable to generate report. Url is not defined.`);
}

export const addForceNowQuerystring = async ({ job, conditionalHeaders, logo, server }) => {

//if no URLS then its from PNG which should only have one so put it in the array and process as PDF does
export const addForceNowQuerystring = async ({
job,
conditionalHeaders,
logo,
server,
}: {
job: ReportingJob;
conditionalHeaders?: ConditionalHeaders;
logo?: any;
server: KbnServer;
}) => {
// if no URLS then its from PNG which should only have one so put it in the array and process as PDF does
if (!job.urls) {
if (!job.relativeUrl) {
throw new Error(`Unable to generate report. Url is not defined.`);}
throw new Error(`Unable to generate report. Url is not defined.`);
}
job.urls = [getSavedObjectAbsoluteUrl(job, job.relativeUrl, server)];
}

const urls = job.urls.map(jobUrl => {
if (!job.forceNow) {
return jobUrl;
return jobUrl;
}

const parsed = url.parse(jobUrl, true);
const hash = url.parse(parsed.hash.replace(/^#/, ''), true);
const parsed: any = url.parse(jobUrl, true);
const hash: any = url.parse(parsed.hash.replace(/^#/, ''), true);

const transformedHash = url.format({
pathname: hash.pathname,
query: {
...hash.query,
forceNow: job.forceNow
}
forceNow: job.forceNow,
},
});

return url.format({
...parsed,
hash: transformedHash
hash: transformedHash,
});
});

return { job, conditionalHeaders, logo, urls, server };

};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* 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 { memoize } from 'lodash';
// @ts-ignore
import { cryptoFactory } from '../../../server/lib/crypto';
import { decryptJobHeaders } from './index';

let config: any;
let mockServer: any;
beforeEach(() => {
config = {
'xpack.reporting.encryptionKey': 'testencryptionkey',
'server.basePath': '/sbp',
'server.host': 'localhost',
'server.port': 5601,
};
mockServer = {
expose: () => {
' ';
},
config: memoize(() => ({ get: jest.fn() })),
info: {
protocol: 'http',
},
plugins: {
elasticsearch: {
getCluster: memoize(() => {
return {
callWithRequest: jest.fn(),
};
}),
},
},
savedObjects: {
getScopedSavedObjectsClient: jest.fn(),
},
uiSettingsServiceFactory: jest.fn().mockReturnValue({ get: jest.fn() }),
};

mockServer.config().get.mockImplementation((key: any) => {
return config[key];
});
});

const encryptHeaders = async (headers: Record<string, string>) => {
const crypto = cryptoFactory(mockServer);
return await crypto.encrypt(headers);
};

describe('headers', () => {
test(`fails if it can't decrypt headers`, async () => {
await expect(
decryptJobHeaders({
job: { relativeUrl: '/app/kibana#/something', timeRange: {} },
server: mockServer,
})
).rejects.toBeDefined();
});

test(`passes back decrypted headers that were passed in`, async () => {
const headers = {
foo: 'bar',
baz: 'quix',
};

const encryptedHeaders = await encryptHeaders(headers);
const { decryptedHeaders } = await decryptJobHeaders({
job: { relativeUrl: '/app/kibana#/something', headers: encryptedHeaders },
server: mockServer,
});
expect(decryptedHeaders).toEqual(headers);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,18 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// @ts-ignore
import { cryptoFactory } from '../../../server/lib/crypto';
import { CryptoFactory, KbnServer, ReportingJob } from '../../../types';

export const decryptJobHeaders = async ({ job, server }) => {
const crypto = cryptoFactory(server);
const decryptedHeaders = await crypto.decrypt(job.headers);
export const decryptJobHeaders = async ({
job,
server,
}: {
job: ReportingJob;
server: KbnServer;
}) => {
const crypto: CryptoFactory = cryptoFactory(server);
const decryptedHeaders: string = await crypto.decrypt(job.headers);
return { job, decryptedHeaders, server };
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,26 @@
import { memoize } from 'lodash';
import { getAbsoluteUrlFactory } from './get_absolute_url';

const createMockServer = ({ settings = {} } = {}) => {
const createMockServer = ({ settings = {} }: any) => {
const mockServer = {
expose: () => {},
expose: () => {
'';
},
config: memoize(() => {
return {
get: jest.fn()
get: jest.fn(),
};
}),
info: {
protocol: 'http'
}
protocol: 'http',
},
};

const defaultSettings = {
const defaultSettings: any = {
'server.host': 'something',
'server.port': 8080,
'server.basePath': '/tst',
'xpack.reporting.kibanaServer': {}
'xpack.reporting.kibanaServer': {},
};
mockServer.config().get.mockImplementation(key => {
return key in settings ? settings[key] : defaultSettings[key];
Expand All @@ -34,16 +36,15 @@ const createMockServer = ({ settings = {} } = {}) => {
};

test(`by default it builds url using information from server.info.protocol and the server.config`, () => {
const mockServer = createMockServer();

const mockServer = createMockServer('');
const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const absoluteUrl = getAbsoluteUrl();
expect(absoluteUrl).toBe(`http://something:8080/tst/app/kibana`);
});

test(`uses kibanaServer.protocol if specified`, () => {
const settings = {
'xpack.reporting.kibanaServer.protocol': 'https'
'xpack.reporting.kibanaServer.protocol': 'https',
};
const mockServer = createMockServer({ settings });

Expand All @@ -54,7 +55,7 @@ test(`uses kibanaServer.protocol if specified`, () => {

test(`uses kibanaServer.hostname if specified`, () => {
const settings = {
'xpack.reporting.kibanaServer.hostname': 'something-else'
'xpack.reporting.kibanaServer.hostname': 'something-else',
};
const mockServer = createMockServer({ settings });

Expand All @@ -65,7 +66,7 @@ test(`uses kibanaServer.hostname if specified`, () => {

test(`uses kibanaServer.port if specified`, () => {
const settings = {
'xpack.reporting.kibanaServer.port': 8008
'xpack.reporting.kibanaServer.port': 8008,
};
const mockServer = createMockServer({ settings });

Expand All @@ -75,7 +76,7 @@ test(`uses kibanaServer.port if specified`, () => {
});

test(`uses the provided hash`, () => {
const mockServer = createMockServer();
const mockServer = createMockServer('');

const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const hash = '/hash';
Expand All @@ -84,7 +85,7 @@ test(`uses the provided hash`, () => {
});

test(`uses the provided hash with queryString`, () => {
const mockServer = createMockServer();
const mockServer = createMockServer('');

const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const hash = '/hash?querystring';
Expand All @@ -93,15 +94,15 @@ test(`uses the provided hash with queryString`, () => {
});

test(`uses the provided basePath`, () => {
const mockServer = createMockServer();
const mockServer = createMockServer('');

const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const absoluteUrl = getAbsoluteUrl({ basePath: '/s/marketing' });
expect(absoluteUrl).toBe(`http://something:8080/s/marketing/app/kibana`);
});

test(`uses the path`, () => {
const mockServer = createMockServer();
const mockServer = createMockServer('');

const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const path = '/app/canvas';
Expand All @@ -110,12 +111,10 @@ test(`uses the path`, () => {
});

test(`uses the search`, () => {
const mockServer = createMockServer();
const mockServer = createMockServer('');

const getAbsoluteUrl = getAbsoluteUrlFactory(mockServer);
const search = '_t=123456789';
const absoluteUrl = getAbsoluteUrl({ search });
expect(absoluteUrl).toBe(`http://something:8080/tst/app/kibana?${search}`);
});


Loading

0 comments on commit bf8d7e8

Please sign in to comment.