Skip to content

Commit

Permalink
add fn api test
Browse files Browse the repository at this point in the history
  • Loading branch information
tsullivan committed Aug 18, 2020
1 parent c05575f commit 1e0a49f
Show file tree
Hide file tree
Showing 13 changed files with 196 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
*/

import { RequestHandler, RouteMethod } from 'src/core/server';
import { AuthenticatedUser } from '../../../../security/server';
import { ReportingCore } from '../../core';
import { ReportingUser } from '../../types';
import { getUserFactory } from './get_user';

const superuserRole = 'superuser';

type ReportingRequestUser = AuthenticatedUser | false;
export type RequestHandlerUser<P, Q, B> = RequestHandler<P, Q, B> extends (...a: infer U) => infer R
? (user: ReportingUser, ...a: U) => R
? (user: ReportingRequestUser, ...a: U) => R
: never;

export const authorizedUserPreRoutingFactory = function authorizedUserPreRoutingFn(
Expand All @@ -22,7 +23,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting
const getUser = getUserFactory(setupDeps.security);
return <P, Q, B>(handler: RequestHandlerUser<P, Q, B>): RequestHandler<P, Q, B, RouteMethod> => {
return (context, req, res) => {
let user: ReportingUser = false;
let user: ReportingRequestUser = false;
if (setupDeps.security && setupDeps.security.license.isEnabled()) {
// find the authenticated user, or null if security is not enabled
user = getUser(req);
Expand Down
3 changes: 2 additions & 1 deletion x-pack/scripts/functional_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ const onlyNotInCoverageTests = [
require.resolve('../test/licensing_plugin/config.public.ts'),
require.resolve('../test/licensing_plugin/config.legacy.ts'),
require.resolve('../test/endpoint_api_integration_no_ingest/config.ts'),
require.resolve('../test/reporting_api_integration/config.js'),
require.resolve('../test/reporting_api_integration/reporting_and_security/config.ts'),
require.resolve('../test/reporting_api_integration/reporting_without_security/config.ts'),
require.resolve('../test/security_solution_endpoint_api_int/config.ts'),
require.resolve('../test/ingest_manager_api_integration/config.ts'),
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
*/

import { esTestConfig, kbnTestConfig, kibanaServerTestUser } from '@kbn/test';
import { FtrConfigProviderContext } from '@kbn/test/types/ftr';
import { format as formatUrl } from 'url';
import { ReportingAPIProvider } from './services';

export default async function ({ readConfigFile }) {
export default async function ({ readConfigFile }: FtrConfigProviderContext) {
const apiConfig = await readConfigFile(require.resolve('../api_integration/config'));
const functionalConfig = await readConfigFile(require.resolve('../functional/config')); // Reporting API tests need a fully working UI

Expand All @@ -23,7 +24,7 @@ export default async function ({ readConfigFile }) {
return {
servers: apiConfig.get('servers'),
junit: { reportName: 'X-Pack Reporting API Integration Tests' },
testFiles: [require.resolve('./reporting')],
testFiles: [require.resolve('./reporting_and_security')],
services: {
...apiConfig.get('services'),
reportingAPI: ReportingAPIProvider,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* 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 { esTestConfig, kbnTestConfig } from '@kbn/test';
import { FtrConfigProviderContext } from '@kbn/test/types/ftr';
import { format as formatUrl } from 'url';
import { ReportingAPIProvider } from './services';

export default async function ({ readConfigFile }: FtrConfigProviderContext) {
const apiConfig = await readConfigFile(require.resolve('../api_integration/config'));

return {
servers: apiConfig.get('servers'),
junit: { reportName: 'X-Pack Reporting Without Security API Integration Tests' },
testFiles: [require.resolve('./reporting_without_security')],
services: {
...apiConfig.get('services'),
reportingAPI: ReportingAPIProvider,
},
esArchiver: apiConfig.get('esArchiver'),
esTestCluster: {
...apiConfig.get('esTestCluster'),
serverArgs: [
...apiConfig.get('esTestCluster.serverArgs'),
'node.name=UnsecuredClusterNode01',
'xpack.security.enabled=false',
],
},
kbnTestServer: {
...apiConfig.get('kbnTestServer'),
serverArgs: [
`--elasticsearch.hosts=${formatUrl(esTestConfig.getUrlParts())}`,
`--logging.json=false`,
`--server.maxPayloadBytes=1679958`,
`--server.port=${kbnTestConfig.getPort()}`,
`--xpack.reporting.capture.maxAttempts=1`,
`--xpack.reporting.csv.maxSizeBytes=2850`,
`--xpack.security.enabled=false`,
],
},
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* 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 { FtrProviderContext } from '../ftr_provider_context';

// eslint-disable-next-line import/no-default-export
export default function ({ loadTestFile }: FtrProviderContext) {
describe('Reporting APIs', function () {
this.tags('ciGroup2');
loadTestFile(require.resolve('./job_apis'));
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/*
* 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 expect from '@kbn/expect';
import { forOwn } from 'lodash';
import { JOB_PARAMS_RISON } from '../fixtures';
import { FtrProviderContext } from '../ftr_provider_context';

// eslint-disable-next-line import/no-default-export
export default function ({ getService }: FtrProviderContext) {
const esArchiver = getService('esArchiver');
const supertestNoAuth = getService('supertestWithoutAuth');
const reportingAPI = getService('reportingAPI');

describe('Job Listing APIs, Without Security', () => {
before(async () => {
await esArchiver.load('reporting/logs');
await esArchiver.load('logstash_functional');
});

after(async () => {
await esArchiver.unload('reporting/logs');
await esArchiver.unload('logstash_functional');
});

afterEach(async () => {
await reportingAPI.deleteAllReports();
});

it('Posted CSV job is visible in the job count', async () => {
const { status: resStatus, text: resText } = await supertestNoAuth
.post(`/api/reporting/generate/csv`)
.set('kbn-xsrf', 'xxx')
.send({ jobParams: JOB_PARAMS_RISON });

expect(resStatus).to.be(200);

const { job: resJob } = JSON.parse(resText);
const expectedResJob: Record<string, any> = {
attempts: 0,
created_by: false,
jobtype: 'csv',
max_attempts: 1,
priority: 10,
status: 'pending',
timeout: 120000,
browser_type: 'chromium', // TODO: remove this field from the API response
// TODO: remove the payload field from the api respones
};
forOwn(expectedResJob, (value: any, key: string) => {
expect(resJob[key]).to.eql(value, key);
});

// call the job count api
const { text: countText } = await supertestNoAuth
.get(`/api/reporting/jobs/count`)
.set('kbn-xsrf', 'xxx');

const countResult = JSON.parse(countText);
expect(countResult).to.be(1);
});

it('Posted CSV job is visible in the status check', async () => {
const { status: resStatus, text: resText } = await supertestNoAuth
.post(`/api/reporting/generate/csv`)
.set('kbn-xsrf', 'xxx')
.send({ jobParams: JOB_PARAMS_RISON });

expect(resStatus).to.be(200);

const { job: resJob } = JSON.parse(resText);
// call the single job listing api (status check)
const { text: listText } = await supertestNoAuth
.get(`/api/reporting/jobs/list?page=0&ids=${resJob.id}`)
.set('kbn-xsrf', 'xxx');

const listingJobs = JSON.parse(listText);
const expectedListJob: Record<string, any> = {
attempts: 0,
created_by: false,
jobtype: 'csv',
timeout: 120000,
browser_type: 'chromium',
};
forOwn(expectedListJob, (value: any, key: string) => {
expect(listingJobs[0]._source[key]).to.eql(value, key);
});

expect(listingJobs.length).to.be(1);
expect(listingJobs[0]._id).to.be(resJob.id);
});

it('Posted CSV job is visible in the first page of jobs listing', async () => {
const { status: resStatus, text: resText } = await supertestNoAuth
.post(`/api/reporting/generate/csv`)
.set('kbn-xsrf', 'xxx')
.send({ jobParams: JOB_PARAMS_RISON });

expect(resStatus).to.be(200);

const { job: resJob } = JSON.parse(resText);
// call the ALL job listing api
const { text: listText } = await supertestNoAuth
.get(`/api/reporting/jobs/list?page=0`)
.set('kbn-xsrf', 'xxx');

const listingJobs = JSON.parse(listText);
const expectedListJob: Record<string, any> = {
attempts: 0,
created_by: false,
jobtype: 'csv',
timeout: 120000,
browser_type: 'chromium',
};
forOwn(expectedListJob, (value: any, key: string) => {
expect(listingJobs[0]._source[key]).to.eql(value, key);
});

expect(listingJobs.length).to.be(1);
expect(listingJobs[0]._id).to.be(resJob.id);
});
});
}
1 change: 1 addition & 0 deletions x-pack/test/reporting_api_integration/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ export function ReportingAPIProvider({ getService }: FtrProviderContext) {

export const services = {
...xpackServices,
supertestWithoutAuth: apiIntegrationServices.supertestWithoutAuth,
usageAPI: apiIntegrationServices.usageAPI,
reportingAPI: ReportingAPIProvider,
};

0 comments on commit 1e0a49f

Please sign in to comment.