blob: 047578afbd3982fec0131a85a8f287e936232164 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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 { browser, element, by } from 'protractor';
import {
waitForElementPresence, waitForTextChange, waitForElementVisibility,
waitForElementInVisibility, waitForCssClass, waitForStalenessOf,
waitForElementCountGreaterThan, reduce_for_get_all, scrollIntoView
} from '../../utils/e2e_util';
export class TreeViewPage {
navigateToAlertsList() {
return browser.get('/alerts-list');
}
clickOnRow(id: string) {
let idElement = element(by.css('a[title="' + id +'"]'));
let td = idElement.element(by.xpath('../..')).all(by.css('td')).get(9);
let detailsPane = element(by.css('.metron-slider-pane-details'));
return waitForElementPresence(idElement)
.then(() => browser.actions().mouseMove(idElement).perform())
.then(() => browser.actions().mouseMove(td).perform())
.then(() => browser.actions().click().perform())
.then(() => waitForElementVisibility(detailsPane))
.then(() => browser.sleep(2000));
}
getActiveGroups() {
return waitForElementCountGreaterThan('app-group-by .group-by-items .name', 4)
.then(() => element.all(by.css('app-group-by .group-by-items.active .name')).reduce(reduce_for_get_all(), []));
}
getGroupByCount() {
return waitForElementPresence(element(by.css('app-group-by .group-by-items'))).then(() => {
return element.all(by.css('app-group-by .group-by-items')).count();
});
}
getGroupByItemNames() {
return element.all(by.css('app-group-by .group-by-items .name')).reduce(reduce_for_get_all(), []);
}
getGroupByItemCounts() {
return element.all(by.css('app-group-by .group-by-items .count')).reduce(reduce_for_get_all(), []);
}
getSubGroupValues(name: string, rowName: string) {
return this.getSubGroupValuesByPosition(name, rowName, 0);
}
getSubGroupValuesByPosition(name: string, rowName: string, position: number) {
return element.all(by.css('[data-name="' + name + '"] table tbody tr[data-name="' + rowName + '"]')).get(position).getText();
}
selectGroup(name: string) {
return element(by.css('app-group-by div[data-name="' + name + '"]')).click()
.then(() => waitForCssClass(element(by.css('app-group-by div[data-name="' + name + '"]')), 'active'))
.then(() => browser.waitForAngular());
}
async simulateDragAndDrop(target: string, destination: string) {
target = `app-group-by div[data-name=\"${target}\"]`;
destination = `app-group-by div[data-name=\"${destination}\"]`;
return await browser.executeScript((target, destination) => {
let getEventOptions = (el, relatedElement) => {
//coordinates from destination element
const coords = el.getBoundingClientRect();
const x = coords.x || coords.left;
const y = coords.y || coords.top;
return {
x: x,
y: y,
clientX: x,
clientY: y,
screenX: x,
screenY: y,
//target reference
relatedTarget: relatedElement
};
};
let raise = (el, type, options?) => {
const o = options || { which: 1 };
const e = document.createEvent('Event');
e.initEvent(type, true, true);
Object.keys(o).forEach(apply);
el.dispatchEvent(e);
function apply(key) {
e[key] = o[key];
}
};
let targetEl = document.querySelector(target);
let destinationEl = document.querySelector(destination);
let options = getEventOptions(destinationEl, targetEl);
//start drag
raise(targetEl, 'mousedown');
raise(targetEl, 'mousemove');
//set event on location
raise(destinationEl, 'mousemove', options);
//drop
raise(destinationEl, 'mouseup', options);
}, target, destination);
}
async getDashGroupValues(name: string) {
let dashScore = await element(by.css('[data-name="' + name + '"] .dash-score')).getText();
let groupName = await element(by.css('[data-name="' + name + '"] .text-light.severity-padding .title')).getText();
let title = await element(by.css('[data-name="' + name + '"] .text-light.two-line .text-dark')).getText();
let count = await element(by.css('[data-name="' + name + '"] .text-light.two-line .title')).getText();
return Promise.all([dashScore, groupName, title, count]);
}
expandDashGroup(name: string) {
let cardElement = element(by.css('.card[data-name="' + name +'"]'));
let cardHeader = element(by.css('.card[data-name="' + name + '"] .card-header'));
let cardBody = element(by.css('.card[data-name="' + name + '"] .collapse'));
return waitForElementPresence(cardBody)
.then(() => waitForElementVisibility(cardHeader))
.then(() => browser.actions().mouseMove(element(by.css('.card[data-name="' + name + '"] .card-header .down-arrow'))).perform())
.then(() => cardHeader.click())
.then(() => waitForCssClass(cardBody, 'show'))
.then(() => waitForElementVisibility(element(by.css('.card[data-name="' + name + '"] .collapse table tbody tr:nth-child(1)'))));
}
expandSubGroup(groupName: string, rowName: string) {
return this.expandSubGroupByPosition(groupName, rowName, 0);
}
expandSubGroupByPosition(groupName: string, rowName: string, position: number) {
let subGroupElement = element.all(by.css('[data-name="' + groupName + '"] tr[data-name="' + rowName + '"]')).get(position);
return waitForElementVisibility(subGroupElement)
.then(() => scrollIntoView(subGroupElement.element(by.css('.fa-caret-right')), true))
.then(() => subGroupElement.click())
.then(() => waitForElementVisibility(subGroupElement.element(by.css('.fa-caret-down'))));
}
async getTableValuesByRowId(name: string, rowId: number, waitForAnchor: string) {
await waitForElementPresence(element(by. cssContainingText('[data-name="' + name + '"] a', waitForAnchor)));
return element.all(by.css('[data-name="' + name + '"] table tbody tr')).get(rowId).all(by.css('td a')).reduce(reduce_for_get_all(), []);
}
getTableValuesForRow(name: string, rowName: string, waitForAnchor: string) {
return waitForElementPresence(element(by. cssContainingText('[data-name="' + name + '"] a', waitForAnchor))).then(() => {
return element.all(by.css('[data-name="' + name + '"] tr[data-name="' + rowName + '"]')).all(by.css('td')).getText();
});
}
scrollToDashRow(name: string) {
let scrollToEle = element(by.css('[data-name="' + name + '"] .card-header'));
return scrollIntoView(scrollToEle, true);
}
clickOnNextPage(name: string) {
return element(by.css('[data-name="' + name + '"] i.fa-chevron-right')).click();
}
unGroup() {
return element(by.css('app-group-by .ungroup-button')).click()
.then(() => waitForStalenessOf(element(by.css('app-tree-view'))));
}
getIdOfAllExpandedRows() {
return element.all(by.css('[data-name="' + name + '"] table tbody tr')).then(row => {
});
}
getNumOfSubGroups(groupName: string) {
return element.all(by.css('[data-name="' + groupName + '"] table tbody tr')).count();
}
getCellValuesFromTable(groupName: string, cellName: string, waitForAnchor: string) {
let waitForEle = element.all(by.cssContainingText(`[data-name="${cellName}"] a`, waitForAnchor)).get(0);
return waitForElementPresence(waitForEle)
.then(() => scrollIntoView(waitForEle, true))
.then(() => element.all(by.css(`[data-name="${groupName}"] [data-name="${cellName}"]`)).reduce(reduce_for_get_all(), []))
}
sortSubGroup(groupName: string, colName: string) {
return element(by.css(`[data-name="${groupName}"] metron-config-sorter[title="${colName}"]`)).click();
}
toggleAlertInTree(index: number) {
let selector = by.css('app-tree-view tbody tr');
let checkbox = element.all(selector).get(index).element(by.css('label'));
return waitForElementPresence(checkbox)
.then(() => browser.actions().mouseMove(checkbox).perform())
.then(() => checkbox.click());
}
getAlertStatusForTreeView(rowIndex: number, previousText) {
let row = element.all(by.css('app-tree-view tbody tr')).get(rowIndex);
let column = row.all(by.css('td a')).get(8);
return waitForTextChange(column, previousText).then(() => {
return column.getText();
});
}
clickOnMergeAlerts(groupName: string) {
return element(by.css('[data-name="' + groupName + '"] .fa-link')).click();
}
clickOnMergeAlertsInTable(groupName: string, waitForAnchor: string, rowIndex: number) {
let elementFinder = element.all(by.css('[data-name="' + groupName + '"] table tbody tr')).get(rowIndex).element(by.css('.fa-link'));
return waitForElementVisibility(elementFinder)
.then(() => elementFinder.click());
}
getConfirmationText() {
let maskElement = element(by.className('modal-backdrop'));
return waitForElementVisibility(maskElement)
.then(() => element(by.css('.metron-dialog .modal-body')).getText());
}
clickNoForConfirmation() {
let maskElement = element(by.className('modal-backdrop'));
let closeButton = element(by.css('.metron-dialog')).element(by.buttonText('Cancel'));
return waitForElementVisibility(maskElement)
.then(() => closeButton.click())
.then(() => waitForElementInVisibility(maskElement));
}
clickYesForConfirmation() {
let okButton = element(by.css('.metron-dialog')).element(by.buttonText('OK'));
let maskElement = element(by.className('modal-backdrop'));
return waitForElementVisibility(maskElement)
.then(() => okButton.click())
.then(() => waitForElementInVisibility(maskElement));
}
waitForElementToDisappear(groupName: string) {
return waitForElementInVisibility(element.all(by.css('[data-name="' + groupName + '"]')));
}
waitForTextChangeAndExpand(groupName: string, subGroupName: string, previousValue: string) {
return waitForTextChange(element(by.css(`[data-name="${subGroupName}"] .group-value`)), previousValue)
.then(() => this.expandSubGroup(groupName, subGroupName));
}
}