blob: 70f52def55238232e0a7fa0fa7a627655643763f [file] [log] [blame]
/// <reference path="../matchers/custom-matchers.d.ts"/>
/**
* 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 { MetronAlertsPage } from './alerts-list.po';
import { customMatchers } from '../matchers/custom-matchers';
import { LoginPage } from '../login/login.po';
import { loadTestData, deleteTestData } from '../utils/e2e_util';
describe('Test spec for all ui elements & list view', function() {
let page: MetronAlertsPage;
let loginPage: LoginPage;
let columnNames = [ '', 'Score', 'guid', 'timestamp', 'source:type', 'ip_src_addr', 'enrichm...:country',
'ip_dst_addr', 'host', 'alert_status', '', '', ''];
let colNamesColumnConfig = [ 'score', 'guid', 'timestamp', 'source:type', 'ip_src_addr', 'enrichments:geo:ip_dst_addr:country',
'ip_dst_addr', 'host', 'alert_status' ];
beforeAll(async function() : Promise<any> {
loginPage = new LoginPage();
await loadTestData();
await loginPage.login();
});
afterAll(async function() : Promise<any> {
await loginPage.logout();
await deleteTestData();
});
beforeEach(() => {
page = new MetronAlertsPage();
jasmine.addMatchers(customMatchers);
});
it('should have all the UI elements', async function() : Promise<any> {
await page.navigateTo();
await page.clearLocalStorage();
expect(await page.getChangesAlertTableTitle('Alerts (0)')).toEqualBcoz('Alerts (169)', 'for alerts title');
expect(await page.isMetronLogoPresent()).toEqualBcoz(true, 'for Metron Logo');
expect(await page.isSavedSearchButtonPresent()).toEqualBcoz(true, 'for SavedSearch Button');
expect(await page.isClearSearchPresent()).toEqualBcoz(true, 'for Clear Search');
expect(await page.isSearchButtonPresent()).toEqualBcoz(true, 'for Search Button');
expect(await page.isSaveSearchButtonPresent()).toEqualBcoz(true, 'for Save Search Button');
expect(await page.isTableSettingsButtonPresent()).toEqualBcoz(true, 'for table settings button');
expect(await page.isPausePlayRefreshButtonPresent()).toEqualBcoz(true, 'for pause/play button');
expect(await page.isConfigureTableColumnsPresent()).toEqualBcoz(true, 'for alerts table column configure button');
expect(await page.getActionDropdownItems()).toEqualBcoz([ 'Open', 'Dismiss', 'Escalate', 'Resolve', 'Add to Alert' ],
'for default dropdown actions');
expect(await page.getTableColumnNames()).toEqualBcoz(columnNames, 'for default column names for alert list table');
});
it('should have all pagination controls and they should be working', async function() : Promise<any> {
await page.clickSettings();
await page.clickPageSize('100');
expect(await page.getChangedPaginationText('1 - 25 of 169')).toEqualBcoz('1 - 100 of 169', 'for pagination text');
expect(await page.isChevronLeftEnabled()).toEqualBcoz(false, 'for left chevron to be disabled for first page');
expect(await page.isChevronRightEnabled()).toEqualBcoz(true, 'for right chevron to be enabled for first page');
await page.clickChevronRight();
expect(await page.getChangedPaginationText('1 - 100 of 169')).toEqualBcoz('101 - 169 of 169', 'for pagination text');
expect(await page.isChevronLeftEnabled()).toEqualBcoz(true, 'for left chevron to be disabled for first page');
expect(await page.isChevronRightEnabled()).toEqualBcoz(false, 'for right chevron to be enabled for first page');
await page.clickChevronLeft();
expect(await page.getChangedPaginationText('101 - 169 of 169')).toEqualBcoz('1 - 100 of 169', 'for pagination text');
expect(await page.isChevronLeftEnabled()).toEqualBcoz(false, 'for left chevron to be disabled for first page');
expect(await page.isChevronRightEnabled()).toEqualBcoz(true, 'for right chevron to be enabled for first page');
await page.clickSettings();
await page.clickPageSize('25');
expect(await page.getChangedPaginationText('1 - 100 of 169')).toEqualBcoz('1 - 25 of 169', 'for pagination text');
await page.clickSettings();
});
it('should have all settings controls and they should be working', async function() : Promise<any> {
let settingsPaneLbelNames = [ 'REFRESH RATE', 'ROWS PER PAGE', 'HIDE Resolved Alerts', 'HIDE Dismissed Alerts' ];
let settingPaneRefreshIntervals = [ '5s', '10s', '15s', '30s', '1m', '10m', '1h' ];
let settingsPanePageSize = [ '10', '25', '50', '100', '250', '500', '1000' ];
await page.clickSettings();
expect(await page.getSettingsLabels()).toEqualBcoz(settingsPaneLbelNames, 'for table settings labels');
expect(await page.getRefreshRateOptions()).toEqualBcoz(settingPaneRefreshIntervals, 'for table settings refresh rate labels');
expect(await page.getRefreshRateSelectedOption()).toEqualBcoz([ '1m' ], 'for table settings default refresh rate');
await page.clickRefreshInterval('10s');
expect(await page.getRefreshRateSelectedOption()).toEqualBcoz([ '10s' ], 'for refresh interval 10s');
await page.clickRefreshInterval('1h');
expect(await page.getRefreshRateSelectedOption()).toEqualBcoz([ '1h' ], 'for refresh interval 1h');
expect(await page.getPageSizeOptions()).toEqualBcoz(settingsPanePageSize, 'for table settings refresh rate labels');
expect(await page.getPageSizeSelectedOption()).toEqualBcoz([ '25' ], 'for table settings default page size');
await page.clickPageSize('50');
expect(await page.getPageSizeSelectedOption()).toEqualBcoz([ '50' ], 'for page size 50');
await page.clickPageSize('100');
expect(await page.getPageSizeSelectedOption()).toEqualBcoz([ '100' ], 'for page size 100');
await page.clickPageSize('25');
expect(await page.getPageSizeSelectedOption()).toEqualBcoz([ '25' ], 'for page size 100');
await page.clickSettings();
});
it('play pause should start polling and stop polling ', async function() : Promise<any> {
expect(await page.getPlayPauseState()).toEqual('fa fa-play', 'for default pause option');
await page.clickPlayPause('fa-pause');
expect(await page.getPlayPauseState()).toEqual('fa fa-pause', 'for default pause option');
await page.clickPlayPause('fa-play');
expect(await page.getPlayPauseState()).toEqual('fa fa-play', 'for default pause option');
});
it('should select columns from table configuration', async function() : Promise<any> {
await page.clickConfigureTable();
expect(await page.getSelectedColumnNames()).toEqual(colNamesColumnConfig, 'expect default selected column names');
// remove the 'guid' column and add the 'id' column
await page.toggleSelectCol('guid');
await page.toggleSelectCol('id');
let expectedColumns = [ 'score', 'timestamp', 'source:type', 'ip_src_addr', 'enrichments:geo:ip_dst_addr:country',
'ip_dst_addr', 'host', 'alert_status', 'id' ];
expect(await page.getSelectedColumnNames()).toEqual(expectedColumns, 'expect "id" field added and "guid" field removed from visible columns');
await page.saveConfigureColumns();
});
it('should have all time-range controls', async function() : Promise<any> {
let quickRanges = [
'Last 7 days', 'Last 30 days', 'Last 60 days', 'Last 90 days', 'Last 6 months', 'Last 1 year', 'Last 2 years', 'Last 5 years',
'Yesterday', 'Day before yesterday', 'This day last week', 'Previous week', 'Previous month', 'Previous year', 'All time',
'Today', 'Today so far', 'This week', 'This week so far', 'This month', 'This year',
'Last 5 minutes', 'Last 15 minutes', 'Last 30 minutes', 'Last 1 hour', 'Last 3 hours', 'Last 6 hours', 'Last 12 hours', 'Last 24 hours'
];
await page.clickDateSettings();
expect(await page.getTimeRangeTitles()).toEqual(['Time Range', 'Quick Ranges']);
expect(await page.getQuickTimeRanges()).toEqual(quickRanges);
expect(await page.getValueForManualTimeRange()).toEqual([ 'now', 'now' ]);
expect(await page.isManulaTimeRangeApplyButtonPresent()).toEqual(true);
expect(await page.getTimeRangeButtonText()).toEqual('All time');
await page.hideDateSettings();
});
it('should have all time range values populated - 1', async function() : Promise<any> {
let secInADay = (24 * 60 * 60 * 1000);
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 7 days').catch(e => console.log(e))).toEqualBcoz(['Last 7 days', String(secInADay * 7)], 'for last 7 days');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 30 days').catch(e => console.log(e))).toEqualBcoz(['Last 30 days', String(secInADay * 30)], 'for last 30 days');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 60 days').catch(e => console.log(e))).toEqualBcoz(['Last 60 days', String(secInADay * 60)], 'for last 60 days');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 90 days').catch(e => console.log(e))).toEqualBcoz(['Last 90 days', String(secInADay * 90)], 'for last 90 days');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 1 year').catch(e => console.log(e))).toEqualBcoz(['Last 1 year', String(secInADay * 365)], 'for last 1 year');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 2 years').catch(e => console.log(e))).toEqualBcoz(['Last 2 years', String((secInADay * 365 * 2))], 'for last 2 years');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 5 years').catch(e => console.log(e))).toEqualBcoz(['Last 5 years', String((secInADay * 365 * 5) + secInADay)], 'for last 5 years');
});
it('should have all time range values populated - 2', async function() : Promise<any> {
let secInADay = (24*60*60*1000);
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Yesterday').catch(e => console.log(e))).toEqualBcoz([ 'Yesterday', String(secInADay - 1000)], 'yesterday');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Day before yesterday').catch(e => console.log(e))).toEqualBcoz([ 'Day before yesterday', String(secInADay - 1000)], 'day before yesterday');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('This day last week').catch(e => console.log(e))).toEqualBcoz([ 'This day last week', String(secInADay - 1000)], 'this day last week');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Previous week').catch(e => console.log(e))).toEqualBcoz([ 'Previous week', String((secInADay * 7) - (1000))], 'for previous week');
});
it('should have all time range values populated - 3', async function() : Promise<any> {
let secInADay = (24*60*60*1000);
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Today').catch(e => console.log(e))).toEqualBcoz([ 'Today', String(secInADay - 1000)], 'for today');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('This week').catch(e => console.log(e))).toEqualBcoz([ 'This week', String((secInADay*7) - 1000)], 'for this week');
});
it('should have all time range values populated - 4', async function() : Promise<any> {
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 5 minutes').catch(e => console.log(e))).toEqualBcoz([ 'Last 5 minutes', String(5 * 60 * 1000)], 'for last 5 minutes');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 15 minutes').catch(e => console.log(e))).toEqualBcoz([ 'Last 15 minutes', String(15 * 60 * 1000)], 'for last 15 minutes');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 30 minutes').catch(e => console.log(e))).toEqualBcoz([ 'Last 30 minutes', String(30 * 60 * 1000)], 'for last 30 minutes');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 1 hour').catch(e => console.log(e))).toEqualBcoz([ 'Last 1 hour', String(60 * 60 * 1000)], 'for last 1 hour');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 3 hours').catch(e => console.log(e))).toEqualBcoz([ 'Last 3 hours', String(3 * 60 * 60 * 1000)], 'for last 3 hours');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 6 hours').catch(e => console.log(e))).toEqualBcoz([ 'Last 6 hours', String(6 * 60 * 60 * 1000)], 'for last 6 hours');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 12 hours').catch(e => console.log(e))).toEqualBcoz([ 'Last 12 hours', String(12 * 60 * 60 * 1000)], 'for last 12 hours');
await page.clickDateSettings();
expect(await page.selectQuickTimeRangeAndGetTimeRangeAndTimeText('Last 24 hours').catch(e => console.log(e))).toEqualBcoz([ 'Last 24 hours', String(24 * 60 * 60 * 1000)], 'for last 24 hours');
});
it('should disable date picker when timestamp is present in search', async function() : Promise<any> {
await page.setSearchText('timestamp:1505325740512');
expect(await page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (1)');
expect(await page.isDateSeettingDisabled()).toEqual(true);
await page.clickClearSearch();
expect(await page.getChangesAlertTableTitle('Alerts (1)')).toEqual('Alerts (169)');
expect(await page.isDateSeettingDisabled()).toEqual(false);
await expect(page.clickTableTextAndGetSearchText('FR', 'enrichments:geo:ip_dst_addr:country:FR')).toEqual('enrichments:geo:ip_dst_addr:country:FR');
expect(await page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (25)');
expect(await page.isDateSeettingDisabled()).toEqual(false);
await page.clickClearSearch();
expect(await page.getChangesAlertTableTitle('Alerts (25)')).toEqual('Alerts (169)');
});
it('should have now included when to date is empty', async function() : Promise<any> {
await page.clickDateSettings();
await page.setDate(0, '2017', 'September', '13', '23', '29', '35');
await page.selectTimeRangeApplyButton();
expect(await page.getTimeRangeButtonTextForNow()).toEqual([ 'Date Range', '2017-09-13 23:29:35 to now' ]);
await page.clickClearSearch();
});
it('should have all time-range included while searching', async function() : Promise<any> {
let startDate = new Date(1505325575000);
let endDate = new Date(1505325580000);
await page.clearLocalStorage();
await page.clickDateSettings();
/* Select Last 5years for time range */
expect(await page.selectQuickTimeRangeAndGetTimeRangeText('Last 5 years')).toEqual('Last 5 years');
/* Select custom date for time range */
await page.clickDateSettings();
await page.setDate(0, String(startDate.getFullYear()), startDate.toLocaleString('en-us', { month: "long" }), String(startDate.getDate()),
String(startDate.getHours()), String(startDate.getMinutes()), String(startDate.getSeconds()));
await page.setDate(1, String(endDate.getFullYear()), endDate.toLocaleString('en-us', { month: "long" }), String(endDate.getDate()),
String(endDate.getHours()), String(endDate.getMinutes()), String(endDate.getSeconds()));
await page.selectTimeRangeApplyButton();
expect(await page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (5)');
/* Save custom date in saved searches */
await page.saveSearch('e2e-2');
await page.clickSavedSearch();
// The below expect statement will fail until this issue is resolved in Protractor: https://github.com/angular/protractor/issues/4693
// This is because the connection resets before deleting the test comment, which causes the assertion to be false
// expect(await page.getRecentSearchOptions()).toContain('timestamp:last-5-years', 'for recent search options');
expect(await page.getSavedSearchOptions()).toEqual(['e2e-2'],
'for saved search options');
await page.clickCloseSavedSearch();
/* Clear Search should should show all rows */
await page.clickClearSearch();
expect(await page.getChangesAlertTableTitle('Alerts (5)')).toEqual('Alerts (169)');
/* Load the saved search */
await page.clickSavedSearch();
await page.loadSavedSearch('e2e-2');
expect(await page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (5)');
/* Load recent search */
await page.clickSavedSearch();
await page.loadRecentSearch('last-5-years');
expect(await page.getChangesAlertTableTitle('Alerts (5)')).toEqual('Alerts (169)');
});
});