diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_create/job_create.js b/x-pack/plugins/rollup/public/crud_app/sections/job_create/job_create.js index 65873e0ee2ccdb..a1c5fbeb97200b 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_create/job_create.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_create/job_create.js @@ -292,6 +292,7 @@ export class JobCreateUi extends Component { !this.canGoToStep(stepId) || stepIds.indexOf(stepId) > stepIds.indexOf(checkpointStepId) ), + 'data-test-subj': index === indexOfCurrentStep ? `createRollupStep${index + 1}--active` : `createRollupStep${index + 1}`, })); } diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_create/navigation/navigation.js b/x-pack/plugins/rollup/public/crud_app/sections/job_create/navigation/navigation.js index 25d4968a448689..4ad9747487b136 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_create/navigation/navigation.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_create/navigation/navigation.js @@ -52,6 +52,7 @@ const NavigationUi = ({ onFieldsChange({ dateHistogramInterval: e.target.value })} isInvalid={Boolean(areStepErrorsVisible && errorDateHistogramInterval)} fullWidth + data-test-subj="rollupJobInterval" /> diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps/step_logistics.js b/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps/step_logistics.js index a72791b513e540..2680307ea22a44 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps/step_logistics.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps/step_logistics.js @@ -71,7 +71,7 @@ export class StepLogisticsUi extends Component { if(!isValidatingIndexPattern && hasMatchingIndices) { return ( - +

onFieldsChange({ id: e.target.value })} fullWidth + data-test-subj="rollupJobName" /> @@ -364,6 +365,7 @@ export class StepLogisticsUi extends Component { isInvalid={Boolean(areStepErrorsVisible && errorIndexPattern) || Boolean(indexPatternAsyncErrors)} isLoading={isValidatingIndexPattern} fullWidth + data-test-subj="rollupIndexPattern" /> @@ -390,6 +392,7 @@ export class StepLogisticsUi extends Component { onChange={e => onFieldsChange({ rollupIndex: e.target.value })} isInvalid={Boolean(areStepErrorsVisible && errorRollupIndex)} fullWidth + data-test-subj="rollupIndexName" /> diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js index b9bcc03175ef9c..08914ec4d42d9b 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_list.js @@ -182,6 +182,7 @@ export class JobListUi extends Component { } actions={ { openDetailPanel(job.id); }} @@ -280,7 +280,7 @@ export class JobTableUi extends Component { return ( {wrappedContent} @@ -298,6 +298,7 @@ export class JobTableUi extends Component { return ( { + before(async () => { + // init data + await Promise.all([ + esArchiver.loadIfNeeded('logstash_functional'), + esArchiver.load('canvas/default'), + ]); + await PageObjects.common.navigateToApp('rollupJob'); + }); + + after(async () => await esArchiver.unload('logstash_functional')); + + it('create and save a new job', async () => { + const jobName = 'Testjob1'; + const indexPattern = '.kibana*'; + const indexName = 'rollup_index'; + const interval = '1000ms'; + + await PageObjects.rollup.createNewRollUpJob(); + await PageObjects.rollup.verifyStepIsActive(1); + await PageObjects.rollup.addRoleNameandIndexPattern(jobName, indexPattern); + await PageObjects.rollup.verifyIndexPatternAccepted(); + await PageObjects.rollup.setIndexName(indexName); + await PageObjects.rollup.moveToNextStep(); + + //now navigate to histogram + await PageObjects.rollup.verifyStepIsActive(2); + await PageObjects.rollup.setJobInterval(interval); + await PageObjects.rollup.moveToNextStep(); + + //Terms (optional) + await PageObjects.rollup.verifyStepIsActive(3); + await PageObjects.rollup.moveToNextStep(); + + //Histogram(optional) + await PageObjects.rollup.verifyStepIsActive(4); + await PageObjects.rollup.moveToNextStep(); + + //Metrics(optional) + await PageObjects.rollup.verifyStepIsActive(5); + await PageObjects.rollup.moveToNextStep(); + + //saveJob and verify the name in the list + await PageObjects.rollup.verifyStepIsActive(6); + await PageObjects.rollup.saveJob(); + + // verify jobListTitle + const jobList = indexBy(await PageObjects.rollup.getJobList(), 'jobName'); + log.debug(JSON.stringify(jobList)); + log.debug(Object.keys(jobList)); + expect(Object.keys(jobList)).to.have.length(1); + }); + }); +} diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index 005a030a33c0cd..5c22600a51caf9 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -22,7 +22,9 @@ import { GisPageProvider, StatusPagePageProvider, UpgradeAssistantProvider, + RollupPageProvider, UptimePageProvider, + } from './page_objects'; import { @@ -54,6 +56,7 @@ import { GrokDebuggerProvider, UserMenuProvider, UptimeProvider, + } from './services'; // the default export of config files must be a config provider @@ -82,6 +85,7 @@ export default async function ({ readConfigFile }) { resolve(__dirname, './apps/logstash'), resolve(__dirname, './apps/grok_debugger'), resolve(__dirname, './apps/infra'), + resolve(__dirname, './apps/rollup_job'), resolve(__dirname, './apps/maps'), resolve(__dirname, './apps/status_page'), resolve(__dirname, './apps/upgrade_assistant'), @@ -122,6 +126,7 @@ export default async function ({ readConfigFile }) { grokDebugger: GrokDebuggerProvider, userMenu: UserMenuProvider, uptime: UptimeProvider, + rollup: RollupPageProvider, }, // just like services, PageObjects are defined as a map of @@ -142,6 +147,7 @@ export default async function ({ readConfigFile }) { statusPage: StatusPagePageProvider, upgradeAssistant: UpgradeAssistantProvider, uptime: UptimePageProvider, + rollup: RollupPageProvider }, servers: kibanaFunctionalConfig.get('servers'), @@ -205,6 +211,10 @@ export default async function ({ readConfigFile }) { }, uptime: { pathname: '/app/uptime', + }, + rollupJob: { + pathname: '/app/kibana', + hash: '/management/elasticsearch/rollup_jobs/' } }, @@ -223,4 +233,5 @@ export default async function ({ readConfigFile }) { rootDirectory: resolve(__dirname, '../../'), }, }; + } diff --git a/x-pack/test/functional/page_objects/index.js b/x-pack/test/functional/page_objects/index.js index 058accf9c15c4c..e740873ab24c33 100644 --- a/x-pack/test/functional/page_objects/index.js +++ b/x-pack/test/functional/page_objects/index.js @@ -17,4 +17,5 @@ export { InfraHomePageProvider } from './infra_home_page'; export { GisPageProvider } from './gis_page'; export { StatusPagePageProvider } from './status_page'; export { UpgradeAssistantProvider } from './upgrade_assistant'; +export { RollupPageProvider } from './rollup_page'; export { UptimePageProvider } from './uptime_page'; diff --git a/x-pack/test/functional/page_objects/rollup_page.js b/x-pack/test/functional/page_objects/rollup_page.js new file mode 100644 index 00000000000000..d6fa64ba5ca1e1 --- /dev/null +++ b/x-pack/test/functional/page_objects/rollup_page.js @@ -0,0 +1,82 @@ +/* + * 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 'expect.js'; +import { map as mapAsync } from 'bluebird'; + +export function RollupPageProvider({ getService, getPageObjects }) { + const testSubjects = getService('testSubjects'); + const log = getService('log'); + const PageObjects = getPageObjects(['header', 'common']); + + + class RollupJobPage { + async createNewRollUpJob() { + await testSubjects.click('createRollupJobButton'); + } + + async verifyStepIsActive(stepNumber) { + await testSubjects.exists(`createRollupStep${stepNumber}--active`); + } + + async addRoleNameandIndexPattern(name, indexPattern) { + log.debug(`Adding name ${name} to form`); + await testSubjects.setValue('rollupJobName', name); + await testSubjects.setValue('rollupIndexPattern', indexPattern); + } + + async verifyIndexPatternAccepted() { + const span = await testSubjects.find('fieldIndexPatternSuccessMessage'); + const message = await span.findByCssSelector('p'); + const text = await message.getVisibleText(); + expect(text).to.be.equal('Success! Index pattern has matching indices.'); + } + + async setIndexName(name) { + await testSubjects.setValue('rollupIndexName', name); + } + + async moveToNextStep() { + await testSubjects.click('rollupJobNextButton'); + } + + async setJobInterval(time) { + await testSubjects.setValue('rollupJobInterval', time); + } + + async saveJob() { + await testSubjects.click('rollupJobSaveButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + + async getJobList() { + const jobs = await testSubjects.findAll('jobTableRow'); + return mapAsync(jobs, async job => { + const jobNameElement = await job.findByCssSelector('[data-test-subj="jobTableCell-id"]'); + const jobStatusElement = await job.findByCssSelector('[data-test-subj="jobTableCell-status"]'); + const jobIndexPatternElement = await job.findByCssSelector('[data-test-subj="jobTableCell-indexPattern"]'); + const jobRollUpIndexPatternElement = await job.findByCssSelector('[data-test-subj="jobTableCell-rollupIndex"]'); + const jobDelayElement = await job.findByCssSelector('[data-test-subj="jobTableCell-delay"]'); + const jobIntervalElement = await job.findByCssSelector('[data-test-subj="jobTableCell-interval"]'); + const jobGroupElement = await job.findByCssSelector('[data-test-subj="jobTableCell-groups"]'); + const jobMetricsElement = await job.findByCssSelector('[data-test-subj="jobTableCell-metrics"]'); + + return { + jobName: await jobNameElement.getVisibleText(), + jobStatus: await jobStatusElement.getVisibleText(), + jobIndexPattern: await jobIndexPatternElement.getVisibleText(), + jobRollUpIndexPattern: await jobRollUpIndexPatternElement.getVisibleText(), + jobDelayElement: await jobDelayElement.getVisibleText(), + jobInterval: await jobIntervalElement.getVisibleText(), + jobGroup: await jobGroupElement.getVisibleText(), + jobMetrics: await jobMetricsElement.getVisibleText() + }; + }); + } + + } + return new RollupJobPage(); +}