diff --git a/README.md b/README.md index 0a911da84..a847da60d 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,18 @@ directory. ] } ``` +* **customScripts** (optional) `function[]` - allows to add any scripts on the report html-page. Script will be executed immediately on page render. It can be helpful for adding some metrics or own extra functionality. + +```js +customScripts: [ + function() {console.log('something')}, + () => { + const div = document.createElement('div'); + div.innerHTML = 'hello'; + document.body.prepend(div); + } +] +``` Also there is ability to override plugin parameters by CLI options or environment variables (see [configparser](https://github.com/gemini-testing/configparser)). diff --git a/lib/config/index.js b/lib/config/index.js index 2f214057c..228f74265 100644 --- a/lib/config/index.js +++ b/lib/config/index.js @@ -66,6 +66,19 @@ const assertMetaInfoBaseUrls = (metaInfoBaseUrls) => { } }; +const assertArrayOfFunctions = (name) => { + return (value) => { + if (!_.isArray(value)) { + throw new Error(`"${name}" option must be an array, but got ${typeof value}`); + } + for (const item of value) { + if (!_.isFunction(item)) { + throw new Error(`"${name}" option must be an array of functions but got ${typeof item} for one of items`); + } + } + }; +}; + const mapErrorPatterns = (errorPatterns) => { return errorPatterns.map(patternInfo => { return _.isString(patternInfo) @@ -130,6 +143,10 @@ const getParser = () => { customGui: option({ defaultValue: configDefaults.customGui, validate: assertCustomGui + }), + customScripts: option({ + defaultValue: configDefaults.customScripts, + validate: assertArrayOfFunctions('customScripts') }) }), {envPrefix: ENV_PREFIX, cliPrefix: CLI_PREFIX}); }; diff --git a/lib/constants/defaults.js b/lib/constants/defaults.js index f7c987bda..e5bffac2e 100644 --- a/lib/constants/defaults.js +++ b/lib/constants/defaults.js @@ -10,6 +10,7 @@ module.exports = { lazyLoadOffset: 800, errorPatterns: [], metaInfoBaseUrls: {}, - customGui: {} + customGui: {}, + customScripts: [] } }; diff --git a/lib/report-builder/report-builder.js b/lib/report-builder/report-builder.js index cdafb28d6..31cc96148 100644 --- a/lib/report-builder/report-builder.js +++ b/lib/report-builder/report-builder.js @@ -230,7 +230,8 @@ module.exports = class ReportBuilder { getResult() { const { - defaultView, baseHost, scaleImages, lazyLoadOffset, errorPatterns, metaInfoBaseUrls, customGui + defaultView, baseHost, scaleImages, lazyLoadOffset, + errorPatterns, metaInfoBaseUrls, customGui, customScripts } = this._pluginConfig; this._sortTree(); @@ -238,7 +239,8 @@ module.exports = class ReportBuilder { skips: _.uniq(this._skips, JSON.stringify), suites: this._tree.children, config: { - defaultView, baseHost, scaleImages, lazyLoadOffset, errorPatterns, metaInfoBaseUrls, customGui + defaultView, baseHost, scaleImages, lazyLoadOffset, + errorPatterns, metaInfoBaseUrls, customGui, customScripts }, apiValues: this._apiValues, date: new Date().toString(), diff --git a/lib/static/components/custom-scripts.js b/lib/static/components/custom-scripts.js new file mode 100644 index 000000000..3d933fd28 --- /dev/null +++ b/lib/static/components/custom-scripts.js @@ -0,0 +1,25 @@ +'use strict'; + +import React, {useEffect, useRef} from 'react'; +import {isEmpty} from 'lodash'; + +export default function CustomScripts(props) { + const {scripts} = props; + + if (isEmpty(scripts)) { + return null; + } + + const ref = useRef(null); + + useEffect(() => { + scripts.forEach((script) => { + const s = document.createElement('script'); + s.type = 'text/javascript'; + s.innerHTML = `(${script})();`; + ref.current.appendChild(s); + }); + }, [scripts]); + + return
; +} diff --git a/lib/static/components/gui.js b/lib/static/components/gui.js index 6159b514d..0cd77e516 100644 --- a/lib/static/components/gui.js +++ b/lib/static/components/gui.js @@ -11,6 +11,7 @@ import SkippedList from './skipped-list'; import Loading from './loading'; import ModalContainer from '../containers/modal'; import MainTree from './main-tree'; +import CustomScripts from './custom-scripts'; class Gui extends Component { componentDidMount() { @@ -18,10 +19,11 @@ class Gui extends Component { } render() { - const {loading} = this.props; + const {loading, customScripts} = this.props; return (