From c6fc235b5eb0c0585abffc7c23c6caf141b4fcb0 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Thu, 21 Mar 2019 07:12:25 +0100 Subject: [PATCH] adding runPipeline tests (#27015) --- package.json | 4 +- packages/kbn-pm/src/config.ts | 1 + scripts/functional_tests.js | 1 + .../lib/config/schema.ts | 7 + .../public/renderers/visualization.js | 2 +- tasks/config/run.js | 11 ++ test/functional/services/browser.js | 33 +++++ test/functional/services/index.ts | 3 + .../web_element_wrapper.js | 16 +++ test/functional/services/screenshots.js | 20 ++- test/functional/services/snapshots.js | 85 ++++++++++++ test/interpreter_functional/README.md | 21 +++ test/interpreter_functional/config.js | 57 ++++++++ .../plugins/kbn_tp_run_pipeline/index.js | 39 ++++++ .../plugins/kbn_tp_run_pipeline/package.json | 14 ++ .../plugins/kbn_tp_run_pipeline/public/app.js | 80 +++++++++++ .../public/components/main.js | 104 ++++++++++++++ .../screenshots/baseline/combined_test.png | Bin 0 -> 34153 bytes .../baseline/final_screenshot_test.png | Bin 0 -> 34273 bytes .../screenshots/baseline/partial_test_1.png | Bin 0 -> 22116 bytes .../screenshots/baseline/partial_test_2.png | Bin 0 -> 34153 bytes .../screenshots/baseline/partial_test_3.png | Bin 0 -> 23587 bytes .../snapshots/baseline/combined_test0.json | 1 + .../snapshots/baseline/combined_test1.json | 1 + .../snapshots/baseline/combined_test2.json | 1 + .../snapshots/baseline/combined_test3.json | 1 + .../snapshots/baseline/final_output_test.json | 1 + .../snapshots/baseline/step_output_test0.json | 1 + .../snapshots/baseline/step_output_test1.json | 1 + .../snapshots/baseline/step_output_test2.json | 1 + .../snapshots/baseline/step_output_test3.json | 1 + .../test_suites/run_pipeline/basic.js | 112 +++++++++++++++ .../test_suites/run_pipeline/helpers.js | 127 ++++++++++++++++++ .../test_suites/run_pipeline/index.js | 41 ++++++ test/scripts/jenkins_ci_group.sh | 1 + yarn.lock | 5 + 36 files changed, 780 insertions(+), 13 deletions(-) create mode 100644 test/functional/services/snapshots.js create mode 100644 test/interpreter_functional/README.md create mode 100644 test/interpreter_functional/config.js create mode 100644 test/interpreter_functional/plugins/kbn_tp_run_pipeline/index.js create mode 100644 test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json create mode 100644 test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app.js create mode 100644 test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/components/main.js create mode 100644 test/interpreter_functional/screenshots/baseline/combined_test.png create mode 100644 test/interpreter_functional/screenshots/baseline/final_screenshot_test.png create mode 100644 test/interpreter_functional/screenshots/baseline/partial_test_1.png create mode 100644 test/interpreter_functional/screenshots/baseline/partial_test_2.png create mode 100644 test/interpreter_functional/screenshots/baseline/partial_test_3.png create mode 100644 test/interpreter_functional/snapshots/baseline/combined_test0.json create mode 100644 test/interpreter_functional/snapshots/baseline/combined_test1.json create mode 100644 test/interpreter_functional/snapshots/baseline/combined_test2.json create mode 100644 test/interpreter_functional/snapshots/baseline/combined_test3.json create mode 100644 test/interpreter_functional/snapshots/baseline/final_output_test.json create mode 100644 test/interpreter_functional/snapshots/baseline/step_output_test0.json create mode 100644 test/interpreter_functional/snapshots/baseline/step_output_test1.json create mode 100644 test/interpreter_functional/snapshots/baseline/step_output_test2.json create mode 100644 test/interpreter_functional/snapshots/baseline/step_output_test3.json create mode 100644 test/interpreter_functional/test_suites/run_pipeline/basic.js create mode 100644 test/interpreter_functional/test_suites/run_pipeline/helpers.js create mode 100644 test/interpreter_functional/test_suites/run_pipeline/index.js diff --git a/package.json b/package.json index 3fb7dc9973418..583166cc63b4f 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,8 @@ "packages/*", "x-pack", "x-pack/plugins/*", - "test/plugin_functional/plugins/*" + "test/plugin_functional/plugins/*", + "test/interpreter_functional/plugins/*" ], "nohoist": [ "**/@types/*", @@ -386,6 +387,7 @@ "normalize-path": "^3.0.0", "pixelmatch": "4.0.2", "pkg-up": "^2.0.0", + "pngjs": "^3.4.0", "postcss": "^7.0.5", "postcss-url": "^8.0.0", "prettier": "^1.14.3", diff --git a/packages/kbn-pm/src/config.ts b/packages/kbn-pm/src/config.ts index 458ff0b1f3097..5f8da750290ea 100644 --- a/packages/kbn-pm/src/config.ts +++ b/packages/kbn-pm/src/config.ts @@ -43,6 +43,7 @@ export function getProjectPaths(rootPath: string, options: IProjectPathOptions) // In anyway, have a plugin declaring their own dependencies is the // correct and the expect behavior. projectPaths.push(resolve(rootPath, 'test/plugin_functional/plugins/*')); + projectPaths.push(resolve(rootPath, 'test/interpreter_functional/plugins/*')); if (!ossOnly) { projectPaths.push(resolve(rootPath, 'x-pack')); diff --git a/scripts/functional_tests.js b/scripts/functional_tests.js index 9d73923704ce6..472545b203a9b 100644 --- a/scripts/functional_tests.js +++ b/scripts/functional_tests.js @@ -22,4 +22,5 @@ require('@kbn/test').runTestsCli([ require.resolve('../test/functional/config.js'), require.resolve('../test/api_integration/config.js'), require.resolve('../test/plugin_functional/config.js'), + require.resolve('../test/interpreter_functional/config.js'), ]); diff --git a/src/functional_test_runner/lib/config/schema.ts b/src/functional_test_runner/lib/config/schema.ts index 8610a8d3bdbcd..57c0b1135c3af 100644 --- a/src/functional_test_runner/lib/config/schema.ts +++ b/src/functional_test_runner/lib/config/schema.ts @@ -220,6 +220,13 @@ export const schema = Joi.object() }) .default(), + // settings for the snapshots module + snapshots: Joi.object() + .keys({ + directory: Joi.string().default(defaultRelativeToConfigPath('snapshots')), + }) + .default(), + // settings for the failureDebugging module failureDebugging: Joi.object() .keys({ diff --git a/src/legacy/core_plugins/interpreter/public/renderers/visualization.js b/src/legacy/core_plugins/interpreter/public/renderers/visualization.js index a04431c8c4467..38fe02436380c 100644 --- a/src/legacy/core_plugins/interpreter/public/renderers/visualization.js +++ b/src/legacy/core_plugins/interpreter/public/renderers/visualization.js @@ -49,7 +49,7 @@ export const visualization = () => ({ handlers.onDestroy(() => visualizationLoader.destroy()); - await visualizationLoader.render(domNode, handlers.vis, visData, visConfig || handlers.vis.params, uiState, params).then(() => { + await visualizationLoader.render(domNode, handlers.vis, visData, handlers.vis.params, uiState, params).then(() => { if (handlers.done) handlers.done(); }); }, diff --git a/tasks/config/run.js b/tasks/config/run.js index c4f9e91d09fcf..60e7ff3d12f54 100644 --- a/tasks/config/run.js +++ b/tasks/config/run.js @@ -208,6 +208,17 @@ module.exports = function (grunt) { ], }, + interpreterFunctionalTestsRelease: { + cmd: process.execPath, + args: [ + 'scripts/functional_tests', + '--config', 'test/interpreter_functional/config.js', + '--bail', + '--debug', + '--kibana-install-dir', KIBANA_INSTALL_DIR, + ], + }, + pluginFunctionalTestsRelease: { cmd: process.execPath, args: [ diff --git a/test/functional/services/browser.js b/test/functional/services/browser.js index cac147f2f0ec4..7f7e26de888bd 100644 --- a/test/functional/services/browser.js +++ b/test/functional/services/browser.js @@ -323,6 +323,39 @@ export async function BrowserProvider({ getService }) { } })); } + + async executeAsync(fn, ...args) { + return await driver.executeAsyncScript(fn, ...cloneDeep(args, arg => { + if (arg instanceof WebElementWrapper) { + return arg._webElement; + } + })); + } + + getScrollTop() { + return driver + .executeScript('return document.body.scrollTop') + .then(scrollSize => parseInt(scrollSize, 10)); + } + + getScrollLeft() { + return driver + .executeScript('return document.body.scrollLeft') + .then(scrollSize => parseInt(scrollSize, 10)); + } + + // return promise with REAL scroll position + setScrollTop(scrollSize) { + return driver + .executeScript('document.body.scrollTop = ' + scrollSize) + .then(() => this.getScrollTop(driver)); + } + + setScrollLeft(scrollSize) { + return driver + .executeScript('document.body.scrollLeft = ' + scrollSize) + .then(() => this.getScrollLeft(driver)); + } } return new BrowserService(); diff --git a/test/functional/services/index.ts b/test/functional/services/index.ts index 8ba5c95c307b4..14d62937e834f 100644 --- a/test/functional/services/index.ts +++ b/test/functional/services/index.ts @@ -54,6 +54,8 @@ import { RenderableProvider } from './renderable'; // @ts-ignore not TS yet import { ScreenshotsProvider } from './screenshots'; // @ts-ignore not TS yet +import { SnapshotsProvider } from './snapshots'; +// @ts-ignore not TS yet import { TableProvider } from './table'; // @ts-ignore not TS yet import { TestSubjectsProvider } from './test_subjects'; @@ -70,6 +72,7 @@ export const services = { testSubjects: TestSubjectsProvider, docTable: DocTableProvider, screenshots: ScreenshotsProvider, + snapshots: SnapshotsProvider, dashboardVisualizations: DashboardVisualizationProvider, dashboardExpect: DashboardExpectProvider, failureDebugging: FailureDebuggingProvider, diff --git a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.js b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.js index 968dc8622fe5c..8e96c3af0cc9b 100644 --- a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.js +++ b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.js @@ -19,6 +19,7 @@ import { scrollIntoViewIfNecessary } from './scroll_into_view_if_necessary'; import { delay } from 'bluebird'; +import { PNG } from 'pngjs'; import cheerio from 'cheerio'; import testSubjSelector from '@kbn/test-subj-selector'; @@ -443,4 +444,19 @@ export class WebElementWrapper { return $; } + + /** + * Creates the screenshot of the element + * + * @returns {Promise} + */ + async takeScreenshot() { + const screenshot = await this._driver.takeScreenshot(); + const buffer = Buffer.from(screenshot.toString(), 'base64'); + const { width, height, x, y } = await this.getPosition(); + const src = PNG.sync.read(buffer); + const dst = new PNG({ width, height }); + PNG.bitblt(src, dst, x, y, width, height, 0, 0); + return PNG.sync.write(dst); + } } diff --git a/test/functional/services/screenshots.js b/test/functional/services/screenshots.js index 99132796b5c2f..b2cb7a2df811c 100644 --- a/test/functional/services/screenshots.js +++ b/test/functional/services/screenshots.js @@ -45,10 +45,10 @@ export async function ScreenshotsProvider({ getService }) { * @param updateBaselines {boolean} optional, pass true to update the baseline snapshot. * @return {Promise.} Percentage difference between the baseline and the current snapshot. */ - async compareAgainstBaseline(name, updateBaselines) { + async compareAgainstBaseline(name, updateBaselines, el) { log.debug('compareAgainstBaseline'); const sessionPath = resolve(SESSION_DIRECTORY, `${name}.png`); - await this._take(sessionPath); + await this._take(sessionPath, el); const baselinePath = resolve(BASELINE_DIRECTORY, `${name}.png`); const failurePath = resolve(FAILURE_DIRECTORY, `${name}.png`); @@ -63,21 +63,19 @@ export async function ScreenshotsProvider({ getService }) { } } - async take(name) { - return await this._take(resolve(SESSION_DIRECTORY, `${name}.png`)); + async take(name, el) { + return await this._take(resolve(SESSION_DIRECTORY, `${name}.png`), el); } - async takeForFailure(name) { - await this._take(resolve(FAILURE_DIRECTORY, `${name}.png`)); + async takeForFailure(name, el) { + await this._take(resolve(FAILURE_DIRECTORY, `${name}.png`), el); } - async _take(path) { + async _take(path, el) { try { log.info(`Taking screenshot "${path}"`); - const [screenshot] = await Promise.all([ - browser.takeScreenshot(), - fcb(cb => mkdirp(dirname(path), cb)), - ]); + const screenshot = await (el ? el.takeScreenshot() : browser.takeScreenshot()); + await fcb(cb => mkdirp(dirname(path), cb)); await fcb(cb => writeFile(path, screenshot, 'base64', cb)); } catch (err) { log.error('SCREENSHOT FAILED'); diff --git a/test/functional/services/snapshots.js b/test/functional/services/snapshots.js new file mode 100644 index 0000000000000..b19149a8a1af0 --- /dev/null +++ b/test/functional/services/snapshots.js @@ -0,0 +1,85 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import expect from 'expect.js'; +import { dirname, resolve } from 'path'; +import { writeFile, readFileSync } from 'fs'; +import { fromNode as fcb, promisify } from 'bluebird'; +import mkdirp from 'mkdirp'; +import del from 'del'; + +const writeFileAsync = promisify(writeFile); + +export async function SnapshotsProvider({ getService }) { + const log = getService('log'); + const config = getService('config'); + + const SESSION_DIRECTORY = resolve(config.get('snapshots.directory'), 'session'); + const BASELINE_DIRECTORY = resolve(config.get('snapshots.directory'), 'baseline'); + await del([SESSION_DIRECTORY]); + + class Snapshots { + + /** + * + * @param name {string} name of the file to use for comparison + * @param value {object} value to compare to baseline. + * @param updateBaselines {boolean} optional, pass true to update the baseline snapshot. + * @return {Promise.} returns 0 if successful. + */ + async compareAgainstBaseline(name, value, updateBaselines) { + log.debug('compareAgainstBaseline'); + const sessionPath = resolve(SESSION_DIRECTORY, `${name}.json`); + await this._take(sessionPath, value); + + const baselinePath = resolve(BASELINE_DIRECTORY, `${name}.json`); + + if (updateBaselines) { + await writeFileAsync(baselinePath, readFileSync(sessionPath)); + return 0; + } else { + log.debug('comparing'); + return this._compare(sessionPath, baselinePath); + } + } + + _compare(sessionPath, baselinePath) { + const currentObject = readFileSync(sessionPath, { encoding: 'utf8' }); + const baselineObject = readFileSync(baselinePath, { encoding: 'utf8' }); + expect(currentObject).to.eql(baselineObject); + return 0; + } + + async take(name) { + return await this._take(resolve(SESSION_DIRECTORY, `${name}.json`)); + } + + async _take(path, snapshot) { + try { + await fcb(cb => mkdirp(dirname(path), cb)); + await fcb(cb => writeFile(path, JSON.stringify(snapshot), 'utf8', cb)); + } catch (err) { + log.error('SNAPSHOT FAILED'); + log.error(err); + } + } + } + + return new Snapshots(); +} diff --git a/test/interpreter_functional/README.md b/test/interpreter_functional/README.md new file mode 100644 index 0000000000000..6918afe3eb90e --- /dev/null +++ b/test/interpreter_functional/README.md @@ -0,0 +1,21 @@ +# Interpreter Functional Tests + +This folder contains interpreter functional tests. + +Add new test suites into the `test_suites` folder and reference them from the +`config.js` file. These test suites work the same as regular functional test. + +## Run the test + +To run these tests during development you can use the following commands: + +``` +# Start the test server (can continue running) +node scripts/functional_tests_server.js --config test/interpreter_functional/config.js +# Start a test run +node scripts/functional_test_runner.js --config test/interpreter_functional/config.js +``` + +# Writing tests + +Look into test_suites/run_pipeline/basic.js for examples \ No newline at end of file diff --git a/test/interpreter_functional/config.js b/test/interpreter_functional/config.js new file mode 100644 index 0000000000000..47731f8897f96 --- /dev/null +++ b/test/interpreter_functional/config.js @@ -0,0 +1,57 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import path from 'path'; +import fs from 'fs'; + +export default async function ({ readConfigFile }) { + const functionalConfig = await readConfigFile(require.resolve('../functional/config')); + + // Find all folders in ./plugins since we treat all them as plugin folder + const allFiles = fs.readdirSync(path.resolve(__dirname, 'plugins')); + const plugins = allFiles.filter(file => fs.statSync(path.resolve(__dirname, 'plugins', file)).isDirectory()); + + return { + testFiles: [ + require.resolve('./test_suites/run_pipeline'), + ], + services: functionalConfig.get('services'), + pageObjects: functionalConfig.get('pageObjects'), + servers: functionalConfig.get('servers'), + esTestCluster: functionalConfig.get('esTestCluster'), + apps: functionalConfig.get('apps'), + esArchiver: { + directory: path.resolve(__dirname, '../es_archives') + }, + screenshots: functionalConfig.get('screenshots'), + snapshots: { + directory: path.resolve(__dirname, 'snapshots'), + }, + junit: { + reportName: 'Interpreter Functional Tests', + }, + kbnTestServer: { + ...functionalConfig.get('kbnTestServer'), + serverArgs: [ + ...functionalConfig.get('kbnTestServer.serverArgs'), + ...plugins.map(pluginDir => `--plugin-path=${path.resolve(__dirname, 'plugins', pluginDir)}`), + ], + }, + }; +} diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/index.js b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/index.js new file mode 100644 index 0000000000000..95d6a555ebcf0 --- /dev/null +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/index.js @@ -0,0 +1,39 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function (kibana) { + return new kibana.Plugin({ + uiExports: { + app: { + title: 'Run Pipeline', + description: 'This is a sample plugin to test running pipeline expressions', + main: 'plugins/kbn_tp_run_pipeline/app', + } + }, + + init(server) { + // The following lines copy over some configuration variables from Kibana + // to this plugin. This will be needed when embedding visualizations, so that e.g. + // region map is able to get its configuration. + server.injectUiAppVars('kbn_tp_run_pipeline', async () => { + return await server.getInjectedUiAppVars('kibana'); + }); + } + }); +} diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json new file mode 100644 index 0000000000000..55adf625481e4 --- /dev/null +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -0,0 +1,14 @@ +{ + "name": "kbn_tp_run_pipeline", + "version": "1.0.0", + "kibana": { + "version": "kibana", + "templateVersion": "1.0.0" + }, + "license": "Apache-2.0", + "dependencies": { + "@elastic/eui": "9.4.0", + "react": "^16.8.0", + "react-dom": "^16.8.0" + } +} diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app.js b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app.js new file mode 100644 index 0000000000000..ea5d894b21d46 --- /dev/null +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app.js @@ -0,0 +1,80 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; + +import { uiModules } from 'ui/modules'; +import chrome from 'ui/chrome'; + +import { RequestAdapter } from 'ui/inspector/adapters/request'; +import { DataAdapter } from 'ui/inspector/adapters/data'; +import { runPipeline } from 'ui/visualize/loader/pipeline_helpers'; +import { visualizationLoader } from 'ui/visualize/loader/visualization_loader'; + +import { registries } from 'plugins/interpreter/registries'; + +// This is required so some default styles and required scripts/Angular modules are loaded, +// or the timezone setting is correctly applied. +import 'ui/autoload/all'; + +// These are all the required uiExports you need to import in case you want to embed visualizations. +import 'uiExports/visTypes'; +import 'uiExports/visResponseHandlers'; +import 'uiExports/visRequestHandlers'; +import 'uiExports/visEditorTypes'; +import 'uiExports/visualize'; +import 'uiExports/savedObjectTypes'; +import 'uiExports/fieldFormats'; +import 'uiExports/search'; + +import { Main } from './components/main'; + +const app = uiModules.get('apps/kbnRunPipelinePlugin', ['kibana']); + +app.config($locationProvider => { + $locationProvider.html5Mode({ + enabled: false, + requireBase: false, + rewriteLinks: false, + }); +}); +app.config(stateManagementConfigProvider => + stateManagementConfigProvider.disable() +); + +function RootController($scope, $element) { + const domNode = $element[0]; + + // render react to DOM + render(
, domNode); + + // unmount react on controller destroy + $scope.$on('$destroy', () => { + unmountComponentAtNode(domNode); + }); +} + +chrome.setRootController('kbnRunPipelinePlugin', RootController); diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/components/main.js b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/components/main.js new file mode 100644 index 0000000000000..3b1744457c25a --- /dev/null +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/components/main.js @@ -0,0 +1,104 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { + EuiPage, + EuiPageBody, + EuiPageContent, + EuiPageContentHeader, +} from '@elastic/eui'; + +class Main extends React.Component { + + chartDiv = React.createRef(); + exprDiv = React.createRef(); + + constructor(props) { + super(props); + + this.state = { + expression: '', + }; + + window.runPipeline = async (expression, context = {}, initialContext = {}) => { + this.setState({ expression }); + const adapters = { + requests: new props.RequestAdapter(), + data: new props.DataAdapter(), + }; + return await props.runPipeline(expression, context, { + inspectorAdapters: adapters, + getInitialContext: () => initialContext, + }); + }; + + const handlers = { + onDestroy: () => { return; }, + }; + + window.renderPipelineResponse = async (context = {}) => { + return new Promise(resolve => { + if (context.type !== 'render') { + this.setState({ expression: 'Expression did not return render type!\n\n' + JSON.stringify(context) }); + return resolve(); + } + const renderer = props.registries.renderers.get(context.as); + if (!renderer) { + this.setState({ expression: 'Renderer was not found in registry!\n\n' + JSON.stringify(context) }); + return resolve(); + } + props.visualizationLoader.destroy(this.chartDiv); + const renderCompleteHandler = () => { + resolve('render complete'); + this.chartDiv.removeEventListener('renderComplete', renderCompleteHandler); + }; + this.chartDiv.addEventListener('renderComplete', renderCompleteHandler); + renderer.render(this.chartDiv, context.value, handlers); + }); + + }; + + } + + + render() { + const pStyle = { + display: 'flex', + width: '100%', + height: '300px' + }; + + return ( + + + + + runPipeline tests are running ... + +
this.chartDiv = ref} style={pStyle}/> +
{this.state.expression}
+ + + + ); + } +} + +export { Main }; diff --git a/test/interpreter_functional/screenshots/baseline/combined_test.png b/test/interpreter_functional/screenshots/baseline/combined_test.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0ada1c913a86873ea8044abd9f09fb32dbf406 GIT binary patch literal 34153 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 literal 0 HcmV?d00001 diff --git a/test/interpreter_functional/screenshots/baseline/final_screenshot_test.png b/test/interpreter_functional/screenshots/baseline/final_screenshot_test.png new file mode 100644 index 0000000000000000000000000000000000000000..35aeffaf46c245df78ea383134fad35dd21a2a80 GIT binary patch literal 34273 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 VN+?=oKS=+?O>O;arC0Ah`Y(hwfMx&y literal 0 HcmV?d00001 diff --git a/test/interpreter_functional/screenshots/baseline/partial_test_1.png b/test/interpreter_functional/screenshots/baseline/partial_test_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3d9214bd6ccc440346cd711905881187ee9d34 GIT binary patch literal 22116 zcmeIacTkgC+da%V>JbZ;BZvryf=CAysiCPLBE5GI5K&raA+#iVqzDM82uO{9bO_Qr zQ4mlNA~m#-Lk$o}fB+$c^1Bm!-rswknQ!L%>znyzjx(AVbKm#g*Iw7U*0uJ=NCQ1h zw&NF%v#_wRY28;hVqrPP&cgD$1?wNcCtP2)s)3hdUiU41Sy)c|$@u+S9}d35!g85K zOZ~P$!I%QUfB*+uYnc=*{2CuWBa>mcE_UcMeC@6O|f*PeRD!DN3pwz@QF(!Kd=n|MQ;3Cd=UPfBvF=T;o4))jt0FF*6qb z4>37X>9x?w*|?^g$@-s=9l!s7-@jy!`p?JD{{8qM6#vHLAP)Zm;#X??3y6OK!SZi5 z{F@CdEdL)+!5@=;^tMk$1vkWtOWESg-h~Bs`A2{@Nv!zcI>8V~N3PcxsbrE)_Yb{s zbTd?_P^@Kbdc%R7+&^if*{~7>+4PH8oTE4lMrJ$oWxjB5r%g0BHrKgnZ&`ui_=yUM z@&43>IML0Byv0*gXKdeyh&=5#U};+q%KyV>iuDbxozt4FHU8ieh-TNP0lR5JE&95! zTLfYfAz@uvNCZ(VZ^t)UUwQ-x}NO~jo3_K4HP76axNxU@hQ zmQ}|F%v&BDzuuaFOC=v3mmCVUX){MK<}y{vxaOF}dy1IH(x$~nhda7m|>$T_F;J;bv#RawFPiTs_D7e0rERhbn3KHL)O>v(5vIcX2lBs<|gByR5bsxz4#tnq( zgYCE{R%YH^p^+3(tFZ4<4F~C?e=uJes|LkZ>+?S@_`R8uskjzq4fS9Hl4Mp%8>+8w z;a`j@J#&*iC+nE$(Y3_s<=|>I*CG21^FP~phR^j>))18LnuFn53UjtOl%q0TSg2`pKgYBv{>1?0z*GY#zN_SaC zT5oO8`i(I(AS3Qtn`1w93o^3h!~26I6PO5oz&T^m6Nrxr%dE(2xGaru-0e(zyq7(D zBEmT%!bey^u%o6#-VRA!+RRYkwY%vNvKUAnMY|0@e#@Mn&cXc7dH@*LYfHm+XYj<< zRGoJxJ<5BJOqUVa82|45RA@}{aT?P^wse0M{4rX;Sj31cX!>{#j`=|luG;B}C zICR|DOh?7<`o={&Y(sdakNya0fQ+t?qZS8j{oOo3!8g04?%X^G@P%JN+2AZn%9Xqu z;@Ur|Q*vcwSun{qF$Dw)pV=i#+P+?Fl1q4XqGQZTI^N#LeY`7I_kLA)jZ}v8BXSaR zonHM~Ct{3mUasWSkAjk(aYZ{7*quelyL4sgd8(|9`w6KBv=>=$ry#E`i5Mi2K*t8WkBCm2z$N~B669>9v zp4Onv`O&INJ2&REhpp|J*a5RR95BnHak{TCd&$L_QyQR@i$-Wl5lGfqwiO_-Zla|A z8h46qIS`*`Ee6a=@~!p}A*IqeRw5?vkBy#)QzY%(9)+sG1QAp{EaJD*Ate&Y-7AmA!Ul-6pDE7&Jtzx6D+B;l zsUV6+DqU8^j|%s^K2iO|zYx0Dk|vUjS?i`eFe+I9R=cxQjmgAeIZQ|BwFA9JHfMrs zuH=LZ+hTgUGHz0^zdbLA0F;x?kVHhatJb18rn06>3UhE--mlAyi^PnQ54c_(r!X^6n4%g5tzEAw$?NMeI*wFIZpXK!eY(~I9O8C8jwowXiBFuK&e5tNDH(PJn#T5N=&po zJGr>f#E948?;VW-GB4oN2<*FDIC2&lptho+C9Fn`%1^!1AeuSZVR*EQjIg;$k2F=j>6Z^S!f&~+) zt=4UeD9ed}GI&3&%$)XDF3YekSTntn*^Jcn*Gq8?b)jls&aB>Rj58FHIh zPc91p#Wg|>Bc^3LeBZxzfh&t^(c0Pwy)S@ycV4%h&$>ZrW7}U=rc+9v35Jmm2VnS3 z>&pCHx5OMtH-@lv_fV2~)57+a!ah01&8QR%r0-gnF>{!*2L$lwGuGez zf$hM36qq!6^P{i3yL@s`IL5=){+0s5VJv)rXl($sfCqLmGW**f2W$0vssZG3-pyXJ zc;HPxKj`TNaX_8vDtE~Fdy1qKgKMCDrmHH1B3dQ7 z@2X(3wnqml#+zNNduMiWO=HHTXkPy)B?=a1iQEYmYgfquL;{_bwFFzv_UIn4;?Tp+~@2z5^6*sSk6N9q2#cKFt# z)bIa{nucpFLB#EAIQVSTzW zFzU&H=P8NT9d6rhExwptwfw%3JmDflwx}+X)GMu{MZd;!?<-A+yg{vUsA@zi;Ss51k~sGnfG52NbQW z?{I+Q3$Rdovdc^ok_lsXCJ#R2hs?&RYF#08IdvWNTLuk;3=-1aT~F7%YTEgM!CRki z$CRGXmc13)r_1Khm$kjpcH`(29=)R$_(Z6RlithBuqw!LlVVB-RwhA#R z6^rVPgbHX(DS^YWM&=3LZ z(NbV{eEU|bjG-+Yl;7&W+h8BLfdyD0Gr{$N72?0KK86#bVP1HDs?NdpsI$3%P=Vln zTI@;~U6O3#_o=!Hj~^Rtpzp%EH~XcwNKK~QyF*5>^_G|PW`>LgsA|sUS`c|HuO)24 zWv2C<0?&v{?o0pSzz-qhPoz%*svw5!|9t--TQ%lwv|Ysiz6#=C8#<>Q+fL9GQ})Nv zT_ja6k&)%=Pta&V%|hGlu_Th}^$+F!2^}@IrO!;<0U~GtnuYImI_spqBbjv-0$@tw zfJy9p%eN-y1|V^o*~9o~Y?A*gb3U;0g5Beeq?IcBc^P0H#9q*jQcZ&LxYm(eL}M#A z#n@~Ebw&zuH$TCt$)DVv?pjo2KUI?+m&s970WXAypQR{!cq(zh9eUoSb*UrDeZ29c zd$e2AfIL$`7^rJn;p!0PiyMLsYu}_)|2H3L2rHalGWw0Mxtj1I$P9q=swJ{67%@NJ zxEFipyE3w=K^!g_*#0mi_>O7F&}h1@z!WH`xKODP=mmf$F=!6p6#|UJpm)r6y7E}` zTreY>2Z(fUjpUs*W^??S?I49hH%;wT%*01X8?vv!Oi=9_8j zNURq{KO^3zPa(ljOwo4 z)C@QlGf8>>$f3%rC7)yS&n+Y9d$!$WCmg=Sp|&1iSAEW z&BxXsPo$h%ZPq04a;==4CScnz-L^2t&qz1&{4pWDnh2RO{Rr@0Ex*b%=v-k-U1Cqx zu3k0LlNFp|{nq!*JW#M40D93W7Fb?FPBd0OY0i5zR7uqK=Y4Ar|KF7=>SuWjo4Ld( z*xp3B7k#VKt7F=9GLe2-iA>gVn6JypO74p5K&v)?f`692+Q4VKJ-(h7XG`5HRk66F z0@WX(Jl-}Ur%{j!T$28NoXgZ3CAl{nL$*VK~oO9|0V8TMY=L$#fs9NnCrDB7oi&OxZ*JA*v2&+6B<+l2B$ zZFOUkEsdw!st4S*D5l!cb0B(!skTvR>C}$pKdaOS)@5N;&c`M46VL=tS5}mFag|?xui>BUelvpX=a_vz**yH;^eSJ_+3!4abHKXr{2BoQ~0XkHPH#Yk7zZT}+ z^Y#kfNolC97bR!b3nZ-7+MT4yR`kJNRS2p%_Gq9#Zp1iO@Lcu;zo zV9MoJf0~nwZh804roVh3C)18l^>3g2O;xIn+DAzAaQ_yF3YX^H^%s9|T+gza{$qh* z2Kh?J=n)=*dlpo{_if4&=W8veN5sbDBE1p80f_F33_w)e45Cj)Zg#ulNQmZ ziuOk-(MB_P5z^$lU_+Z#V78bm%xduP-TOd|Od!LPPG~@c#-`BwOE{no5w|@uVtX>+ zn)!m53$L7FIHxP#7EQWq&aH6+1`XghCHW=`j}$lqJ-6YG*&e3d1wcqWEo2UB>c6S8 z2-)2jo&Bd6|17*ZU8ji(nz4lHv)c3cUfwI2x=(~4P0jlMBI;!00SaH0?_4|RIb!IFPe0Ux21)S6auy;A`+(T-@j=60L1e?)wvGTqs3WyG5aa&Qw)G!lZBr8f(=f z&Kv;N*fcW0^1J>*5B7XB1)a0vO0D1cCeL#KhNZ7-QS>Gi0=TPDE z6UK-n-DS>yHZsrn-|_fv?q53W3LanIpB`WDo|?6FjoW}N9pD>U*~|M z=AN{+F@y={^SxzF4u_HU@K0m|UwoC{-Md@u0!jGfcj0=nwlHdDHyyJX3@*<$^tmu0R9HVj(QYOA z`>M131>e8xG4->1hcf4e!#G2RDjG2Bpo<=tDd`G$%bz;&qWuqJ6@mfI$!xB2R^Mq> zsrC;ntP%pPr4gTCmV#WZQ;ZSF7b7zF;caC^;Lrz)7v!Mae|?J!0eB|dny;kxu^}P0 zqo}3cRyVUK_#tTjYEH)YXd->t%x__P>ir>DM@c$(`Qp!ti#`6KPjfn2k~$LYeVZR8 zWx4p@3L}wP2sBy=hN0aUwnvC&$4i?Q!h`n{lJv zG;tQN8OMh@}?BT6n zW_nd#++bMhgZ5dIYuiI44*|tgYN^FL(YPet)H8s7m9B}+=Cm?K)bR2A5G^<s#ujo0z zkL<|rTwDew)=3zwxE9VJ?jMM(@Nh#f&v|7hLzDN<-`=ov;+6%)y4htK-r{ro0Iv0W0_Yzb-uv;N!I1M{!MtT>1nQR71dw1-$0Ek$B@I?ejy}^X_v;yQn!C zataegn(*W?2sEsMcX`sqMfXAaG#+LB2CEQ{dp2QPe|aMf zt%$I)U)6z+{9ry;>fpKR+WrB7x}E$TfD_6ZVVx328-YzH1z!9*s*ffxwcW7MN>L@H)eoPy zlMD9g5q!rTRH|xMCoirL^pTujQu)?42yjoBTS-0AHruGN2!{?nCVJZR4rcYHxdBT5 z(D|ppSmKKP`fG4%X=M{q`lT6+s^p49j zkOQnNpUU=+eg%%UjNm5MxvvI*MEL?o9*BFLUk?C4EE1OGAkHobHz`95KSt2jkHN5B zN_4=Rj4&07J-;I-%4{@?4ifk50z#?8;MRCp)>m_XchP#ATr=}WbI^nDMF0AZR;I9O zSXRaaF>#qYnm-O;q%ej(y$BUW`=yLxBAhrc(ox2onB2V(kFLm-_1+SP%}E)Dd)8=Vx{Qf^YgmZO)P`ApS5K;Ic2v$GbGw&Q3Nv^>p@JI>kX)Y)LuSu>C;Ye8QJ7@iY*54uE+1yMr`w_kiEG16bmLV}^vdM5&X2 z-N$b&)~5ccCM166AvnWUDqueW!~t_2i=)U20ptD8 z9xcBJJ4dsDUrr30P^(K#@o81L;I-GK6u|xtBQN95x?1(b4dW?Ky1|dT7cG9&f%l6) z6=b@rX{68foR}0S0!LF(ip`XI@+dSn7cZ%?QNq@$!n}V1lc!h$`}>2JU0qL}en)0Q zH2DVxbp6FO3Al1cZQy~kuR2;88?KB>q*H=o1x)=l?o67g9N!7PT`iIMcq05vkALOK z+Wd;mnT!CurWx*{RfFWI%VQZUr-{vcs&b|NxKEg4z;rARN~GFt$i{l;-EKk)U_7=O zLn0XL0@H*k+nHW^Jb3ANblgxl8=FuIus_psQIICs5x+~EJL)9jGF`9>+lPP9NMGfM zo`Ti5!ybJm?|#X6%jirag7ttWd=q7IC(C8yjC|3Uu(TU=mkxyL&#WE~kWf4Ql5nuk zXR<_r-C0#ChMUa2$y~dGbYyw_gDoVl32Xz{6U+lTV!|R zZ)nmboDVI(aKPPa#=AY|K+DG8^S$Otp9c&v)?mw9ZnHRO<8dkhi!nNnFj&aP@C!1Yw~Q9+m|p z_bFl;Ft^vHOnPKd`?3r&KBp~@9QD$#{RvqOq@MhkAJ1d#?=13UV>SIyhJ${8CLF08 zl<7Tukedf-&vLx5q)0i$wY8}%w1TR$VM^}GF{oS{-uw--I?fvvYcH?t&YaV)9e0)^ z2|V2X1<&Gng#0CdK!mJE31AY3z?W8dQcDBiJ~DPna>f4$!jXz;zqZ-6?)Do%GEb*a zPgUkq;s6McQxT7LpSf5DJ3`TS49f+2y?Xu^99Y=ZwOy>Y?1|(hv5B3*MQ~UrWdq0r zwP-~kEz}yxtDS;}GF&{DN4M(GmXu|OgH%2^guo*FGBQEiX?3n5wS9A!z**mnc5!Xo zCu8BIcziVy^%B#x)(oQRajz(;irSx1rM5|&W~2WjoVQ;|r1q0vmVL1?J}nW4Nw;gd zxkuLr*Fry2LIR0#Q-n*3*TKVt!z^3-%eV+M`{1tJ%Kl;?T;!t6W#RK@mW2NRMU`b* zeEy5SU2;>>Kl>iPsA$xYBW$R6NM# zu?r?GS=UFUl>FPX=MO$GPw@_4tLGR9bQu&<-h?&4O-r%mBWWB{N6!iF0gO^IS{y+Di?i&f>}I!vC|{C8)@}NO!XiHs2ZQu_zzBt zpF9p@TMVfqHB7Y#LOJP5!Tz?dpO7UG4Sz2;L}7+d<8xRB_zs1sF^<2mtk^qDgHxk& zid4nyb~e*}tn0V?9a|I8jPpCnzXr|tUgW{o8E;>+9)#`RkN=Gc0|Wm8f*A$ikAIWo zAQJyF#4kkr3y6OK@h?68N``;w@mC=JrN{qQ^tcmYP3hNf`%wfIzNVXDHNOA3wGE8k z%{2zDeinY1`O|%Wlpzsz){Q%zZn`yCd_a*!^-^}Z#D1WP{i?=l=M*-`U3ITkbQ#}B ztC{*6&11TQ#P2J3nA<^`Vu@;KOyGLt)F=@wDcS5dmx!1!+S&aw(l%v|AMPWhLe2os zd6B}@c%LtCwx@!rtWoRLF+9@MCsoDm_ab}fr@aSdV)Z+?LgQ^gI$)eMj?@W7CnSJK|lYBQ?8v0#RYncD>#nTYGfAs2lVcBE@%eep-L= ztArl%W(f+cVzHSS3k>bTv;TzD=EFR6j7`Fyr(Sb(N>%OzXsHhSTjJx3U#*U@hs7l# zZ1#2=$j#WN9>a}+zBl$(oVZm~??Smud3KVrqYj-?EZ%BGhP#Y?mA-&kM1UCG(z7pj znN7^YGhIib^i&`Z;$-)?vFOg@V*1^w_B`+b`-TEC#=Cn6dQlj_X z9O(7r+utUZ&Ngom#)bB%jlED#n*htzZ)tUHQs`o`D-uFc@%Jr;?R?K`Q>H3g=penH zj%+UZy0A-^HfJ{CRrecZgMSdjn)B)7wTWpXaY|-b|JL@H4eaV_9%OkUh@M`*7vk`x z#c?5+T!S+&IUMDR3!>YOJp0<99lXCIXuVCJvnC7oWcWKMR7*|xoF+9>pHCH)qMs7$ zr!C#Gymqo(VN$lgkBgM=7j@@h?2C#9Wgvoh6^h^&JU;UarCg7s)kqIhyn*uGtP zagCZGsfqg47~@_A#Q@oDW~Z-&Sk-$4bz7%|vvC8#MDLQiLf1@Gj?AENgeUigpqiB6ah-;ja(@m9YO*LZ94dHPQK4kL$E?ngyq@z?v+IH+ys(EFB+J9{4d)KysHQz)$(BW8NX?1(tOE=o?a4=mwv>+U&+(R%g# z9!5(e)bZX@nSQ@-y8ObcsZ_haG}13%4Pm+UF!AT6dq}YFT;j9@wC72`^%-Jj1fPii zXkc9UE-wZOex5ZRO#UPgN8E16zr>%pdA<9`&9I6)u%Q(a*#HB0KbgNwX4N zx{^J?b9GA}|CXj8^*b~mvDvW-WwXcH;`J1yxhEnEZ&t-`cHcdAH`qq=3A=FpY&9rY z*qk#u5zsVU^8YI94B#?>uz{V@mNjkYg`l` z!X}~TO{zuQv^AUdk9x|4J6>J5VDMOf=lMZ9(XNhL#A(*1N}uKzrxeP?U_%S^;gYiR zSJGL92C5@jx+ELOIIlmIw)00dl58xo*F=3xqMbka5K^wMe!R5osDK(RQaVsvpU*k;xstXlfj3VD4f1A^&T9aL-ipD{h2e8Dn?g0sHMt+~#;qj$5=dt6Q6qX$ichX;UR%?0ME+V{le! zww10}N8AK-{23ejEXg6;%gP?INOf{M9JPJ(8ne9pA;fg=tP)dgirvq$zPx--JlTYo zWs8v3K};G_^a@#BbOR?Q7&u0&se637a_2H1Vuzd)pLIv)u&rxSiPg>`cY*Fjuwu>#Y75g-cYTM8|@Zmn$!ozKSI(2{F zKWuEZFwJVKu93J^EdQ8bOYN+-2I@yF)l!J;B-b&T4#nGJH-8imI8=95oLnjMPWl6; z-y&aYLs%pe1&9)V_vfeFKkQy8M02Xk8mu&va5A7%!?e`k; z1@-(tU63W;{s6LVxp=Ci1~1aQHC0qTr7QW-XS%xv>R}^Sc=&u5tW6mau$kTVDq0c~ z{*Hf`(=;gvWUqv-nSh&ftwqglOohZ`#Onb;-zFVPlF7deVU)$anB%f%f4*8Ytn)u~ z#eiL#f9|ixRkt(t=4Z$qL#*r@&N^Rx*T0mX?vhZ+uExddck9y;-$E?`Wil+wT)HQg z+27mfd;ztSH>%>d?}o>THt+96)cXVF)>^KNC-Y5|d~S{F^()tAowTyvS1Q3eE2sWC zAtg4aLL=`#9}_lM$DR|y>du$$Y&N(bLDF4Y1nU+rmsJ{<0LoFUfxUlwgP6MM9r~AJ zV4*7>MulyTGKy6Py*Qp)mg)rX$XT=Zev1P>$z`m&Gl}`B0Kbknhluk3ZN$C(@^5X8 zP`Z1()Pl5R2}u9dSbbUTEG_1^nX>5QlCKxG z9U{rXK3QWAx5Q`TT9Pk<`K&T?qhF1Jt2~=GVo^sJk&lEvK$T+#u@ffH-5Aju zY@up~A=vr{<^uPi>(YuedYR1c8Zh2-9IM4c)zOz3X7Hi7|6$>Kkc4|#e`$KqxjpMk z9O$F7b&gq8{Drq>3gsIsR}!k5?`Es@HfZB9)#$|(ZsO>@hdGY4HT}iSjy0p-z?OzA+%!WAT`|0w;jUF(+v8#QHT*b9rUR%NRKCFera14WL!^xle~KEAzMjl-Y3oi=R@j}>m(0J{}Q zn*>n@js0TULS7=;?XYS1pm;XN?c&kdK~esPW@FVpyXlv(b!vv85kCAs`o(QHI9hzP zb!XKd7RbsE7N{B8t8&xT3{8Fq0m4TDT=IuS^UhjPJuxb0NinDY zfNrrj3=jDBKbmuVW=gwIrkis zaAV36&&98mDVZJ4zqHdK;Cv*#Y&!PGrlv zquE$rwP70L3{U~5yfPN6nXl6{(Zl;AH+@! z3N>I%B!bO`c=>K;G|z9*Ma~Hqik~nqlASlPh6&%1YBIf7Bs;sbV0(;xV*@9>Kf*bB zF}}_jJ$j5?S(aLmdj(zJ9O!vlo6sFLlNDu}=eK>pyOdz|1L8gXKg9b(;*0Uw1gp{H znQjj}oC;I4H=)1O+L?%roGrWt$en=4dlU%vU8)7xgeLISNV{qoIsqxo#jhrgkz50s z^M{SbR9X(f7N*Uv#esTV(wpOO7u+}ucZIgM-cMiSU{vEStU0%E5CKPB994gEg$L31 zRC(`GS5VBb6LKB7zfL$i3n|{3>ZJ4X@m(8a!O= z#oZDf&fP#-0ya@w#56egd&34t>oxslV>Bd)QOHx}z@+}ISkWilqP+uAf1AkxIR&GB zl`q91Rud_5<@2-VM<0CYK=!p~O6T9@Qf_Aj>(ng#_3dX-~9}_}Otbo3T`q+j=ISBOc<)1Qa*xx&P z$upq2c5igk(DtJgY<%&sCxTwgO)cwpk|?&U$i0C0`qi#fkn>X^AX>HrNxqO&i#1Uo z9EqlT=Q-k96bQB!HKBH>?fc@H15W{(TCOHELptu6CZ6ev-k>(?E4u{6VXPZGZL3rC zvOPMkG;p5a+zpOw&d)U+n|lSsZvYG=S^7!fr0K$|`rTC=_xB^l)y^M;YaUsfthrvT zdG!$VJS%UmTZ++Ac8viNsyc+!OOJIU+Er!)nZ@j4cZAL{e*Esj=TWvmh7?(Pd*{aY z;l=Y;-dL6WFc6RN+pLq0>ZS9H6F(wM6bruT7I&0CjG4J++p#1kxeSI*?PNv}#h^cG z=hsv=yg~6Dy9*VbxDLJ8s@EqRzE+DKrta+MYNHp$lC?JV0)j^iS8vKhJtfus1=oC-aYM zoZhYQL^K9p3|uRq?H*@`7?bQw%qLvu+LG)fJHW42Svxe|i?mzRz*R?&v%_c!Oj3Rk z#d!J5GUWMfdVz+Kv5_r|hwlY?aK*lS)&dAITl?8Z^Ou~RlV1aB?)wBAx9lSfZ~R(! z;{7h&EZGyjHbJyO$TGQ+zV|=DDS`0OrH54L?i#jqRy|nd&U9i=`U&=3r_Hqb&Umx2Wu3SQ6MhidPdFI#58V)ha-8(AD^=e zM_twhJ5;$Q*#<5H(oLDV6Ai(h*Zxh?eow2k<6c$GsFQ&DKnXr>yz1Wjn?mLs%-!N= z&vh8C!b27}xtX)38YvPOBO(Q3&JJ#_`nUz?=`N@2LOn)1E!DjD*jXWxzWEj!9VR8! zW7ZToo07$^zD(HLnlAJ~cseRqvtFE0--sWrPBJwmM^c7J`#@uv7bQB#|Lqe66+BoK zH(R#d*U_Z=w|^l#LTNCL)OZGy8yyx%)IvFwF>%aXgCG z+Z}0u5sS7LyQ^d$vT9m3mxna^DRk%Vjh?At>V&(F11Kcdq_7vFg3+hcUDfl{l%%Ew>ArGPIW7^@*U1z_^%YzwEJI3AyVr&Qp2{8SZ zXB*C3g`=HZ`;?AM=Zz?lbW8WE z+;Mg`yoZjZV2)MjD<2O569WlO#VD=*?$ls2-Ma13)Wy-|Cj1qVzkho2QDvWx6)?2I z$+P7z3%Q<(e0<6|bVO>D*9|E6=4kbScztYDbWZhNZR<+n?;4pSYhDOtZ=bm8y26`- zyBtnZF0-BB=v7Uf9lQbNR0BJ8cbCsYISEh!vopEAatm3Ht~5qDcrh$&)T!0$a9~Ry;*t!I@A8O zwxm-RH)e;&hQNP4wT&9%pYme{L&YFWpK~ckszul{<&3y2P6HzeG5j zMvhiHb?{n-^EqmzjL!t295sc6yg-94>5Xw$wzEfWs=>J2&aM@Dpn*oTt5C-ci;`%) zc3Nc}p2{GG#JxIa+M1$5z4y&Xt#hJhCV)bMI0Dd^)Dx6Vct zzEt~~5zPCV4XXZ7^e@gjw;t2T#hF?XumowU({GocFJF%Za@yGZAstS-SvaYT8+x8q zi>!iKk5uEIs>hviBJC=?{$1lryBQ**45&X{W-o~|WX+c@6}>X*Ue#-85BhfPJ;tU;LY-X83ZEe_5}Y6#RM1N2}PCA+eSzU%x^^IT+30 zQ64`FE|rC4n;W!?@iPhxBW>BO%d}{I{jjIdc5y%TM$L@H;ks?LkGFJK2cm!HkT{Ri+%IF~=R)cu8UZ81nPUHIT1<^par&_#94B98L) z=99BGU8zcE(+W7A*Ro!z^vz)PoV{b5ei55~ie2MEQ35;;{_RM8HROZvcnFbKqRBj4 z6svZcy^W&$bZtOI+3D8wt zpe}D;6pj+K^laKig%67QByc%$dN}Hi$*`-R z$0{9&4T}O(yBxBxKcvB7nEZEWygvBC_AvGHs&h^h>z7;Sy2RT;pJcOq{swsSSR1JC zDh1<4jP;N$yM%@QyrMa@th)IAT(lrr++zXMZe%Ky?(=vP)V{$mTiddd?3eHJ)kr@d zL#hzhVXt2IWSVMswxQ$D5XWMT{f<6`xVRay6sO9?+k{tvoR}3HoG>2-dQBB*_<8NTJ131-HrvE z`poeuo7Is+ndGtM3eWM5_Xc)=R+}9v?z?BNVQ}SIv(p{bX7KWw$syfPh~uk}JzCW5 z)sr3XEoR%;AD!PVRQT>}37=YfmMxby$NHod>^A8G^HUm6~QpcrG<($G^! J-Ff)e{{fy>P-y@F literal 0 HcmV?d00001 diff --git a/test/interpreter_functional/screenshots/baseline/partial_test_2.png b/test/interpreter_functional/screenshots/baseline/partial_test_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0ada1c913a86873ea8044abd9f09fb32dbf406 GIT binary patch literal 34153 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 literal 0 HcmV?d00001 diff --git a/test/interpreter_functional/screenshots/baseline/partial_test_3.png b/test/interpreter_functional/screenshots/baseline/partial_test_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1739c32f808ff87812c82988acf2cd241def5be0 GIT binary patch literal 23587 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 { + before(() => { + expectExpression = expectExpressionProvider({ getService, updateBaselines }); + }); + + // we should not use this for tests like the ones below. this should be unit tested. + // - tests against a single function could easily be written as unit tests (and should be) + describe('kibana function', () => { + it('returns kibana_context', async () => { + const result = await expectExpression('returns_kibana_context', 'kibana').getResponse(); + expect(result).to.have.property('type', 'kibana_context'); + }); + + it('correctly sets timeRange', async () => { + const result = await expectExpression('correctly_sets_timerange', 'kibana', {}, { timeRange: 'test' }).getResponse(); + expect(result).to.have.property('timeRange', 'test'); + }); + }); + + // rather we want to use this to do integration tests. + describe('full expression', () => { + const expression = `kibana | kibana_context | esaggs index='logstash-*' aggConfigs='[ + {"id":"1","enabled":true,"type":"count","schema":"metric","params":{}}, + {"id":"2","enabled":true,"type":"terms","schema":"segment","params": + {"field":"response.raw","size":4,"order":"desc","orderBy":"1"} + }]' | + kibana_metric + visConfig='{"dimensions":{"metrics":[{"accessor":1,"format":{"id":"number"},"params":{}}],"bucket":{"accessor":0}}}' + `; + + // we can execute an expression and validate the result manually: + // const response = await expectExpression(expression).getResponse(); + // expect(response).... + + // we can also do snapshot comparison of result of our expression + // to update the snapshots run the tests with --updateBaselines + it ('runs the expression and compares final output', async () => { + await expectExpression('final_output_test', expression).toMatchSnapshot(); + }); + + // its also possible to check snapshot at every step of expression (after execution of each function) + it ('runs the expression and compares output at every step', async () => { + await expectExpression('step_output_test', expression).steps.toMatchSnapshot(); + }); + + // and we can do screenshot comparison of the rendered output of expression (if expression returns renderable) + it ('runs the expression and compares screenshots', async () => { + await expectExpression('final_screenshot_test', expression).toMatchScreenshot(); + }); + + // it is also possible to combine different checks + it('runs the expression and combines different checks', async () => { + await (await expectExpression('combined_test', expression).steps.toMatchSnapshot()).toMatchScreenshot(); + }); + }); + + // if we want to do multiple different tests using the same data, or reusing a part of expression its + // possible to retrieve the intermediate result and reuse it in later expressions + describe('reusing partial results', () => { + it ('does some screenshot comparisons', async () => { + const expression = `kibana | kibana_context | esaggs index='logstash-*' aggConfigs='[ + {"id":"1","enabled":true,"type":"count","schema":"metric","params":{}}, + {"id":"2","enabled":true,"type":"terms","schema":"segment","params": + {"field":"response.raw","size":4,"order":"desc","orderBy":"1"} + }]'`; + // we execute the part of expression that fetches the data and store its response + const context = await expectExpression('partial_test', expression).getResponse(); + + // we reuse that response to render 3 different charts and compare screenshots with baselines + const tagCloudExpr = + `tagcloud visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0}}'`; + await expectExpression('partial_test_1', tagCloudExpr, context).toMatchScreenshot(); + + const metricExpr = + `kibana_metric + visConfig='{"dimensions":{"metrics":[{"accessor":1,"format":{"id":"number"}}],"bucket":{"accessor":0}}}'`; + await expectExpression('partial_test_2', metricExpr, context).toMatchScreenshot(); + + const regionMapExpr = + `regionmap visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0}}'`; + await expectExpression('partial_test_3', regionMapExpr, context).toMatchScreenshot(); + }); + }); + }); +} diff --git a/test/interpreter_functional/test_suites/run_pipeline/helpers.js b/test/interpreter_functional/test_suites/run_pipeline/helpers.js new file mode 100644 index 0000000000000..8d8f65bd8d8e6 --- /dev/null +++ b/test/interpreter_functional/test_suites/run_pipeline/helpers.js @@ -0,0 +1,127 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import expect from 'expect.js'; + +// helper for testing interpreter expressions +export const expectExpressionProvider = ({ getService, updateBaselines }) => { + const browser = getService('browser'); + const screenshot = getService('screenshots'); + const snapshots = getService('snapshots'); + const log = getService('log'); + const testSubjects = getService('testSubjects'); + /** + * returns a handler object to test a given expression + * @name: name of the test + * @expression: expression to execute + * @context: context provided to the expression + * @initialContext: initialContext provided to the expression + * @returns handler object + */ + return (name, expression, context = {}, initialContext = {}) => { + log.debug(`executing expression ${expression}`); + const steps = expression.split('|'); // todo: we should actually use interpreter parser and get the ast + let responsePromise; + + const handler = { + /** + * checks if provided object matches expression result + * @param result: expected expression result + * @returns {Promise} + */ + toReturn: async result => { + const pipelineResponse = await handler.getResponse(); + expect(pipelineResponse).to.eql(result); + }, + /** + * returns expression response + * @returns {*} + */ + getResponse: () => { + if (!responsePromise) responsePromise = handler.runExpression(); + return responsePromise; + }, + /** + * runs the expression and returns the result + * @param step: expression to execute + * @param stepContext: context to provide to expression + * @returns {Promise<*>} result of running expression + */ + runExpression: async (step, stepContext) => { + log.debug(`running expression ${step || expression}`); + const promise = browser.executeAsync((expression, context, initialContext, done) => { + window.runPipeline(expression, context, initialContext).then(result => { + done(result); + }); + }, step || expression, stepContext || context, initialContext); + return await promise; + }, + steps: { + /** + * does a snapshot comparison between result of every function in the expression and the baseline + * @returns {Promise} + */ + toMatchSnapshot: async () => { + let lastResponse; + for (let i = 0; i < steps.length; i++) { + const step = steps[i]; + lastResponse = await handler.runExpression(step, lastResponse); + const diff = await snapshots.compareAgainstBaseline(name + i, lastResponse, updateBaselines); + expect(diff).to.be.lessThan(0.05); + } + if (!responsePromise) { + responsePromise = new Promise(resolve => { + resolve(lastResponse); + }); + } + return handler; + }, + }, + /** + * does a snapshot comparison between result of running the expression and baseline + * @returns {Promise} + */ + toMatchSnapshot: async () => { + const pipelineResponse = await handler.getResponse(); + await snapshots.compareAgainstBaseline(name, pipelineResponse, updateBaselines); + return handler; + }, + /** + * does a screenshot comparison between result of rendering expression and baseline + * @returns {Promise} + */ + toMatchScreenshot: async () => { + const pipelineResponse = await handler.getResponse(); + const result = await browser.executeAsync((context, done) => { + window.renderPipelineResponse(context).then(result => { + done(result); + }); + }, pipelineResponse); + log.debug('response of rendering: ', result); + + const chartEl = await testSubjects.find('pluginChart'); + const percentDifference = await screenshot.compareAgainstBaseline(name, updateBaselines, chartEl); + expect(percentDifference).to.be.lessThan(0.1); + return handler; + } + }; + + return handler; + }; +}; diff --git a/test/interpreter_functional/test_suites/run_pipeline/index.js b/test/interpreter_functional/test_suites/run_pipeline/index.js new file mode 100644 index 0000000000000..ecedc7bd4678b --- /dev/null +++ b/test/interpreter_functional/test_suites/run_pipeline/index.js @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function ({ getService, getPageObjects, loadTestFile }) { + const browser = getService('browser'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const appsMenu = getService('appsMenu'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'header']); + + describe('runPipeline', function () { + before(async () => { + await esArchiver.loadIfNeeded('../functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.load('../functional/fixtures/es_archiver/visualize_embedding'); + await kibanaServer.uiSettings.replace({ 'dateFormat:tz': 'Australia/North', 'defaultIndex': 'logstash-*' }); + await browser.setWindowSize(1300, 900); + await PageObjects.common.navigateToApp('settings'); + await appsMenu.clickLink('Run Pipeline'); + await testSubjects.find('pluginContent'); + }); + + loadTestFile(require.resolve('./basic')); + }); +} diff --git a/test/scripts/jenkins_ci_group.sh b/test/scripts/jenkins_ci_group.sh index 0ed0a8e5d014a..c9eec36cdc743 100755 --- a/test/scripts/jenkins_ci_group.sh +++ b/test/scripts/jenkins_ci_group.sh @@ -23,4 +23,5 @@ export TEST_BROWSER_HEADLESS=1 if [ "$CI_GROUP" == "1" ]; then "$(FORCE_COLOR=0 yarn bin)/grunt" run:pluginFunctionalTestsRelease; + "$(FORCE_COLOR=0 yarn bin)/grunt" run:interpreterFunctionalTestsRelease; fi diff --git a/yarn.lock b/yarn.lock index 47cc33169f1be..160dd083b7226 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16773,6 +16773,11 @@ pngjs@3.3.1, pngjs@^3.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.1.tgz#8e14e6679ee7424b544334c3b2d21cea6d8c209a" integrity sha512-ggXCTsqHRIsGMkHlCEhbHhUmNTA2r1lpkE0NL4Q9S8spkXbm4vE9TVmPso2AGYn90Gltdz8W5CyzhcIGg2Gejg== +pngjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + podium@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/podium/-/podium-3.1.2.tgz#b701429739cf6bdde6b3015ae6b48d400817ce9e"