Skip to content

Commit c6c0b15

Browse files
committed
[Reporting] Fix and test for Listing of Reports (elastic#74453)
* [Reporting] Fix and test for Listing of Reports * add sleeps * await selector instead of sleep * reduce changes * cleanup after csv generated * fix snapshot
1 parent 81af59e commit c6c0b15

File tree

10 files changed

+160
-64
lines changed

10 files changed

+160
-64
lines changed

x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugins/reporting/public/components/report_listing.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ class ReportListingUi extends Component<Props, State> {
513513
isSelectable={true}
514514
onChange={this.onTableChange}
515515
data-test-subj="reportJobListing"
516+
data-test-page={this.state.page}
516517
/>
517518
{this.state.selectedJobs.length > 0 ? this.renderDeleteButton() : null}
518519
</Fragment>

x-pack/plugins/reporting/server/routes/jobs.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
3535
router.get(
3636
{
3737
path: `${MAIN_ENTRY}/list`,
38-
validate: false,
38+
validate: {
39+
query: schema.object({
40+
page: schema.string({ defaultValue: '0' }),
41+
size: schema.string({ defaultValue: '10' }),
42+
ids: schema.maybe(schema.string()),
43+
}),
44+
},
3945
},
4046
userHandler(async (user, context, req, res) => {
4147
// ensure the async dependencies are loaded
@@ -50,7 +56,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
5056
page: queryPage = '0',
5157
size: querySize = '10',
5258
ids: queryIds = null,
53-
} = req.query as ListQuery;
59+
} = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it?
5460
const page = parseInt(queryPage, 10) || 0;
5561
const size = Math.min(100, parseInt(querySize, 10) || 10);
5662
const jobIds = queryIds ? queryIds.split(',') : null;

x-pack/test/functional/apps/dashboard/reporting/screenshots.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ const mkdirAsync = promisify(fs.mkdir);
1616

1717
const REPORTS_FOLDER = path.resolve(__dirname, 'reports');
1818

19-
export default function ({ getService, getPageObjects }: FtrProviderContext) {
19+
export default function ({ getPageObjects, getService }: FtrProviderContext) {
20+
const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']);
2021
const esArchiver = getService('esArchiver');
2122
const browser = getService('browser');
2223
const log = getService('log');
2324
const config = getService('config');
24-
const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']);
25+
const es = getService('es');
2526

2627
describe('Screenshots', () => {
2728
before('initialize tests', async () => {
@@ -33,6 +34,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
3334
after('clean up archives', async () => {
3435
await esArchiver.unload('reporting/ecommerce');
3536
await esArchiver.unload('reporting/ecommerce_kibana');
37+
await es.deleteByQuery({
38+
index: '.reporting-*',
39+
refresh: true,
40+
body: { query: { match_all: {} } },
41+
});
3642
});
3743

3844
describe('Print PDF button', () => {

x-pack/test/functional/apps/discover/reporting.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
99

1010
export default function ({ getService, getPageObjects }: FtrProviderContext) {
1111
const log = getService('log');
12+
const es = getService('es');
1213
const esArchiver = getService('esArchiver');
1314
const browser = getService('browser');
1415
const PageObjects = getPageObjects(['reporting', 'common', 'discover']);
@@ -22,6 +23,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
2223
});
2324
after('clean up archives', async () => {
2425
await esArchiver.unload('reporting/ecommerce');
26+
await es.deleteByQuery({
27+
index: '.reporting-*',
28+
refresh: true,
29+
body: { query: { match_all: {} } },
30+
});
2531
});
2632

2733
describe('Generate CSV button', () => {

x-pack/test/functional/apps/lens/lens_reporting.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
99

1010
export default function ({ getService, getPageObjects }: FtrProviderContext) {
1111
const PageObjects = getPageObjects(['common', 'dashboard', 'reporting']);
12+
const es = getService('es');
1213
const esArchiver = getService('esArchiver');
1314
const listingTable = getService('listingTable');
1415

@@ -19,6 +20,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
1920

2021
after(async () => {
2122
await esArchiver.unload('lens/reporting');
23+
await es.deleteByQuery({
24+
index: '.reporting-*',
25+
refresh: true,
26+
body: { query: { match_all: {} } },
27+
});
2228
});
2329

2430
it('should not cause PDF reports to fail', async () => {

x-pack/test/functional/apps/reporting_management/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context';
99
export default ({ loadTestFile }: FtrProviderContext) => {
1010
describe('reporting management app', function () {
1111
this.tags('ciGroup7');
12-
loadTestFile(require.resolve('./report_delete_pagination'));
12+
loadTestFile(require.resolve('./report_listing'));
1313
});
1414
};

x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import expect from '@kbn/expect';
8+
import { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper';
9+
import { FtrProviderContext } from '../../ftr_provider_context';
10+
11+
const getTableTextFromElement = async (tableEl: WebElementWrapper) => {
12+
const rows = await tableEl.findAllByCssSelector('tbody tr');
13+
return (
14+
await Promise.all(
15+
rows.map(async (row) => {
16+
return await row.getVisibleText();
17+
})
18+
)
19+
).join('\n');
20+
};
21+
22+
export default ({ getPageObjects, getService }: FtrProviderContext) => {
23+
const pageObjects = getPageObjects(['common', 'reporting']);
24+
const log = getService('log');
25+
const retry = getService('retry');
26+
const security = getService('security');
27+
28+
const testSubjects = getService('testSubjects');
29+
const findInstance = getService('find');
30+
const esArchiver = getService('esArchiver');
31+
32+
describe('Listing of Reports', function () {
33+
before(async () => {
34+
await security.testUser.setRoles(['kibana_admin', 'reporting_user']);
35+
await esArchiver.load('empty_kibana');
36+
});
37+
38+
beforeEach(async () => {
39+
// to reset the data after deletion testing
40+
await esArchiver.load('reporting/archived_reports');
41+
await pageObjects.common.navigateToApp('reporting');
42+
await testSubjects.existOrFail('reportJobListing', { timeout: 200000 });
43+
});
44+
45+
after(async () => {
46+
await esArchiver.unload('empty_kibana');
47+
await security.testUser.restoreDefaults();
48+
});
49+
50+
afterEach(async () => {
51+
await esArchiver.unload('reporting/archived_reports');
52+
});
53+
54+
it('Confirm single report deletion works', async () => {
55+
log.debug('Checking for reports.');
56+
await retry.try(async () => {
57+
await testSubjects.click('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3');
58+
});
59+
const deleteButton = await testSubjects.find('deleteReportButton');
60+
await retry.waitFor('delete button to become enabled', async () => {
61+
return await deleteButton.isEnabled();
62+
});
63+
await deleteButton.click();
64+
await testSubjects.exists('confirmModalBodyText');
65+
await testSubjects.click('confirmModalConfirmButton');
66+
await retry.try(async () => {
67+
await testSubjects.waitForDeleted('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3');
68+
});
69+
});
70+
71+
it('Paginates content', async () => {
72+
const previousButton = await testSubjects.find('pagination-button-previous');
73+
74+
// previous CAN NOT be clicked
75+
expect(await previousButton.getAttribute('disabled')).to.be('true');
76+
77+
// scan page 1
78+
let tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing'));
79+
const PAGE_CONTENT_1 = `[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM
80+
[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM
81+
[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM
82+
[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM
83+
[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM
84+
[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM
85+
pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM
86+
pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM
87+
[Flights] Flight Cancellations\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM
88+
[Flights] Markdown Instructions\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM`;
89+
expect(tableText).to.be(PAGE_CONTENT_1);
90+
91+
// click page 2
92+
await testSubjects.click('pagination-button-1');
93+
await findInstance.byCssSelector('[data-test-page="1"]');
94+
95+
// previous CAN be clicked
96+
expect(await previousButton.getAttribute('disabled')).to.be(null);
97+
98+
// scan page 2
99+
tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing'));
100+
const PAGE_CONTENT_2 = `[eCommerce] Revenue Tracking\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM
101+
[Logs] Web Traffic\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM
102+
[Flights] Overview\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM
103+
[eCommerce] Revenue Dashboard\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM
104+
[Logs] Web Traffic\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM
105+
[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM
106+
[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM
107+
report4csv\n2020-04-21 @ 06:55 PM\ntest_user\nCompleted at 2020-04-21 @ 06:56 PM - Max size reached\nreport3csv\n2020-04-21 @ 06:55 PM
108+
test_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached\nreport2csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached`;
109+
expect(tableText).to.be(PAGE_CONTENT_2);
110+
111+
// click page 3
112+
await testSubjects.click('pagination-button-2');
113+
await findInstance.byCssSelector('[data-test-page="2"]');
114+
115+
// scan page 3
116+
tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing'));
117+
const PAGE_CONTENT_3 = `report1csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:54 PM - Max size reached`;
118+
expect(tableText).to.be(PAGE_CONTENT_3);
119+
});
120+
});
121+
};

x-pack/test/functional/apps/visualize/reporting.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import expect from '@kbn/expect';
88
import { FtrProviderContext } from '../../ftr_provider_context';
99

1010
export default function ({ getService, getPageObjects }: FtrProviderContext) {
11+
const es = getService('es');
1112
const esArchiver = getService('esArchiver');
1213
const browser = getService('browser');
1314
const log = getService('log');
@@ -29,6 +30,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
2930
after('clean up archives', async () => {
3031
await esArchiver.unload('reporting/ecommerce');
3132
await esArchiver.unload('reporting/ecommerce_kibana');
33+
await es.deleteByQuery({
34+
index: '.reporting-*',
35+
refresh: true,
36+
body: { query: { match_all: {} } },
37+
});
3238
});
3339

3440
describe('Print PDF button', () => {

0 commit comments

Comments
 (0)