diff --git a/lib/static/components/bullet.jsx b/lib/static/components/bullet.jsx
index 196fe4777..1bb132911 100644
--- a/lib/static/components/bullet.jsx
+++ b/lib/static/components/bullet.jsx
@@ -1,24 +1,31 @@
import React from 'react';
import classNames from 'classnames';
-import {Checkbox} from 'semantic-ui-react';
import PropTypes from 'prop-types';
import {isCheckboxChecked, isCheckboxIndeterminate} from '../../common-utils';
import {CHECKED, INDETERMINATE, UNCHECKED} from '../../constants/checked-statuses';
import useLocalStorage from '../hooks/useLocalStorage';
+import {Checkbox} from '@gravity-ui/uikit';
+import {ChevronUp} from '@gravity-ui/icons';
const Bullet = ({status, onClick, className}) => {
const [isCheckbox] = useLocalStorage('showCheckboxes', false);
+ const handleClick = React.useCallback((e) => {
+ e.stopPropagation();
+ onClick(e);
+ });
+
if (!isCheckbox) {
- return ;
+ return ;
}
- return ;
+ return
+
+
};
Bullet.propTypes = {
diff --git a/lib/static/components/controls/menu-bar.jsx b/lib/static/components/controls/menu-bar.jsx
index fe634f2c3..1a95e3d2e 100644
--- a/lib/static/components/controls/menu-bar.jsx
+++ b/lib/static/components/controls/menu-bar.jsx
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
import {Dropdown} from 'semantic-ui-react';
import {isEmpty} from 'lodash';
import ExtensionPoint from '../extension-point';
-import plugins from '../../modules/plugins';
+import * as plugins from '../../modules/plugins';
import {MENU_BAR} from '../../../constants/extension-points';
import { Button, DropdownMenu, Icon, Menu } from '@gravity-ui/uikit';
import {Bars} from '@gravity-ui/icons';
diff --git a/lib/static/components/details.jsx b/lib/static/components/details.jsx
index f909025bf..25046093a 100644
--- a/lib/static/components/details.jsx
+++ b/lib/static/components/details.jsx
@@ -8,6 +8,7 @@ import { Card, Disclosure } from '@gravity-ui/uikit';
export default class Details extends Component {
static propTypes = {
+ type: PropTypes.oneOf(['text', 'image']),
title: PropTypes.oneOfType([PropTypes.element, PropTypes.string]).isRequired,
content: PropTypes.oneOfType([PropTypes.func, PropTypes.string, PropTypes.element, PropTypes.array]).isRequired,
extendClassNames: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
@@ -29,6 +30,10 @@ export default class Details extends Component {
});
};
+ stopPropagation = (e) => {
+ e.stopPropagation();
+ }
+
_getContent() {
const content = this.props.content;
@@ -49,7 +54,7 @@ export default class Details extends Component {
}
render() {
- const {title, content, extendClassNames} = this.props;
+ const {type, title, content, extendClassNames} = this.props;
const className = classNames(
'details',
extendClassNames
@@ -65,12 +70,18 @@ export default class Details extends Component {
size='l'>
{(props, defaultButton) => (
-
+
+
+ {defaultButton}
+
+ {title}
+
)}
-
+ {type == 'image' ? this._renderContent() :
+
{this._renderContent()}
-
+ }
)
);
diff --git a/lib/static/components/extension-point.jsx b/lib/static/components/extension-point.jsx
index 76323740e..8baf7ed7a 100644
--- a/lib/static/components/extension-point.jsx
+++ b/lib/static/components/extension-point.jsx
@@ -1,7 +1,7 @@
import React, {Component, Fragment} from 'react';
import PropTypes from 'prop-types';
import ErrorBoundary from './error-boundary';
-import plugins from '../modules/plugins';
+import * as plugins from '../modules/plugins';
export default class ExtensionPoint extends Component {
static propTypes = {
diff --git a/lib/static/components/icons/view-in-browser/index.jsx b/lib/static/components/icons/view-in-browser/index.jsx
index bd6193d27..cd656b61d 100644
--- a/lib/static/components/icons/view-in-browser/index.jsx
+++ b/lib/static/components/icons/view-in-browser/index.jsx
@@ -3,6 +3,7 @@ import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import PropTypes from 'prop-types';
import classNames from 'classnames';
+import {Eye, EyeSlash} from '@gravity-ui/icons';
import * as actions from '../../../modules/actions';
import {getUrlWithBase} from '../../../../common-utils';
@@ -27,13 +28,13 @@ class ViewInBrowser extends Component {
render() {
const {suiteUrl, baseHost, extendClassNames} = this.props;
const className = classNames(
- 'fa view-in-browser',
- suiteUrl ? 'fa-eye view-in-browser_active' : 'fa-eye-slash view-in-browser_disabled',
+ 'view-in-browser',
+ suiteUrl ? 'view-in-browser_active' : 'view-in-browser_disabled',
extendClassNames
);
if (!suiteUrl) {
- return ;
+ return ;
}
return (
@@ -44,7 +45,7 @@ class ViewInBrowser extends Component {
title="view in browser"
target="_blank"
data-test-id='view-in-browser'
- />
+ >
);
}
}
diff --git a/lib/static/components/icons/view-in-browser/index.styl b/lib/static/components/icons/view-in-browser/index.styl
index b044f86ef..7e6aa5206 100644
--- a/lib/static/components/icons/view-in-browser/index.styl
+++ b/lib/static/components/icons/view-in-browser/index.styl
@@ -1,11 +1,6 @@
.view-in-browser {
- display: inline-block;
- width: 16px;
- height: 19px;
+ height: 16px;
margin-left: 4px;
- margin-right: 0;
- padding: 0 2px;
- border: none;
color: black;
opacity: 0.3;
diff --git a/lib/static/components/modals/modal.jsx b/lib/static/components/modals/modal.jsx
index abc9cad48..f3dfa03bb 100644
--- a/lib/static/components/modals/modal.jsx
+++ b/lib/static/components/modals/modal.jsx
@@ -1,27 +1,25 @@
import React, {Component} from 'react';
-import ReactDOM from 'react-dom';
+import { Portal } from '@gravity-ui/uikit';
import './modal.css';
export default class Modal extends Component {
componentWillMount() {
- this._root = document.createElement('div');
document.body.classList.add('modal-open');
- document.body.appendChild(this._root);
}
componentWillUnmount() {
document.body.classList.remove('modal-open');
- document.body.removeChild(this._root);
}
render() {
- const {className} = this.props;
+ const {className, children} = this.props;
- return ReactDOM.createPortal(
-
- {this.props.children}
-
,
- this._root
- );
+ return (
+
+
+ {children}
+
+
+ )
}
}
diff --git a/lib/static/components/retry-switcher/item.jsx b/lib/static/components/retry-switcher/item.jsx
index 802b88c54..c1db79995 100644
--- a/lib/static/components/retry-switcher/item.jsx
+++ b/lib/static/components/retry-switcher/item.jsx
@@ -8,6 +8,7 @@ import {
hasUnrelatedToScreenshotsErrors,
isFailStatus
} from '../../../common-utils';
+import { Button } from '@gravity-ui/uikit';
class RetrySwitcherItem extends Component {
static propTypes = {
@@ -24,16 +25,23 @@ class RetrySwitcherItem extends Component {
render() {
const {status, attempt, isActive, onClick, title, keyToGroupTestsBy, matchedSelectedGroup} = this.props;
+ const statusToView = {
+ success: 'flat-success',
+ updated: 'flat-success',
+ error: 'flat-danger',
+ fail: 'flat-utility',
+ fail_error: 'flat-utility',
+ skipped: 'normal',
+ }
const className = classNames(
- 'state-button',
'tab-switcher__button',
- {[`tab-switcher__button_status_${status}`]: status},
{'tab-switcher__button_active': isActive},
+ {[`tab-switcher__button_status_${status}`]: status},
{'tab-switcher__button_non-matched': keyToGroupTestsBy && !matchedSelectedGroup}
);
- return ;
+ return
}
}
diff --git a/lib/static/components/section/body/description.jsx b/lib/static/components/section/body/description.jsx
index 09073c170..3eff6e1b7 100644
--- a/lib/static/components/section/body/description.jsx
+++ b/lib/static/components/section/body/description.jsx
@@ -16,9 +16,9 @@ export default class Description extends Component {
render() {
return ;
}
}
diff --git a/lib/static/components/section/body/history/index.jsx b/lib/static/components/section/body/history/index.jsx
index b630ffa03..de68b6967 100644
--- a/lib/static/components/section/body/history/index.jsx
+++ b/lib/static/components/section/body/history/index.jsx
@@ -5,16 +5,33 @@ import {isEmpty} from 'lodash';
import Details from '../../../details';
import './index.styl';
+import { List } from '@gravity-ui/uikit';
-const History = ({history}) => (
+const History = ({history}) => {
+ const renderHistoryItem = (item) => {
+ const [name, time] = item.split(" <- ");
+ return (
+
+ {name}
+ {time}
+
+ )
+ }
+ return (
isEmpty(history)
? null
:
+
+
+ }
+ extendClassNames='history'
/>
-);
+ )
+};
History.propTypes = {
resultId: PropTypes.string.isRequired,
@@ -24,6 +41,5 @@ History.propTypes = {
export default connect(({tree}, {resultId}) => {
const {history = []} = tree.results.byId[resultId];
- console.log(history);
return {history};
})(History);
diff --git a/lib/static/components/section/body/history/index.styl b/lib/static/components/section/body/history/index.styl
index 0d6c789d0..a74cc93fb 100644
--- a/lib/static/components/section/body/history/index.styl
+++ b/lib/static/components/section/body/history/index.styl
@@ -1,4 +1,17 @@
.history {
white-space: pre-wrap;
word-wrap: break-word;
+
+ .history-item {
+ display: inline-flex;
+ padding-right: 8px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+
+ gap: 4px;
+
+ .history-item__time {
+ opacity: 0.5;
+ }
+ }
}
diff --git a/lib/static/components/section/body/meta-info/content.jsx b/lib/static/components/section/body/meta-info/content.jsx
index 4ccff41c5..78c74138b 100644
--- a/lib/static/components/section/body/meta-info/content.jsx
+++ b/lib/static/components/section/body/meta-info/content.jsx
@@ -35,46 +35,31 @@ const resolveUrl = (baseUrl, value) => {
};
const metaToElements = (metaInfo, metaInfoBaseUrls) => {
- return {
+ let url = value.url;
+ value = value.content;
if (isUrl(value)) {
- value = mkTextWithClipboardButton(value, value);
+ url = value;
} else if (metaInfoBaseUrls[key]) {
const baseUrl = metaInfoBaseUrls[key];
const link = isUrl(baseUrl) ? resolveUrl(baseUrl, value) : path.join(baseUrl, value);
- value = mkTextWithClipboardButton(value, link);
+ url = link;
} else if (typeof value === 'boolean') {
value = value.toString();
}
- else if (typeof value === 'string') {
- value = mkTextWithClipboardButton(value);
+ if (url) {
+ value =
+ {value}
+
}
return {
name: key,
content: {value}
,
- copyText: key
+ copyText: url || value
}
})
}/>
- return map(metaInfo, (value, key) => {
- if (isUrl(value)) {
- value = mkTextWithClipboardButton(value, value);
- } else if (metaInfoBaseUrls[key]) {
- const baseUrl = metaInfoBaseUrls[key];
- const link = isUrl(baseUrl) ? resolveUrl(baseUrl, value) : path.join(baseUrl, value);
- value = mkTextWithClipboardButton(value, link);
- } else if (typeof value === 'boolean') {
- value = value.toString();
- }
- else if (typeof value === 'string') {
- value = mkTextWithClipboardButton(value);
- }
-
- return ;
- });
};
class MetaInfoContent extends Component {
@@ -113,8 +98,11 @@ class MetaInfoContent extends Component {
...serializedMetaValues,
...extraMetaInfo
};
+ Object.keys(formattedMetaInfo).forEach((key) => {
+ formattedMetaInfo[key] = {content: formattedMetaInfo[key]}
+ })
if (result.suiteUrl) {
- formattedMetaInfo.url = mkTextWithClipboardButton(result.metaInfo.url, getUrlWithBase(result.suiteUrl, baseHost));
+ formattedMetaInfo.url = {content: result.metaInfo.url || result.suiteUrl, url: getUrlWithBase(result.suiteUrl, baseHost)}
}
return metaToElements(formattedMetaInfo, metaInfoBaseUrls);
diff --git a/lib/static/components/section/body/meta-info/index.jsx b/lib/static/components/section/body/meta-info/index.jsx
index 17851473d..4eb283020 100644
--- a/lib/static/components/section/body/meta-info/index.jsx
+++ b/lib/static/components/section/body/meta-info/index.jsx
@@ -19,9 +19,9 @@ class MetaInfo extends Component {
const {resultId} = this.props;
return }
- extendClassNames='details_type_text'
onClick={this.onToggleMetaInfo}
/>;
}
diff --git a/lib/static/components/section/body/page-screenshot.tsx b/lib/static/components/section/body/page-screenshot.tsx
index fafc15537..393e4db0a 100644
--- a/lib/static/components/section/body/page-screenshot.tsx
+++ b/lib/static/components/section/body/page-screenshot.tsx
@@ -10,9 +10,9 @@ interface PageScreenshotProps {
export class PageScreenshot extends Component {
render(): JSX.Element {
return }
- extendClassNames="details_type_image"
/>;
}
}
diff --git a/lib/static/components/section/title/browser.jsx b/lib/static/components/section/title/browser.jsx
index c61917a90..9b11cd681 100644
--- a/lib/static/components/section/title/browser.jsx
+++ b/lib/static/components/section/title/browser.jsx
@@ -1,5 +1,4 @@
import React from 'react';
-import ClipboardButton from 'react-clipboard.js';
import PropTypes from 'prop-types';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
@@ -11,9 +10,10 @@ import {EXPAND_ALL} from '../../../../constants/expand-modes';
import {getToggledCheckboxState} from '../../../../common-utils';
import ViewInBrowserIcon from '../../icons/view-in-browser';
import Bullet from '../../bullet';
+import { ClipboardButton } from '@gravity-ui/uikit';
const BrowserTitle = (props) => {
- const getTestUrl = () => {
+ const testUrl = React.useMemo(() => {
return appendQuery(window.location.href, {
browser: escapeRegExp(props.browserName),
testNameFilter: escapeRegExp(props.testName),
@@ -22,7 +22,7 @@ const BrowserTitle = (props) => {
viewModes: ViewMode.ALL,
expand: EXPAND_ALL
});
- };
+ }, [window.location.href, props.browserName, props.testName, props.retryIndex]);
const onCopyTestLink = (e) => {
e.stopPropagation();
@@ -45,10 +45,9 @@ const BrowserTitle = (props) => {
{props.title}
+ title="copy test link"
+ text={testUrl}>
);
diff --git a/lib/static/components/section/title/simple.jsx b/lib/static/components/section/title/simple.jsx
index b3e1e2e40..dd56a0651 100644
--- a/lib/static/components/section/title/simple.jsx
+++ b/lib/static/components/section/title/simple.jsx
@@ -4,11 +4,12 @@ import React from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import PropTypes from 'prop-types';
-import ClipboardButton from 'react-clipboard.js';
import * as actions from '../../../modules/actions';
import {mkGetTestsBySuiteId} from '../../../modules/selectors/tree';
import {getToggledCheckboxState} from '../../../../common-utils';
import Bullet from '../../bullet';
+import { Button, ClipboardButton } from '@gravity-ui/uikit';
+import {ArrowRotateLeft} from '@gravity-ui/icons';
const SectionTitle = ({name, suiteId, handler, gui, checkStatus, suiteTests, actions}) => {
const onCopySuiteName = (e) => {
@@ -35,18 +36,20 @@ const SectionTitle = ({name, suiteId, handler, gui, checkStatus, suiteTests, act
const drawCopyButton = () => (
+ title="copy to clipboard"
+ text={suiteId}>
);
const drawRetryButton = () => (
-
+
+
+
+
);
return (
diff --git a/lib/static/components/state/error-details.jsx b/lib/static/components/state/error-details.jsx
index e12b18425..49e85abbd 100644
--- a/lib/static/components/state/error-details.jsx
+++ b/lib/static/components/state/error-details.jsx
@@ -13,6 +13,6 @@ export default class ErrorDetails extends Component {
const {title, filePath} = this.props.errorDetails;
const content = ;
- return ;
+ return ;
}
}
diff --git a/lib/static/components/state/index.jsx b/lib/static/components/state/index.jsx
index ce7dcaba1..b03767c05 100644
--- a/lib/static/components/state/index.jsx
+++ b/lib/static/components/state/index.jsx
@@ -15,6 +15,7 @@ import ArrowsOpen from '../icons/arrows-open';
import {types as modalTypes} from '../modals';
import {isAcceptable, isNodeSuccessful, isScreenRevertable} from '../../modules/utils';
import {isSuccessStatus, isFailStatus, isErrorStatus, isUpdatedStatus, isIdleStatus} from '../../../common-utils';
+import { Disclosure } from '@gravity-ui/uikit';
class State extends Component {
static propTypes = {
@@ -146,7 +147,6 @@ class State extends Component {
const className = classNames(
'state-title',
- {'state-title_collapsed': !shouldImageBeOpened},
`state-title_${image.status}`
);
@@ -158,19 +158,10 @@ class State extends Component {
displayedText += ` (diff: ${image.differentPixels}px, ${displayedDiffPercent}%)`;
}
- return {displayedText}
;
+ return {displayedText}
;
}
render() {
- if (!this.props.shouldImageBeOpened) {
- return (
-
-
- {this._getStateTitleWithDiffCount()}
-
- );
- }
-
const {node, result, image} = this.props;
const {status, error} = node;
let elem = null;
@@ -188,12 +179,13 @@ class State extends Component {
return (
- {this._getStateTitleWithDiffCount()}
- {this._drawFailImageControls()}
- {this._drawUpdatedImageControls()}
- {elem ? {elem}
: null}
+
+ {this._drawFailImageControls()}
+ {this._drawUpdatedImageControls()}
+ {elem ? {elem}
: null}
+
- );
+ )
}
}
diff --git a/lib/static/components/state/state-fail/index.jsx b/lib/static/components/state/state-fail/index.jsx
index d87331323..83f851f66 100644
--- a/lib/static/components/state/state-fail/index.jsx
+++ b/lib/static/components/state/state-fail/index.jsx
@@ -13,6 +13,7 @@ import {types} from '../../modals';
import useFitImages from './useFitImages';
import './index.styl';
+import { Tabs } from '@gravity-ui/uikit';
const StateFail = ({image, diffMode: diffModeProp, isScreenshotAccepterOpened}) => {
const [diffMode, setDiffMode] = useState(diffModeProp);
@@ -22,32 +23,12 @@ const StateFail = ({image, diffMode: diffModeProp, isScreenshotAccepterOpened})
setDiffMode(diffModeProp);
}, [diffModeProp, setDiffMode]);
- const renderDiffModeItem = (mode) => {
- const className = classNames(
- 'diff-modes__item',
- {'diff-modes__active': diffMode === mode.id}
- );
-
- return (
- setDiffMode(mode.id)}
- >
- {mode.title}
-
- );
- };
-
const renderDiffModeItems = () => {
- const diffModeItems = Object.values(DiffModes).map(renderDiffModeItem);
-
return (
-
- );
+
+ setDiffMode(mode)} size='m'/>
+
+ )
};
const getLabelKey = () => {
diff --git a/lib/static/components/state/state-fail/index.styl b/lib/static/components/state/state-fail/index.styl
index d8c23530c..ade5aa816 100644
--- a/lib/static/components/state/state-fail/index.styl
+++ b/lib/static/components/state/state-fail/index.styl
@@ -1,21 +1,7 @@
.diff-modes
display: flex
justify-content: center
- border-bottom: 1px solid #ccc
- padding: 5px 0
margin: 10px auto
- width: 520px
-
- &__item
- display: inline-block
- padding: 0 5px
- cursor: pointer
-
- &__item:not(:last-child)
- border-right: 1px solid #ccc
-
- &__active
- font-weight: bold
.image-box__scaled
display: flex
diff --git a/lib/static/gui.css b/lib/static/gui.css
index e93546965..916548983 100644
--- a/lib/static/gui.css
+++ b/lib/static/gui.css
@@ -3,28 +3,6 @@
to {opacity: 0.3;}
}
-.state-title:before,
-.bullet_type-simple:before {
- display: inline-block;
- content: '\25cf';
- color: #ccc;
- background-image: none;
-}
-
-.state-title:before {
- margin-right: 6px;
- vertical-align: middle;
- width: auto;
- height: auto;
-}
-
-.bullet_type-simple:before {
- text-align: end;
- line-height: 18px;
- width: 18px;
- height: 100%;
-}
-
.custom-icon_retry:before {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath transform='scale(0.027,-0.027) translate(0,-448)' d=' M500.333 448H452.922C446.069 448 440.608 442.271 440.9360000000001 435.426L444.9020000000001 352.6670000000001C399.416 406.101 331.6720000000001 440 256.001 440C119.34 440 7.899 328.474 8 191.813C8.101 54.932 119.096 -56 256 -56C319.926 -56 378.202 -31.813 422.178 7.908C427.291 12.526 427.532 20.469 422.6600000000001 25.341L388.689 59.312C384.223 63.778 377.0490000000001 64.029 372.3090000000001 59.855C341.308 32.552 300.606 16 256 16C158.733 16 80 94.716 80 192C80 289.267 158.716 368 256 368C316.892 368 370.506 337.142 402.099 290.2L300.574 295.065C293.729 295.3930000000001 288 289.932 288 283.079V235.668C288 229.041 293.373 223.668 300 223.668H500.333C506.96 223.668 512.333 229.041 512.333 235.668V436C512.333 442.627 506.96 448 500.333 448z'/%3E%3C/svg%3E");
}
diff --git a/lib/static/modules/actions.js b/lib/static/modules/actions.js
index 56cb82fee..4cc297cb1 100644
--- a/lib/static/modules/actions.js
+++ b/lib/static/modules/actions.js
@@ -9,7 +9,7 @@ import {DiffModes} from '../../constants/diff-modes';
import {getHttpErrorMessage} from './utils';
import {fetchDataFromDatabases, mergeDatabases, connectToDatabase, getMainDatabaseUrl, getSuitesTableRows} from '../../db-utils/client';
import {setFilteredBrowsers} from './query-params';
-import plugins from './plugins';
+import * as plugins from './plugins';
import performanceMarks from '../../constants/performance-marks';
import {ToolName} from '../../constants';
diff --git a/lib/static/modules/plugins.js b/lib/static/modules/plugins.js
index c93a61b12..70b30e08f 100644
--- a/lib/static/modules/plugins.js
+++ b/lib/static/modules/plugins.js
@@ -56,5 +56,3 @@ export function get(name, field) {
export function getLoadedConfigs() {
return loadedPluginConfigs;
}
-
-export default {preloadAll, loadAll, getLoadedConfigs, forEach, get};
diff --git a/lib/static/modules/reducers/plugins.js b/lib/static/modules/reducers/plugins.js
index 6f59718c6..61effa9de 100644
--- a/lib/static/modules/reducers/plugins.js
+++ b/lib/static/modules/reducers/plugins.js
@@ -1,5 +1,5 @@
import reduceReducers from 'reduce-reducers';
-import plugins from '../plugins';
+import * as plugins from '../plugins';
import actionNames from '../action-names';
const defaultPluginsReducers = state => state;
diff --git a/lib/static/modules/web-vitals.js b/lib/static/modules/web-vitals.js
index dca4e7eee..acf27f7af 100644
--- a/lib/static/modules/web-vitals.js
+++ b/lib/static/modules/web-vitals.js
@@ -10,4 +10,3 @@ export const measurePerformance = onPerfEntry => {
}
};
-export default {measurePerformance};
diff --git a/lib/static/modules/yandex-metrika.js b/lib/static/modules/yandex-metrika.js
index ecd879b6a..3c9f645b3 100644
--- a/lib/static/modules/yandex-metrika.js
+++ b/lib/static/modules/yandex-metrika.js
@@ -9,7 +9,7 @@ const targets = {
ACCEPT_OPENED_SCREENSHOTS: 'ACCEPT_OPENED_SCREENSHOTS'
};
-export default class YandexMetrika {
+class YandexMetrika {
static create(config) {
return new this(config);
}
@@ -48,3 +48,5 @@ export default class YandexMetrika {
this._registerGoal(targets.ACCEPT_OPENED_SCREENSHOTS, params);
}
}
+
+export default YandexMetrika;
diff --git a/lib/static/styles.css b/lib/static/styles.css
index 1d23e724f..4ed139fca 100644
--- a/lib/static/styles.css
+++ b/lib/static/styles.css
@@ -193,7 +193,7 @@ main.container {
.image-box__image {
display: inline-block;
vertical-align: top;
- flex-basis: 33.333%;
+ flex-basis: calc(100% / 3);
flex-grow: 1;
box-sizing: border-box;
max-width: 100%;
@@ -288,6 +288,9 @@ main.container {
cursor: pointer;
color: var(--text-color);
margin-bottom: 5px;
+ display: flex;
+ align-items: center;
+ gap: 2px;
user-select: none;
}
@@ -342,14 +345,12 @@ main.container {
}
.section__body .section__title.section__title_type_browser {
+ display: flex;
+ align-items: center;
font-weight: normal;
}
-.section__title .bullet_type-simple:before,
.tests-group__title .bullet_type-simple.tests-group__bullet:before,
-.state-title:after,
-.details__summary:after,
-.error .details__summary:before,
.sticky-header__wrap:before {
content: '';
width: 18px;
@@ -383,33 +384,6 @@ main.container {
flex-shrink: 0;
}
-.state-title:after {
- margin-right: 0;
- margin-left: 5px;
-}
-
-.details__summary:after {
- margin-right: 0;
- margin-left: 5px;
- transform: rotate(180deg);
-}
-
-.details__summary:before {
- margin-right: 0;
- margin-left: 0;
- transform: rotate(180deg);
-}
-
-details[open] > .details__summary:after,
-details[open] > .details__summary:before {
- transform: rotate(0deg);
-}
-
-.error .details__summary:after {
- content: none;
-}
-
-.section_collapsed .section__title .bullet_type-simple:before,
.tests-group_collapsed .tests-group__title .tests-group__bullet:before,
.state-title_collapsed.state-title:after {
transform: rotate(180deg);
@@ -485,16 +459,11 @@ details[open] > .details__summary:before {
}
.custom-icon {
- display: inline-block;
- width: 16px;
- height: 19px;
+ width: 18px;
+ height: 18px;
vertical-align: top;
- margin-right: 0;
- padding: 0 2px;
- border: none;
opacity: 0.3;
cursor: pointer;
- background: transparent;
}
.section_root > .section__title > .custom-icon {
@@ -587,6 +556,15 @@ details[open] > .details__summary:before {
user-select: none;
}
+.tab-switcher__button {
+ --g-button-padding: 8px;
+ margin-right: 2px;
+}
+
+.tab-switcher__button_non-matched {
+ opacity: 0.5;
+}
+
.tab-switcher__button_status_success,
.tab-switcher__button_status_updated {
background-color: rgba(123, 204, 123, 1);
@@ -610,8 +588,9 @@ details[open] > .details__summary:before {
}
.tab-switcher__button_status_fail {
- background-color: rgba(255, 197, 224, 1);
- border-color: rgba(255, 197, 224, 1);
+ --g-button-background-color: #fce0ff;
+ --g-button-text-color: #bd1993;
+ --g-button-border-color: #bd1993;
}
.tab-switcher__button_status_fail.tab-switcher__button_non-matched {
@@ -620,11 +599,9 @@ details[open] > .details__summary:before {
}
.tab-switcher__button_status_fail_error {
- background: linear-gradient(135deg, rgba(255, 197, 224, 1) 50%, rgba(255, 154, 154, 1) 50%);
- border-left-color: rgba(255, 197, 224, 1);
- border-top-color: rgba(255, 197, 224, 1);
- border-right-color: rgba(255, 154, 154, 1);
- border-bottom-color: rgba(255, 154, 154, 1);
+ --g-button-background-color: #fce0ff;
+ --g-button-text-color: #bd1993;
+ --g-button-border-color: #bd1993;
}
.tab-switcher__button_status_fail_error.tab-switcher__button_non-matched {
@@ -654,6 +631,7 @@ details[open] > .details__summary:before {
}
.tab-switcher__button.tab-switcher__button_active {
+ --g-button-border-width: 1px;
border-color: #000;
}
@@ -721,6 +699,10 @@ a:active {
word-break: break-word;
}
+.details__summary {
+ cursor: pointer;
+}
+
.details__expand-button {
display: inline-block;
vertical-align: text-bottom;
@@ -735,20 +717,6 @@ a:active {
margin-top: 5px;
}
-.details__summary {
- display: block;
- outline: none;
-}
-
-.details__summary:hover {
- cursor: pointer;
- color: #a3a3a3;
-}
-
-.details__summary::-webkit-details-marker {
- display: none;
-}
-
/* .details_type_text {
margin-bottom: 10px;
} */
diff --git a/test/func/docker/browser-utils/download-chromium.js b/test/func/docker/browser-utils/download-chromium.js
deleted file mode 100644
index 34cb39a36..000000000
--- a/test/func/docker/browser-utils/download-chromium.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const fs = require('fs');
-const os = require('os');
-const path = require('path');
-const {pipeline} = require('stream');
-const {promisify} = require('util');
-const AdmZip = require('adm-zip');
-const got = require('got');
-
-const streamPipeline = promisify(pipeline);
-
-const download = async (url) => {
- // Create a temporary directory to store the downloaded file
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'chrome-download-'));
-
- // Path for the downloaded zip file
- const zipFilePath = path.join(tempDir, 'chrome-linux64.zip');
-
- await streamPipeline(
- got.stream(url),
- fs.createWriteStream(zipFilePath)
- );
-
- return zipFilePath;
-};
-
-const extract = async (zipFilePath) => {
- const zip = new AdmZip(zipFilePath);
-
- const outPath = path.dirname(zipFilePath);
-
- zip.extractAllTo(outPath);
-
- return path.join(outPath, 'chrome-linux64');
-};
-
-(async () => {
- // Available good versions of Chrome for testing: https://googlechromelabs.github.io/chrome-for-testing/known-good-versions.json
- const CHROME_URL = 'https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.49/linux64/chrome-linux64.zip';
-
- const chromeZipPath = await download(CHROME_URL);
- const chromePath = await extract(chromeZipPath);
-
- console.log(chromePath);
-})();
diff --git a/test/func/docker/browser-utils/install-chromium.sh b/test/func/docker/browser-utils/install-chromium.sh
deleted file mode 100755
index 03bbabaed..000000000
--- a/test/func/docker/browser-utils/install-chromium.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-CHROME_PATH=$(node ./download-chromium.js)
-mkdir ~/browsers
-mv $CHROME_PATH ~/browsers/chrome-linux
-chmod +x ~/browsers/chrome-linux/chrome
diff --git a/test/func/docker/browser-utils/package-lock.json b/test/func/docker/browser-utils/package-lock.json
deleted file mode 100644
index 94cc6e375..000000000
--- a/test/func/docker/browser-utils/package-lock.json
+++ /dev/null
@@ -1,553 +0,0 @@
-{
- "name": "browser-utils",
- "version": "0.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "browser-utils",
- "version": "0.0.0",
- "dependencies": {
- "adm-zip": "^0.5.10",
- "got": "^11.8.6"
- }
- },
- "node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@types/cacheable-request": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
- "dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "^3.1.4",
- "@types/node": "*",
- "@types/responselike": "^1.0.0"
- }
- },
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="
- },
- "node_modules/@types/keyv": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "20.10.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
- "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@types/responselike": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/adm-zip": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
- "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "engines": {
- "node": ">=10.6.0"
- }
- },
- "node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/clone-response": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
- },
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
- },
- "node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- }
- },
- "dependencies": {
- "@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="
- },
- "@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "requires": {
- "defer-to-connect": "^2.0.0"
- }
- },
- "@types/cacheable-request": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
- "requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "^3.1.4",
- "@types/node": "*",
- "@types/responselike": "^1.0.0"
- }
- },
- "@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="
- },
- "@types/keyv": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "20.10.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
- "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==",
- "requires": {
- "undici-types": "~5.26.4"
- }
- },
- "@types/responselike": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
- "requires": {
- "@types/node": "*"
- }
- },
- "adm-zip": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
- "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ=="
- },
- "cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="
- },
- "cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- }
- },
- "clone-response": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "requires": {
- "mimic-response": "^3.1.0"
- },
- "dependencies": {
- "mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
- }
- }
- },
- "defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
- "requires": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- }
- },
- "http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
- },
- "http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- }
- },
- "json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "requires": {
- "json-buffer": "3.0.1"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- },
- "normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "requires": {
- "wrappy": "1"
- }
- },
- "p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
- },
- "resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
- },
- "responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
- "requires": {
- "lowercase-keys": "^2.0.0"
- }
- },
- "undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- }
- }
-}
diff --git a/test/func/docker/browser-utils/package.json b/test/func/docker/browser-utils/package.json
deleted file mode 100644
index ff7565d4f..000000000
--- a/test/func/docker/browser-utils/package.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "name": "browser-utils",
- "version": "0.0.0",
- "private": true,
- "scripts": {
- "install-chromium": "./install-chromium.sh"
- },
- "dependencies": {
- "adm-zip": "^0.5.10",
- "got": "^11.8.6"
- }
-}
diff --git a/test/func/fixtures/playwright/tests/screens/failed-describe-test-without-screenshot/chromium/header.png b/test/func/fixtures/playwright/tests/screens/failed-describe-test-without-screenshot/chromium/header.png
index 236088d2e..e2c552fe0 100644
Binary files a/test/func/fixtures/playwright/tests/screens/failed-describe-test-without-screenshot/chromium/header.png and b/test/func/fixtures/playwright/tests/screens/failed-describe-test-without-screenshot/chromium/header.png differ
diff --git a/test/func/tests/common-gui/index.testplane.js b/test/func/tests/common-gui/index.testplane.js
index 27a63cfdf..42ce3e60f 100644
--- a/test/func/tests/common-gui/index.testplane.js
+++ b/test/func/tests/common-gui/index.testplane.js
@@ -72,7 +72,7 @@ describe('GUI mode', () => {
await browser.$(historySelector).click();
const historyText = await browser.$(historySelector + '/div').getText();
- expect(historyText.includes('<-')).toBeTruthy();
+ expect(historyText.length > 0).toBeTruthy();
});
});
@@ -95,7 +95,7 @@ describe('GUI mode', () => {
it('should create a successful retry', async ({browser}) => {
const allRetryButtonsSelector =
getTestSectionByNameSelector(fullTestName) +
- '//button[@data-test-id="retry-switcher"]';
+ '//button[@data-qa="retry-switcher"]';
const retrySwitcher = browser.$(`(${allRetryButtonsSelector})[last()]`);
await hideScreenshots(browser);
@@ -120,7 +120,7 @@ describe('GUI mode', () => {
// Verify green retry button
const allRetryButtonsSelector =
getTestSectionByNameSelector(fullTestName) +
- '//button[@data-test-id="retry-switcher"]';
+ '//button[@data-qa="retry-switcher"]';
const retrySwitcher = browser.$(`(${allRetryButtonsSelector})[last()]`);
await hideScreenshots(browser);
diff --git a/test/func/tests/common-tinder/index.testplane.js b/test/func/tests/common-tinder/index.testplane.js
index 33be89237..b79b13075 100644
--- a/test/func/tests/common-tinder/index.testplane.js
+++ b/test/func/tests/common-tinder/index.testplane.js
@@ -67,7 +67,7 @@ describe('Tinder mode', () => {
});
it('should create a successful retry', async ({browser}) => {
- const retrySwitcher = await browser.$(`(//button[@data-test-id="retry-switcher"])[last()]`);
+ const retrySwitcher = await browser.$(`(//button[@data-qa="retry-switcher"])[last()]`);
await hideScreenshots(browser);
await retrySwitcher.assertView('retry-switcher');
@@ -84,7 +84,7 @@ describe('Tinder mode', () => {
await retryButton.waitForClickable({reverse: true, timeout: 10000});
await retryButton.waitForClickable({timeout: 10000});
- const retrySwitcher = await browser.$(`(//button[@data-test-id="retry-switcher"])[last()]`);
+ const retrySwitcher = await browser.$(`(//button[@data-qa="retry-switcher"])[last()]`);
await hideScreenshots(browser);
await retrySwitcher.assertView('retry-switcher');
diff --git a/test/func/tests/common/test-results-appearance.testplane.js b/test/func/tests/common/test-results-appearance.testplane.js
index 6248554c8..87f66b904 100644
--- a/test/func/tests/common/test-results-appearance.testplane.js
+++ b/test/func/tests/common/test-results-appearance.testplane.js
@@ -3,7 +3,8 @@ const {
getImageSectionSelector,
getTestStateByNameSelector,
getElementWithTextSelector,
- hideHeader, hideScreenshots
+ hideHeader, hideScreenshots,
+ getSpoilerByNameSelector
} = require('../utils');
describe('Test results appearance', () => {
@@ -16,7 +17,7 @@ describe('Test results appearance', () => {
it('should have green retry selector', async ({browser}) => {
const retrySelectorButton = await browser.$(
getTestSectionByNameSelector('successfully passed test') +
- '//button[@data-test-id="retry-switcher"]'
+ '//button[@data-qa="retry-switcher"]'
);
await hideHeader(browser);
@@ -30,7 +31,7 @@ describe('Test results appearance', () => {
it('should have pink retry selector', async ({browser}) => {
const retrySelectorButton = await browser.$(
getTestSectionByNameSelector('test with image comparison diff') +
- '//button[@data-test-id="retry-switcher"]'
+ '//button[@data-qa="retry-switcher"]'
);
await hideHeader(browser);
@@ -71,7 +72,7 @@ describe('Test results appearance', () => {
it('should have pink retry selector', async ({browser}) => {
const retrySelectorButton = await browser.$(
getTestSectionByNameSelector('test without screenshot') +
- '//button[@data-test-id="retry-switcher"]'
+ '//button[@data-qa="retry-switcher"]'
);
await hideHeader(browser);
@@ -98,7 +99,7 @@ describe('Test results appearance', () => {
it('should display actual screenshot', async ({browser}) => {
const imageElement = browser.$(
getTestSectionByNameSelector('test without screenshot') +
- getTestStateByNameSelector('header') +
+ '//' + getSpoilerByNameSelector('header') +
'//img'
);
@@ -112,7 +113,7 @@ describe('Test results appearance', () => {
it('should have red retry selector', async ({browser}) => {
const retrySelectorButton = await browser.$(
getTestSectionByNameSelector('test with long error message') +
- '//button[@data-test-id="retry-switcher"]'
+ '//button[@data-qa="retry-switcher"]'
);
await hideHeader(browser);
diff --git a/test/func/tests/common/tests-details.testplane.js b/test/func/tests/common/tests-details.testplane.js
index bf75f8cc9..bef2e0d4d 100644
--- a/test/func/tests/common/tests-details.testplane.js
+++ b/test/func/tests/common/tests-details.testplane.js
@@ -12,7 +12,7 @@ describe('Test details', function() {
await erroredTestSection.$('.details__summary').click();
- const fileMetaInfo = await erroredTestSection.$('div*=failed-describe').$('..');
+ const fileMetaInfo = await erroredTestSection.$('div.meta-info__item*=failed-describe').$('..');
await expect(fileMetaInfo).toBeDisplayed();
await expect(await fileMetaInfo.$('span*=file')).toBeDisplayed();
@@ -21,7 +21,7 @@ describe('Test details', function() {
it('should prevent details summary overflow', async ({browser}) => {
const selector =
getTestSectionByNameSelector('test with long error message') +
- `//summary[.${getElementWithTextSelector('span', 'stack')}/..]`;
+ `//section[contains(@class, 'error__item') and .${getElementWithTextSelector('span', 'stack')}/..]`;
await browser.$(selector).waitForDisplayed();
await browser.assertView('details summary', selector);
diff --git a/test/func/tests/screens/0049570/chrome/retry-switcher.png b/test/func/tests/screens/0049570/chrome/retry-switcher.png
index 996698da7..cb938be4b 100644
Binary files a/test/func/tests/screens/0049570/chrome/retry-switcher.png and b/test/func/tests/screens/0049570/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/07c99c0/chrome/retry-switcher.png b/test/func/tests/screens/07c99c0/chrome/retry-switcher.png
index 996698da7..cb938be4b 100644
Binary files a/test/func/tests/screens/07c99c0/chrome/retry-switcher.png and b/test/func/tests/screens/07c99c0/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/1361a92/chrome/retry-selector.png b/test/func/tests/screens/1361a92/chrome/retry-selector.png
index 7432c9cd0..218b13c65 100644
Binary files a/test/func/tests/screens/1361a92/chrome/retry-selector.png and b/test/func/tests/screens/1361a92/chrome/retry-selector.png differ
diff --git a/test/func/tests/screens/1bb949f/chrome/retry-switcher.png b/test/func/tests/screens/1bb949f/chrome/retry-switcher.png
index 996698da7..cb938be4b 100644
Binary files a/test/func/tests/screens/1bb949f/chrome/retry-switcher.png and b/test/func/tests/screens/1bb949f/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/42ea26d/chrome/retry-selector.png b/test/func/tests/screens/42ea26d/chrome/retry-selector.png
index d78257ad8..9e1ce15b2 100644
Binary files a/test/func/tests/screens/42ea26d/chrome/retry-selector.png and b/test/func/tests/screens/42ea26d/chrome/retry-selector.png differ
diff --git a/test/func/tests/screens/45b9477/chrome/retry-switcher.png b/test/func/tests/screens/45b9477/chrome/retry-switcher.png
index cf2e130cb..c2963e7d4 100644
Binary files a/test/func/tests/screens/45b9477/chrome/retry-switcher.png and b/test/func/tests/screens/45b9477/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/5c90021/chrome/basic plugins.png b/test/func/tests/screens/5c90021/chrome/basic plugins.png
index 77595ada2..1159a8985 100644
Binary files a/test/func/tests/screens/5c90021/chrome/basic plugins.png and b/test/func/tests/screens/5c90021/chrome/basic plugins.png differ
diff --git a/test/func/tests/screens/67cd8d8/chrome/retry-switcher.png b/test/func/tests/screens/67cd8d8/chrome/retry-switcher.png
index cf2e130cb..c2963e7d4 100644
Binary files a/test/func/tests/screens/67cd8d8/chrome/retry-switcher.png and b/test/func/tests/screens/67cd8d8/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/bdf4a21/chrome/retry-switcher.png b/test/func/tests/screens/bdf4a21/chrome/retry-switcher.png
index cf2e130cb..c2963e7d4 100644
Binary files a/test/func/tests/screens/bdf4a21/chrome/retry-switcher.png and b/test/func/tests/screens/bdf4a21/chrome/retry-switcher.png differ
diff --git a/test/func/tests/screens/be4ff5b/chrome/basic plugins clicked.png b/test/func/tests/screens/be4ff5b/chrome/basic plugins clicked.png
index 18daa28f8..d2376b137 100644
Binary files a/test/func/tests/screens/be4ff5b/chrome/basic plugins clicked.png and b/test/func/tests/screens/be4ff5b/chrome/basic plugins clicked.png differ
diff --git a/test/func/tests/screens/c0db305/chrome/details summary.png b/test/func/tests/screens/c0db305/chrome/details summary.png
index 9b727d925..8688382f9 100644
Binary files a/test/func/tests/screens/c0db305/chrome/details summary.png and b/test/func/tests/screens/c0db305/chrome/details summary.png differ
diff --git a/test/func/tests/screens/d8c5b8a/chrome/redux plugin clicked.png b/test/func/tests/screens/d8c5b8a/chrome/redux plugin clicked.png
index 76f389334..3c36e220c 100644
Binary files a/test/func/tests/screens/d8c5b8a/chrome/redux plugin clicked.png and b/test/func/tests/screens/d8c5b8a/chrome/redux plugin clicked.png differ
diff --git a/test/func/tests/screens/d90f7de/chrome/retry-selector.png b/test/func/tests/screens/d90f7de/chrome/retry-selector.png
index c74f4a81c..15e3c7a57 100644
Binary files a/test/func/tests/screens/d90f7de/chrome/retry-selector.png and b/test/func/tests/screens/d90f7de/chrome/retry-selector.png differ
diff --git a/test/func/tests/screens/ff4deba/chrome/retry-selector.png b/test/func/tests/screens/ff4deba/chrome/retry-selector.png
index d78257ad8..9e1ce15b2 100644
Binary files a/test/func/tests/screens/ff4deba/chrome/retry-selector.png and b/test/func/tests/screens/ff4deba/chrome/retry-selector.png differ
diff --git a/test/func/tests/utils.js b/test/func/tests/utils.js
index 39f54053e..47eeeb197 100644
--- a/test/func/tests/utils.js
+++ b/test/func/tests/utils.js
@@ -16,7 +16,7 @@ const getImageSectionSelector = (status) => `//div[contains(text(), '${status}')
const getElementWithTextSelector = (tagName, text) => `//${tagName}[contains(normalize-space(),'${text}')]`;
/** Returns element which has summary containing name */
-const getSpoilerByNameSelector = (name) => `details[.//summary[contains(text(), "${name}")]]`;
+const getSpoilerByNameSelector = (name) => `section[.//div[contains(text(), "${name}")]]`;
const hideHeader = async (browser) => {
await browser.execute(() => {
diff --git a/test/unit/lib/static/components/bullet.jsx b/test/unit/lib/static/components/bullet.jsx
index 0d35ca6bc..0e24eb479 100644
--- a/test/unit/lib/static/components/bullet.jsx
+++ b/test/unit/lib/static/components/bullet.jsx
@@ -39,28 +39,28 @@ describe('', () => {
it('should be "checked" if status is CHECKED', () => {
const component = mount();
- assert.isTrue(component.find('.checkbox.checked').exists());
+ assert.isTrue(component.find('.g-checkbox_checked').exists());
});
it('should be "indeterminate" if status is INDETERMINATE', () => {
const component = mount();
- assert.isTrue(component.find('.checkbox.indeterminate').exists());
+ assert.isTrue(component.find('.g-checkbox_indeterminate').exists());
});
it('should be "unchecked" if status is UNCHECKED', () => {
const component = mount();
- assert.isTrue(component.find('.checkbox').exists());
- assert.isFalse(component.find('.checkbox').hasClass('checked'));
- assert.isFalse(component.find('.checkbox').hasClass('indeterminate'));
+ assert.isTrue(component.find('label.g-checkbox').exists());
+ assert.isFalse(component.find('label.g-checkbox').hasClass('.g-checkbox_checked'));
+ assert.isFalse(component.find('label.g-checkbox').hasClass('.g-checkbox_indeterminate'));
});
it('should call "onClick" callback', () => {
const onClickStub = sandbox.stub();
const component = mount();
- component.find('.checkbox').simulate('click');
+ component.find('label.g-checkbox').simulate('click');
assert.calledOnce(onClickStub);
});
diff --git a/test/unit/lib/static/components/group-tests/item.jsx b/test/unit/lib/static/components/group-tests/item.jsx
index 8ac064978..fb8e6a97d 100644
--- a/test/unit/lib/static/components/group-tests/item.jsx
+++ b/test/unit/lib/static/components/group-tests/item.jsx
@@ -1,7 +1,7 @@
import React from 'react';
import proxyquire from 'proxyquire';
import {defaultsDeep, set} from 'lodash';
-import {Checkbox} from 'semantic-ui-react';
+import {Checkbox} from '@gravity-ui/uikit';
import {CHECKED, UNCHECKED, INDETERMINATE} from 'lib/constants/checked-statuses';
import {isCheckboxChecked} from 'lib/common-utils';
import {mkConnectedComponent} from 'test/unit/lib/static/components/utils';
diff --git a/test/unit/lib/static/components/retry-switcher/item.jsx b/test/unit/lib/static/components/retry-switcher/item.jsx
index 5b2a73fad..7ad67e30d 100644
--- a/test/unit/lib/static/components/retry-switcher/item.jsx
+++ b/test/unit/lib/static/components/retry-switcher/item.jsx
@@ -58,8 +58,8 @@ describe('', () => {
const component = mkRetrySwitcherItem({resultId: 'result-1', isActive: true}, initialState);
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find(`.tab-switcher__button_status_${FAIL}`), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find(`button.tab-switcher__button_status_${FAIL}`), 1);
});
});
@@ -77,8 +77,8 @@ describe('', () => {
const component = mkRetrySwitcherItem({resultId: 'result-1', isActive: true}, initialState);
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find(`.tab-switcher__button_status_${FAIL}_${ERROR}`), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find(`button.tab-switcher__button_status_${FAIL}_${ERROR}`), 1);
});
it('without non matched class if group is not selected', () => {
@@ -94,8 +94,8 @@ describe('', () => {
const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState);
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find('.tab-switcher__button_non-matched'), 0);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 0);
});
it('without non matched class if group is selected and result is matched on it', () => {
@@ -111,8 +111,8 @@ describe('', () => {
const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState);
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find('.tab-switcher__button_non-matched'), 0);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 0);
});
it('with non matched class if group is selected but result is not matched on it', () => {
@@ -128,8 +128,8 @@ describe('', () => {
const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState);
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find('.tab-switcher__button_non-matched'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 1);
});
});
@@ -146,7 +146,7 @@ describe('', () => {
};
const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState);
- const text = component.find('.tab-switcher__button').text();
+ const text = component.find('button.tab-switcher__button').text();
assert.equal(text, 100500);
});
@@ -154,15 +154,15 @@ describe('', () => {
it('should render button with correct active class name', () => {
const component = mkRetrySwitcherItem({isActive: true});
- assert.lengthOf(component.find('.tab-switcher__button'), 1);
- assert.lengthOf(component.find('.tab-switcher__button_active'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button'), 1);
+ assert.lengthOf(component.find('button.tab-switcher__button_active'), 1);
});
it('should call "onClick" handler on click in button', () => {
const onClick = sinon.stub();
const component = mkRetrySwitcherItem({onClick});
- component.find('.tab-switcher__button').simulate('click');
+ component.find('button.tab-switcher__button').simulate('click');
assert.calledOnceWith(onClick);
});
diff --git a/test/unit/lib/static/components/section/body/history.jsx b/test/unit/lib/static/components/section/body/history.jsx
index ed13dd7cc..547312e76 100644
--- a/test/unit/lib/static/components/section/body/history.jsx
+++ b/test/unit/lib/static/components/section/body/history.jsx
@@ -1,22 +1,9 @@
import React from 'react';
import {defaultsDeep, set} from 'lodash';
-import proxyquire from 'proxyquire';
+import History from 'lib/static/components/section/body/history';
import {mkConnectedComponent} from '../../utils';
describe('', () => {
- const sandbox = sinon.sandbox.create();
- let History, Details;
-
- beforeEach(() => {
- Details = sinon.stub().returns(null);
-
- History = proxyquire('lib/static/components/section/body/history', {
- '../../../details': {default: Details}
- }).default;
- });
-
- afterEach(() => sandbox.restore());
-
const mkHistoryComponent = (props = {}, initialState = {}) => {
props = defaultsDeep(props, {
resultId: 'default-result'
@@ -28,24 +15,26 @@ describe('', () => {
it('should not render if history does not exists', () => {
const initialState = set({}, 'tree.results.byId.default-result', {});
- mkHistoryComponent({resultId: 'default-result'}, initialState);
+ const component = mkHistoryComponent({resultId: 'default-result'}, initialState);
- assert.notCalled(Details);
+ assert.equal(component.find('.history').length, 0);
});
it('should render history if exists', () => {
- const initialState = set({}, 'tree.results.byId.default-result.history', 'some-history');
+ const initialState = set({}, 'tree.results.byId.default-result.history', ['some-history']);
const component = mkHistoryComponent({resultId: 'default-result'}, initialState);
- assert.equal(component.find(Details).prop('content'), 'some-history');
+ component.find('.details__summary').simulate('click');
+
+ assert.equal(component.find('.history-item').text(), 'some-history');
});
it('should render with "History" title', () => {
- const initialState = set({}, 'tree.results.byId.default-result.history', 'some-history');
+ const initialState = set({}, 'tree.results.byId.default-result.history', ['some-history']);
const component = mkHistoryComponent({resultId: 'default-result'}, initialState);
- assert.equal(component.find(Details).prop('title'), 'History');
+ assert.equal(component.find('.details__summary').text(), 'History');
});
});
diff --git a/test/unit/lib/static/components/section/body/meta-info/content.jsx b/test/unit/lib/static/components/section/body/meta-info/content.jsx
index 9dd557b09..124be3f0b 100644
--- a/test/unit/lib/static/components/section/body/meta-info/content.jsx
+++ b/test/unit/lib/static/components/section/body/meta-info/content.jsx
@@ -58,14 +58,19 @@ describe('', () => {
baz: ((data, extraItems) => `${data.testName}_${extraItems.baz}`).toString()
}
};
- const expectedMetaInfo = ['foo: bar', 'baz: some-suite_qux', 'url: some-url'];
+ const expectedMetaInfo = [
+ ['foo', 'bar'],
+ ['baz', 'some-suite_qux'],
+ ['url', 'some-url']
+ ];
const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree, apiValues});
const metaItems = component.find('.meta-info__item');
assert.equal(metaItems.length, expectedMetaInfo.length);
metaItems.forEach((node, i) => {
- assert.equal(node.text(), expectedMetaInfo[i]);
+ assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]);
+ assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]);
});
});
@@ -92,9 +97,9 @@ describe('', () => {
}
};
const expectedMetaInfo = [
- 'foo1: {"bar":"baz"}',
- 'foo2: [{"bar":"baz"}]',
- 'url: some-url'
+ ['foo1', '{"bar":"baz"}'],
+ ['foo2', '[{"bar":"baz"}]'],
+ ['url', 'some-url']
];
const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree});
@@ -102,7 +107,8 @@ describe('', () => {
assert.equal(metaItems.length, expectedMetaInfo.length);
metaItems.forEach((node, i) => {
- assert.equal(node.text(), expectedMetaInfo[i]);
+ assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]);
+ assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]);
});
});
@@ -129,9 +135,9 @@ describe('', () => {
}
};
const expectedMetaInfo = [
- 'foo1: true',
- 'foo2: false',
- 'url: some-url'
+ ['foo1', 'true'],
+ ['foo2', 'false'],
+ ['url', 'some-url']
];
const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree});
@@ -139,7 +145,8 @@ describe('', () => {
assert.equal(metaItems.length, expectedMetaInfo.length);
metaItems.forEach((node, i) => {
- assert.equal(node.text(), expectedMetaInfo[i]);
+ assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]);
+ assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]);
});
});
@@ -223,7 +230,8 @@ describe('', () => {
const config = {metaInfoBaseUrls: stub.metaInfoBaseUrls};
const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree, config});
- assert.equal(component.find('.meta-info__item:first-child').text(), `file: ${stub.metaInfo.file}`);
+ assert.equal(component.find('.meta-info__item:first-child .gc-definition-list__term-wrapper').text(), `file`);
+ assert.equal(component.find('.meta-info__item:first-child .gc-definition-list__definition').text(), `${stub.metaInfo.file}`);
assert.equal(component.find('.meta-info__item:first-child a').prop('href'), stub.expectedFileUrl);
});
});
diff --git a/test/unit/lib/static/components/section/title/browser-skipped.jsx b/test/unit/lib/static/components/section/title/browser-skipped.jsx
index c47f5f358..f95914c23 100644
--- a/test/unit/lib/static/components/section/title/browser-skipped.jsx
+++ b/test/unit/lib/static/components/section/title/browser-skipped.jsx
@@ -46,7 +46,7 @@ describe('', () => {
const component = mkBrowserSkippedTitleComponent({browserId: 'yabro'}, {tree});
- assert.equal(component.find('.checkbox').exists(), show);
+ assert.equal(component.find('input[type="checkbox"]').exists(), show);
});
});
@@ -59,7 +59,7 @@ describe('', () => {
const tree = mkStateTree({browsersById, resultsById, browsersStateById});
const component = mkBrowserSkippedTitleComponent({browserId: 'yabro'}, {tree});
- component.find('.checkbox').simulate('click');
+ component.find('input[type="checkbox"]').simulate('click');
assert.calledOnceWith(actionsStub.toggleBrowserCheckbox, {
suiteBrowserId: 'yabro',
diff --git a/test/unit/lib/static/components/section/title/browser.jsx b/test/unit/lib/static/components/section/title/browser.jsx
index 36908e8a8..536912874 100644
--- a/test/unit/lib/static/components/section/title/browser.jsx
+++ b/test/unit/lib/static/components/section/title/browser.jsx
@@ -60,7 +60,7 @@ describe('', () => {
const component = mkBrowserTitleComponent({browserId: 'yabro'}, {tree});
- assert.equal(component.find('.checkbox').exists(), show);
+ assert.equal(component.find('input[type="checkbox"]').exists(), show);
});
});
@@ -73,7 +73,7 @@ describe('', () => {
const tree = mkStateTree({browsersById, resultsById, browsersStateById});
const component = mkBrowserTitleComponent({browserId: 'yabro'}, {tree});
- component.find('.checkbox').simulate('click');
+ component.find('input[type="checkbox"]').simulate('click');
assert.calledOnceWith(actionsStub.toggleBrowserCheckbox, {
suiteBrowserId: 'yabro',
@@ -105,9 +105,6 @@ describe('', () => {
const component = mkBrowserTitleComponent({browserId: 'yabro', browserName: 'yabro'}, {tree});
- // call prop to simulate click due to multiple requires in ClipboardButton
- component.find('ClipboardButton').prop('option-text')();
-
assert.calledOnce(queryParams.appendQuery);
assert.calledWithExactly(queryParams.appendQuery, 'about:blank', {
browser: 'yabro',
diff --git a/test/unit/lib/static/components/section/title/simple.jsx b/test/unit/lib/static/components/section/title/simple.jsx
index 7d2dc279a..38b89e190 100644
--- a/test/unit/lib/static/components/section/title/simple.jsx
+++ b/test/unit/lib/static/components/section/title/simple.jsx
@@ -1,10 +1,10 @@
import React from 'react';
import proxyquire from 'proxyquire';
import {defaultsDeep, set} from 'lodash';
-import {Checkbox} from 'semantic-ui-react';
import {mkConnectedComponent} from 'test/unit/lib/static/components/utils';
import {mkStateTree} from 'test/unit/lib/static/state-utils';
import {CHECKED, UNCHECKED, INDETERMINATE} from 'lib/constants/checked-statuses';
+import { Checkbox } from '@gravity-ui/uikit';
describe('', () => {
const sandbox = sinon.sandbox.create();
diff --git a/test/unit/lib/static/modules/middlewares/metrika.js b/test/unit/lib/static/modules/middlewares/metrika.js
index c0a0942b1..54481f108 100644
--- a/test/unit/lib/static/modules/middlewares/metrika.js
+++ b/test/unit/lib/static/modules/middlewares/metrika.js
@@ -1,13 +1,13 @@
import YandexMetrika from 'lib/static/modules/yandex-metrika';
import actionNames from 'lib/static/modules/action-names';
-import webVitals from 'lib/static/modules/web-vitals';
+import proxyquire from 'proxyquire';
// eslint-disable-next-line
globalThis.performance = globalThis.performance; // node v14 stub
describe('lib/static/modules/middlewares/metrika', () => {
const sandbox = sinon.sandbox.create();
- let next, metrikaMiddleware;
+ let next, metrikaMiddleware, measurePerformanceStub;
const mkStore_ = (state = {}) => {
return {getState: sandbox.stub().returns(state)};
@@ -31,15 +31,18 @@ describe('lib/static/modules/middlewares/metrika', () => {
beforeEach(() => {
next = sandbox.stub();
+ measurePerformanceStub = sandbox.stub();
- metrikaMiddleware = requireUncached_('lib/static/modules/middlewares/metrika');
+ metrikaMiddleware = proxyquire.noPreserveCache().noCallThru()('lib/static/modules/middlewares/metrika', {
+ '../web-vitals': {
+ measurePerformance: measurePerformanceStub
+ }
+ }).default;
sandbox.stub(YandexMetrika, 'create').returns(Object.create(YandexMetrika.prototype));
sandbox.stub(YandexMetrika.prototype, 'acceptScreenshot');
sandbox.stub(YandexMetrika.prototype, 'acceptOpenedScreenshots');
sandbox.stub(YandexMetrika.prototype, 'sendVisitParams');
-
- sandbox.stub(webVitals, 'measurePerformance');
});
afterEach(() => sandbox.restore());
@@ -84,7 +87,7 @@ describe('lib/static/modules/middlewares/metrika', () => {
metrikaMiddleware(YandexMetrika)(store)(next)(action);
- assert.notCalled(webVitals.measurePerformance);
+ assert.notCalled(measurePerformanceStub);
});
});
@@ -125,7 +128,7 @@ describe('lib/static/modules/middlewares/metrika', () => {
describe('measure site performance', () => {
it('should send some performance info to y.metrika with rounded value', () => {
const action = {type: eventName, payload};
- webVitals.measurePerformance.callsFake(cb => cb({name: 'XXX', value: 100.999}));
+ measurePerformanceStub.callsFake(cb => cb({name: 'XXX', value: 100.999}));
metrikaMiddleware(YandexMetrika)(store)(next)(action);
@@ -134,7 +137,7 @@ describe('lib/static/modules/middlewares/metrika', () => {
it('should send "CLS" performance info to y.metrika with multiplied by 1000 value', () => {
const action = {type: eventName, payload};
- webVitals.measurePerformance.callsFake(cb => cb({name: 'CLS', value: 0.99999}));
+ measurePerformanceStub.callsFake(cb => cb({name: 'CLS', value: 0.99999}));
metrikaMiddleware(YandexMetrika)(store)(next)(action);
diff --git a/test/unit/lib/static/modules/yandex-metrika.js b/test/unit/lib/static/modules/yandex-metrika.js
index fd635ee43..83086a79d 100644
--- a/test/unit/lib/static/modules/yandex-metrika.js
+++ b/test/unit/lib/static/modules/yandex-metrika.js
@@ -1,4 +1,4 @@
-const YandexMetrika = require('lib/static/modules/yandex-metrika');
+import YandexMetrika from 'lib/static/modules/yandex-metrika';
describe('YandexMetrika', () => {
const sandbox = sinon.createSandbox();