Skip to content

Commit 69b2a58

Browse files
committed
[Reporting] convert all server unit tests to TypeScript (elastic#62873)
* [Reporting] convert all server unit tests to TypeScript * fix ts * revert unrelated change
1 parent 3665dfb commit 69b2a58

File tree

9 files changed

+273
-168
lines changed

9 files changed

+273
-168
lines changed

x-pack/legacy/plugins/reporting/export_types/csv/server/execute_job.test.js renamed to x-pack/legacy/plugins/reporting/export_types/csv/server/execute_job.test.ts

Lines changed: 133 additions & 94 deletions
Large diffs are not rendered by default.

x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.js renamed to x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.ts

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@
55
*/
66

77
import * as Rx from 'rxjs';
8-
import { createMockReportingCore } from '../../../../test_helpers';
8+
import { createMockReportingCore, createMockBrowserDriverFactory } from '../../../../test_helpers';
99
import { cryptoFactory } from '../../../../server/lib/crypto';
1010
import { executeJobFactory } from './index';
1111
import { generatePngObservableFactory } from '../lib/generate_png';
12+
import { CancellationToken } from '../../../../common/cancellation_token';
1213
import { LevelLogger } from '../../../../server/lib';
14+
import { ReportingCore, CaptureConfig } from '../../../../server/types';
15+
import { JobDocPayloadPNG } from '../../types';
1316

1417
jest.mock('../lib/generate_png', () => ({ generatePngObservableFactory: jest.fn() }));
1518

16-
let mockReporting;
19+
let mockReporting: ReportingCore;
1720

18-
const cancellationToken = {
21+
const cancellationToken = ({
1922
on: jest.fn(),
20-
};
23+
} as unknown) as CancellationToken;
2124

2225
const mockLoggerFactory = {
2326
get: jest.fn().mockImplementation(() => ({
@@ -28,12 +31,16 @@ const mockLoggerFactory = {
2831
};
2932
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
3033

34+
const captureConfig = {} as CaptureConfig;
35+
3136
const mockEncryptionKey = 'abcabcsecuresecret';
32-
const encryptHeaders = async headers => {
37+
const encryptHeaders = async (headers: Record<string, string>) => {
3338
const crypto = cryptoFactory(mockEncryptionKey);
3439
return await crypto.encrypt(headers);
3540
};
3641

42+
const getJobDocPayload = (baseObj: any) => baseObj as JobDocPayloadPNG;
43+
3744
beforeEach(async () => {
3845
const kbnConfig = {
3946
'server.basePath': '/sbp',
@@ -45,8 +52,8 @@ beforeEach(async () => {
4552
'kibanaServer.protocol': 'http',
4653
};
4754
const mockReportingConfig = {
48-
get: (...keys) => reportingConfig[keys.join('.')],
49-
kbnConfig: { get: (...keys) => kbnConfig[keys.join('.')] },
55+
get: (...keys: string[]) => (reportingConfig as any)[keys.join('.')],
56+
kbnConfig: { get: (...keys: string[]) => (kbnConfig as any)[keys.join('.')] },
5057
};
5158

5259
mockReporting = await createMockReportingCore(mockReportingConfig);
@@ -60,22 +67,30 @@ beforeEach(async () => {
6067
mockGetElasticsearch.mockImplementation(() => Promise.resolve(mockElasticsearch));
6168
mockReporting.getElasticsearchService = mockGetElasticsearch;
6269

63-
generatePngObservableFactory.mockReturnValue(jest.fn());
70+
(generatePngObservableFactory as jest.Mock).mockReturnValue(jest.fn());
6471
});
6572

66-
afterEach(() => generatePngObservableFactory.mockReset());
73+
afterEach(() => (generatePngObservableFactory as jest.Mock).mockReset());
6774

6875
test(`passes browserTimezone to generatePng`, async () => {
6976
const encryptedHeaders = await encryptHeaders({});
77+
const mockBrowserDriverFactory = await createMockBrowserDriverFactory(getMockLogger());
7078

71-
const generatePngObservable = generatePngObservableFactory();
72-
generatePngObservable.mockReturnValue(Rx.of(Buffer.from('')));
79+
const generatePngObservable = generatePngObservableFactory(
80+
captureConfig,
81+
mockBrowserDriverFactory
82+
);
83+
(generatePngObservable as jest.Mock).mockReturnValue(Rx.of(Buffer.from('')));
7384

7485
const executeJob = await executeJobFactory(mockReporting, getMockLogger());
7586
const browserTimezone = 'UTC';
7687
await executeJob(
7788
'pngJobId',
78-
{ relativeUrl: '/app/kibana#/something', browserTimezone, headers: encryptedHeaders },
89+
getJobDocPayload({
90+
relativeUrl: '/app/kibana#/something',
91+
browserTimezone,
92+
headers: encryptedHeaders,
93+
}),
7994
cancellationToken
8095
);
8196

@@ -92,12 +107,17 @@ test(`returns content_type of application/png`, async () => {
92107
const executeJob = await executeJobFactory(mockReporting, getMockLogger());
93108
const encryptedHeaders = await encryptHeaders({});
94109

95-
const generatePngObservable = generatePngObservableFactory();
96-
generatePngObservable.mockReturnValue(Rx.of(Buffer.from('')));
110+
const mockBrowserDriverFactory = await createMockBrowserDriverFactory(getMockLogger());
111+
112+
const generatePngObservable = generatePngObservableFactory(
113+
captureConfig,
114+
mockBrowserDriverFactory
115+
);
116+
(generatePngObservable as jest.Mock).mockReturnValue(Rx.of(Buffer.from('')));
97117

98118
const { content_type: contentType } = await executeJob(
99119
'pngJobId',
100-
{ relativeUrl: '/app/kibana#/something', timeRange: {}, headers: encryptedHeaders },
120+
getJobDocPayload({ relativeUrl: '/app/kibana#/something', headers: encryptedHeaders }),
101121
cancellationToken
102122
);
103123
expect(contentType).toBe('image/png');
@@ -106,14 +126,19 @@ test(`returns content_type of application/png`, async () => {
106126
test(`returns content of generatePng getBuffer base64 encoded`, async () => {
107127
const testContent = 'test content';
108128

109-
const generatePngObservable = generatePngObservableFactory();
110-
generatePngObservable.mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) }));
129+
const mockBrowserDriverFactory = await createMockBrowserDriverFactory(getMockLogger());
130+
131+
const generatePngObservable = generatePngObservableFactory(
132+
captureConfig,
133+
mockBrowserDriverFactory
134+
);
135+
(generatePngObservable as jest.Mock).mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) }));
111136

112137
const executeJob = await executeJobFactory(mockReporting, getMockLogger());
113138
const encryptedHeaders = await encryptHeaders({});
114139
const { content } = await executeJob(
115140
'pngJobId',
116-
{ relativeUrl: '/app/kibana#/something', timeRange: {}, headers: encryptedHeaders },
141+
getJobDocPayload({ relativeUrl: '/app/kibana#/something', headers: encryptedHeaders }),
117142
cancellationToken
118143
);
119144

x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.js renamed to x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.ts

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@
55
*/
66

77
import * as Rx from 'rxjs';
8-
import { createMockReportingCore } from '../../../../test_helpers';
8+
import { createMockReportingCore, createMockBrowserDriverFactory } from '../../../../test_helpers';
99
import { cryptoFactory } from '../../../../server/lib/crypto';
10-
import { executeJobFactory } from './index';
11-
import { generatePdfObservableFactory } from '../lib/generate_pdf';
1210
import { LevelLogger } from '../../../../server/lib';
11+
import { CancellationToken } from '../../../../types';
12+
import { ReportingCore, CaptureConfig } from '../../../../server/types';
13+
import { generatePdfObservableFactory } from '../lib/generate_pdf';
14+
import { JobDocPayloadPDF } from '../../types';
15+
import { executeJobFactory } from './index';
1316

1417
jest.mock('../lib/generate_pdf', () => ({ generatePdfObservableFactory: jest.fn() }));
1518

16-
let mockReporting;
19+
let mockReporting: ReportingCore;
1720

18-
const cancellationToken = {
21+
const cancellationToken = ({
1922
on: jest.fn(),
20-
};
23+
} as unknown) as CancellationToken;
24+
25+
const captureConfig = {} as CaptureConfig;
2126

2227
const mockLoggerFactory = {
2328
get: jest.fn().mockImplementation(() => ({
@@ -29,11 +34,13 @@ const mockLoggerFactory = {
2934
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
3035

3136
const mockEncryptionKey = 'testencryptionkey';
32-
const encryptHeaders = async headers => {
37+
const encryptHeaders = async (headers: Record<string, string>) => {
3338
const crypto = cryptoFactory(mockEncryptionKey);
3439
return await crypto.encrypt(headers);
3540
};
3641

42+
const getJobDocPayload = (baseObj: any) => baseObj as JobDocPayloadPDF;
43+
3744
beforeEach(async () => {
3845
const kbnConfig = {
3946
'server.basePath': '/sbp',
@@ -45,8 +52,8 @@ beforeEach(async () => {
4552
'kibanaServer.protocol': 'http',
4653
};
4754
const mockReportingConfig = {
48-
get: (...keys) => reportingConfig[keys.join('.')],
49-
kbnConfig: { get: (...keys) => kbnConfig[keys.join('.')] },
55+
get: (...keys: string[]) => (reportingConfig as any)[keys.join('.')],
56+
kbnConfig: { get: (...keys: string[]) => (kbnConfig as any)[keys.join('.')] },
5057
};
5158

5259
mockReporting = await createMockReportingCore(mockReportingConfig);
@@ -60,37 +67,46 @@ beforeEach(async () => {
6067
mockGetElasticsearch.mockImplementation(() => Promise.resolve(mockElasticsearch));
6168
mockReporting.getElasticsearchService = mockGetElasticsearch;
6269

63-
generatePdfObservableFactory.mockReturnValue(jest.fn());
70+
(generatePdfObservableFactory as jest.Mock).mockReturnValue(jest.fn());
6471
});
6572

66-
afterEach(() => generatePdfObservableFactory.mockReset());
73+
afterEach(() => (generatePdfObservableFactory as jest.Mock).mockReset());
6774

6875
test(`returns content_type of application/pdf`, async () => {
69-
const executeJob = await executeJobFactory(mockReporting, getMockLogger());
76+
const logger = getMockLogger();
77+
const executeJob = await executeJobFactory(mockReporting, logger);
78+
const mockBrowserDriverFactory = await createMockBrowserDriverFactory(logger);
7079
const encryptedHeaders = await encryptHeaders({});
7180

72-
const generatePdfObservable = generatePdfObservableFactory();
73-
generatePdfObservable.mockReturnValue(Rx.of(Buffer.from('')));
81+
const generatePdfObservable = generatePdfObservableFactory(
82+
captureConfig,
83+
mockBrowserDriverFactory
84+
);
85+
(generatePdfObservable as jest.Mock).mockReturnValue(Rx.of(Buffer.from('')));
7486

7587
const { content_type: contentType } = await executeJob(
7688
'pdfJobId',
77-
{ objects: [], timeRange: {}, headers: encryptedHeaders }, // 7.x and below only
89+
getJobDocPayload({ objects: [], timeRange: {}, headers: encryptedHeaders }), // 7.x and below only
7890
cancellationToken
7991
);
8092
expect(contentType).toBe('application/pdf');
8193
});
8294

8395
test(`returns content of generatePdf getBuffer base64 encoded`, async () => {
8496
const testContent = 'test content';
97+
const mockBrowserDriverFactory = await createMockBrowserDriverFactory(getMockLogger());
8598

86-
const generatePdfObservable = generatePdfObservableFactory();
87-
generatePdfObservable.mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) }));
99+
const generatePdfObservable = generatePdfObservableFactory(
100+
captureConfig,
101+
mockBrowserDriverFactory
102+
);
103+
(generatePdfObservable as jest.Mock).mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) }));
88104

89105
const executeJob = await executeJobFactory(mockReporting, getMockLogger());
90106
const encryptedHeaders = await encryptHeaders({});
91107
const { content } = await executeJob(
92108
'pdfJobId',
93-
{ objects: [], timeRange: {}, headers: encryptedHeaders }, // 7.x and below only
109+
getJobDocPayload({ objects: [], timeRange: {}, headers: encryptedHeaders }), // 7.x and below only
94110
cancellationToken
95111
);
96112

x-pack/legacy/plugins/reporting/index.test.js renamed to x-pack/legacy/plugins/reporting/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const describeWithContext = describe.each([
2727
describeWithContext('config schema with context %j', context => {
2828
it('produces correct config', async () => {
2929
const schema = await getConfigSchema(reporting);
30-
const value = await schema.validate({}, { context });
30+
const value: any = await schema.validate({}, { context });
3131
value.capture.browser.chromium.disableSandbox = '<platform dependent>';
3232
await expect(value).toMatchSnapshot();
3333
});

x-pack/legacy/plugins/reporting/server/routes/jobs.test.js renamed to x-pack/legacy/plugins/reporting/server/routes/jobs.test.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
import Hapi from 'hapi';
88
import { createMockReportingCore } from '../../test_helpers';
9+
import { ExportTypeDefinition } from '../../types';
910
import { ExportTypesRegistry } from '../lib/export_types_registry';
11+
import { LevelLogger } from '../lib/level_logger';
12+
import { ReportingConfig, ReportingCore, ReportingSetupDeps } from '../types';
1013

1114
jest.mock('./lib/authorized_user_pre_routing', () => ({
1215
authorizedUserPreRoutingFactory: () => () => ({}),
@@ -19,14 +22,14 @@ jest.mock('./lib/reporting_feature_pre_routing', () => ({
1922

2023
import { registerJobInfoRoutes } from './jobs';
2124

22-
let mockServer;
23-
let exportTypesRegistry;
24-
let mockReportingPlugin;
25-
let mockReportingConfig;
26-
const mockLogger = {
25+
let mockServer: any;
26+
let exportTypesRegistry: ExportTypesRegistry;
27+
let mockReportingPlugin: ReportingCore;
28+
let mockReportingConfig: ReportingConfig;
29+
const mockLogger = ({
2730
error: jest.fn(),
2831
debug: jest.fn(),
29-
};
32+
} as unknown) as LevelLogger;
3033

3134
beforeEach(async () => {
3235
mockServer = new Hapi.Server({ debug: false, port: 8080, routes: { log: { collect: true } } });
@@ -35,38 +38,39 @@ beforeEach(async () => {
3538
id: 'unencoded',
3639
jobType: 'unencodedJobType',
3740
jobContentExtension: 'csv',
38-
});
41+
} as ExportTypeDefinition<unknown, unknown, unknown, unknown>);
3942
exportTypesRegistry.register({
4043
id: 'base64Encoded',
4144
jobType: 'base64EncodedJobType',
4245
jobContentEncoding: 'base64',
4346
jobContentExtension: 'pdf',
44-
});
47+
} as ExportTypeDefinition<unknown, unknown, unknown, unknown>);
4548

4649
mockReportingConfig = { get: jest.fn(), kbnConfig: { get: jest.fn() } };
4750
mockReportingPlugin = await createMockReportingCore(mockReportingConfig);
4851
mockReportingPlugin.getExportTypesRegistry = () => exportTypesRegistry;
4952
});
5053

51-
const mockPlugins = {
54+
const mockPlugins = ({
5255
elasticsearch: {
5356
adminClient: { callAsInternalUser: jest.fn() },
5457
},
5558
security: null,
56-
};
59+
} as unknown) as ReportingSetupDeps;
5760

58-
const getHits = (...sources) => {
61+
const getHits = (...sources: any) => {
5962
return {
6063
hits: {
61-
hits: sources.map(source => ({ _source: source })),
64+
hits: sources.map((source: object) => ({ _source: source })),
6265
},
6366
};
6467
};
6568

66-
const getErrorsFromRequest = request =>
67-
request.logs.filter(log => log.tags.includes('error')).map(log => log.error);
69+
const getErrorsFromRequest = (request: any) =>
70+
request.logs.filter((log: any) => log.tags.includes('error')).map((log: any) => log.error);
6871

6972
test(`returns 404 if job not found`, async () => {
73+
// @ts-ignore
7074
mockPlugins.elasticsearch.adminClient = {
7175
callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(getHits())),
7276
};
@@ -84,6 +88,7 @@ test(`returns 404 if job not found`, async () => {
8488
});
8589

8690
test(`returns 401 if not valid job type`, async () => {
91+
// @ts-ignore
8792
mockPlugins.elasticsearch.adminClient = {
8893
callAsInternalUser: jest
8994
.fn()
@@ -103,6 +108,7 @@ test(`returns 401 if not valid job type`, async () => {
103108

104109
describe(`when job is incomplete`, () => {
105110
const getIncompleteResponse = async () => {
111+
// @ts-ignore
106112
mockPlugins.elasticsearch.adminClient = {
107113
callAsInternalUser: jest
108114
.fn()
@@ -149,6 +155,7 @@ describe(`when job is failed`, () => {
149155
status: 'failed',
150156
output: { content: 'job failure message' },
151157
});
158+
// @ts-ignore
152159
mockPlugins.elasticsearch.adminClient = {
153160
callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)),
154161
};
@@ -194,6 +201,7 @@ describe(`when job is completed`, () => {
194201
title,
195202
},
196203
});
204+
// @ts-ignore
197205
mockPlugins.elasticsearch.adminClient = {
198206
callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)),
199207
};

0 commit comments

Comments
 (0)