-
Notifications
You must be signed in to change notification settings - Fork 8.3k
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/Test] move functional tests to apps #64368
Merged
tsullivan
merged 9 commits into
elastic:master
from
tsullivan:reporting/fn-test-move-to-apps
Apr 27, 2020
Merged
Changes from 4 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
40d735a
Squashed commit of the following:
tsullivan 19c197e
fix imports and readmes
tsullivan 35032a1
remove not-needed readme
tsullivan 33c2a6b
remove extra info from readme
tsullivan 734c5d8
correct some comments
tsullivan 81d740b
log the error that was caught
tsullivan ef182e7
Merge branch 'master' into reporting/fn-test-move-to-apps
elasticmachine 3aa01ac
fix config path in readme
tsullivan 0111d55
fix readme instructions to point to updated paths
tsullivan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
## The Reporting Tests | ||
|
||
### Reporting baseline snapshots | ||
|
||
The functional version of the reporting tests create a few pdf reports and do a snapshot comparison against a couple baselines. The baseline images are stored in `./functional/reports/baseline`. | ||
|
||
#### Updating the baselines | ||
|
||
Every now and then visual changes will be made that will require the snapshots to be updated. This is how you go about updating it. I will discuss generating snapshots from chromium since that is the way of the future. | ||
|
||
1. Load the ES Archive containing the dashboard and data | ||
``` | ||
node scripts/es_archiver load reporting/ecommerce --config=x-pack/test/reporting/configs/chromium_functional.js | ||
tsullivan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
node scripts/es_archiver load reporting/ecommerce_kibana --config=x-pack/test/reporting/configs/chromium_functional.js | ||
``` | ||
2. Generate a report of the archived E-commerce dashboard | ||
3. Download the report and save it in the `reports/baseline` folder. |
126 changes: 126 additions & 0 deletions
126
x-pack/test/functional/apps/dashboard/reporting/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 path from 'path'; | ||
import fs from 'fs'; | ||
import { promisify } from 'util'; | ||
import { checkIfPngsMatch } from './lib/compare_pngs'; | ||
|
||
const writeFileAsync = promisify(fs.writeFile); | ||
const mkdirAsync = promisify(fs.mkdir); | ||
|
||
const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); | ||
|
||
export default function({ getService, getPageObjects }) { | ||
const esArchiver = getService('esArchiver'); | ||
const browser = getService('browser'); | ||
const log = getService('log'); | ||
const config = getService('config'); | ||
const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); | ||
|
||
describe('Reporting', () => { | ||
before('initialize tests', async () => { | ||
log.debug('ReportingPage:initTests'); | ||
await esArchiver.loadIfNeeded('reporting/ecommerce'); | ||
await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); | ||
await browser.setWindowSize(1600, 850); | ||
}); | ||
after('clean up archives', async () => { | ||
await esArchiver.unload('reporting/ecommerce'); | ||
await esArchiver.unload('reporting/ecommerce_kibana'); | ||
}); | ||
|
||
describe('Print PDF button', () => { | ||
it('is not available if new', async () => { | ||
await PageObjects.common.navigateToApp('dashboard'); | ||
await PageObjects.dashboard.clickNewDashboard(); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
}); | ||
|
||
it('becomes available when saved', async () => { | ||
await PageObjects.dashboard.saveDashboard('My PDF Dashboard'); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
}); | ||
}); | ||
|
||
describe('Print Layout', () => { | ||
it('downloads a PDF file', async function() { | ||
// Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs | ||
// function is taking about 15 seconds per comparison in jenkins. | ||
this.timeout(300000); | ||
await PageObjects.common.navigateToApp('dashboard'); | ||
await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
await PageObjects.reporting.checkUsePrintLayout(); | ||
await PageObjects.reporting.clickGenerateReportButton(); | ||
|
||
const url = await PageObjects.reporting.getReportURL(60000); | ||
const res = await PageObjects.reporting.getResponse(url); | ||
|
||
expect(res.statusCode).to.equal(200); | ||
expect(res.headers['content-type']).to.equal('application/pdf'); | ||
}); | ||
}); | ||
|
||
describe('Print PNG button', () => { | ||
it('is not available if new', async () => { | ||
await PageObjects.common.navigateToApp('dashboard'); | ||
await PageObjects.dashboard.clickNewDashboard(); | ||
await PageObjects.reporting.openPngReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
}); | ||
|
||
it('becomes available when saved', async () => { | ||
await PageObjects.dashboard.saveDashboard('My PNG Dash'); | ||
await PageObjects.reporting.openPngReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
}); | ||
}); | ||
|
||
describe('Preserve Layout', () => { | ||
it('matches baseline report', async function() { | ||
const writeSessionReport = async (name, rawPdf, reportExt) => { | ||
const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); | ||
await mkdirAsync(sessionDirectory, { recursive: true }); | ||
const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); | ||
await writeFileAsync(sessionReportPath, rawPdf); | ||
return sessionReportPath; | ||
}; | ||
const getBaselineReportPath = (fileName, reportExt) => { | ||
const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); | ||
const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); | ||
log.debug(`getBaselineReportPath (${fullPath})`); | ||
return fullPath; | ||
}; | ||
|
||
this.timeout(300000); | ||
|
||
await PageObjects.common.navigateToApp('dashboard'); | ||
await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); | ||
await PageObjects.reporting.openPngReportingPanel(); | ||
await PageObjects.reporting.forceSharedItemsContainerSize({ width: 1405 }); | ||
await PageObjects.reporting.clickGenerateReportButton(); | ||
await PageObjects.reporting.removeForceSharedItemsContainerSize(); | ||
|
||
const url = await PageObjects.reporting.getReportURL(60000); | ||
const reportData = await PageObjects.reporting.getRawPdfReportData(url); | ||
const reportFileName = 'dashboard_preserve_layout'; | ||
const sessionReportPath = await writeSessionReport(reportFileName, reportData, 'png'); | ||
const percentSimilar = await checkIfPngsMatch( | ||
sessionReportPath, | ||
getBaselineReportPath(reportFileName, 'png'), | ||
config.get('screenshots.directory'), | ||
log | ||
); | ||
|
||
expect(percentSimilar).to.be.lessThan(0.1); | ||
}); | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* 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'; | ||
|
||
export default function({ getService, getPageObjects }) { | ||
const log = getService('log'); | ||
const esArchiver = getService('esArchiver'); | ||
const browser = getService('browser'); | ||
const PageObjects = getPageObjects(['reporting', 'common', 'discover']); | ||
const filterBar = getService('filterBar'); | ||
|
||
describe('Discover', () => { | ||
before('initialize tests', async () => { | ||
log.debug('ReportingPage:initTests'); | ||
await esArchiver.loadIfNeeded('reporting/ecommerce'); | ||
await browser.setWindowSize(1600, 850); | ||
}); | ||
after('clean up archives', async () => { | ||
await esArchiver.unload('reporting/ecommerce'); | ||
}); | ||
|
||
describe('Generate CSV button', () => { | ||
beforeEach(() => PageObjects.common.navigateToApp('discover')); | ||
|
||
it('is not available if new', async () => { | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
}); | ||
|
||
it('becomes available when saved', async () => { | ||
await PageObjects.discover.saveSearch('my search - expectEnabledGenerateReportButton'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
}); | ||
|
||
it('becomes available/not available when a saved search is created, changed and saved again', async () => { | ||
// create new search, csv export is not available | ||
await PageObjects.discover.clickNewSearchButton(); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
// save search, csv export is available | ||
await PageObjects.discover.saveSearch('my search - expectEnabledGenerateReportButton 2'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
// add filter, csv export is not available | ||
await filterBar.addFilter('currency', 'is', 'EUR'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
// save search again, csv export is available | ||
await PageObjects.discover.saveSearch('my search - expectEnabledGenerateReportButton 2'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
}); | ||
|
||
it('generates a report with data', async () => { | ||
await PageObjects.discover.clickNewSearchButton(); | ||
await PageObjects.reporting.setTimepickerInDataRange(); | ||
await PageObjects.discover.saveSearch('my search - with data - expectReportCanBeCreated'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.canReportBeCreated()).to.be(true); | ||
}); | ||
|
||
it('generates a report with no data', async () => { | ||
await PageObjects.reporting.setTimepickerInNoDataRange(); | ||
await PageObjects.discover.saveSearch('my search - no data - expectReportCanBeCreated'); | ||
await PageObjects.reporting.openCsvReportingPanel(); | ||
expect(await PageObjects.reporting.canReportBeCreated()).to.be(true); | ||
}); | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* 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'; | ||
|
||
export default function({ getService, getPageObjects }) { | ||
const esArchiver = getService('esArchiver'); | ||
const browser = getService('browser'); | ||
const log = getService('log'); | ||
const PageObjects = getPageObjects([ | ||
'reporting', | ||
'common', | ||
'dashboard', | ||
'visualize', | ||
'visEditor', | ||
]); | ||
|
||
describe('Visualize', () => { | ||
before('initialize tests', async () => { | ||
log.debug('ReportingPage:initTests'); | ||
await esArchiver.loadIfNeeded('reporting/ecommerce'); | ||
await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); | ||
await browser.setWindowSize(1600, 850); | ||
}); | ||
after('clean up archives', async () => { | ||
await esArchiver.unload('reporting/ecommerce'); | ||
await esArchiver.unload('reporting/ecommerce_kibana'); | ||
}); | ||
|
||
describe('Print PDF button', () => { | ||
it('is not available if new', async () => { | ||
await PageObjects.common.navigateToUrl('visualize', 'new'); | ||
await PageObjects.visualize.clickAreaChart(); | ||
await PageObjects.visualize.clickNewSearch('ecommerce'); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); | ||
}); | ||
|
||
it('becomes available when saved', async () => { | ||
await PageObjects.reporting.setTimepickerInDataRange(); | ||
await PageObjects.visEditor.clickBucket('X-axis'); | ||
await PageObjects.visEditor.selectAggregation('Date Histogram'); | ||
await PageObjects.visEditor.clickGo(); | ||
await PageObjects.visualize.saveVisualization('my viz'); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); | ||
}); | ||
|
||
it('downloaded PDF has OK status', async function() { | ||
// Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs | ||
// function is taking about 15 seconds per comparison in jenkins. | ||
this.timeout(180000); | ||
|
||
await PageObjects.common.navigateToApp('dashboard'); | ||
await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); | ||
await PageObjects.reporting.openPdfReportingPanel(); | ||
await PageObjects.reporting.clickGenerateReportButton(); | ||
|
||
const url = await PageObjects.reporting.getReportURL(60000); | ||
const res = await PageObjects.reporting.getResponse(url); | ||
|
||
expect(res.statusCode).to.equal(200); | ||
expect(res.headers['content-type']).to.equal('application/pdf'); | ||
}); | ||
}); | ||
}); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As this information isn't really dashboard specific, should we but the readme in
functional/reports
instead?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For now, this information is only specific to dashboards because it's the only Reporting test that is enabled for this. Other app integrations don't yet have the image comparison test that Dashboard does. When that happens, it might be OK to just copy the file to
visualize/reporting
orcanvas/reporting
.There is no
functional/reports
folder - as part of this PR, we're taking away the notion that Reporting is a standalone app.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I meant keeping the folder just for the readme so people can find it more easily, but copying seems even better 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the follow-up :)