Skip to content

Commit 6e76e7e

Browse files
authored
Merge pull request #1145 from RedisInsight/e2e/feature/enhanced-overview-tests
E2e/feature/enhanced overview tests
2 parents 351670d + 4169706 commit 6e76e7e

File tree

8 files changed

+188
-6
lines changed

8 files changed

+188
-6
lines changed

tests/e2e/helpers/api/api-database.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { t } from 'testcafe';
22
import * as request from 'supertest';
33
import { asyncFilter, doAsyncStuff } from '../async-helper';
4-
import { AddNewDatabaseParameters, OSSClusterParameters, databaseParameters, SentinelParameters } from '../../pageObjects/add-redis-database-page';
4+
import { AddNewDatabaseParameters, OSSClusterParameters, databaseParameters, SentinelParameters, ClusterNodes } from '../../pageObjects/add-redis-database-page';
55
import { Common } from '../common';
66

77
const common = new Common();
@@ -195,3 +195,18 @@ export async function deleteStandaloneDatabasesApi(databasesParameters: AddNewDa
195195
});
196196
}
197197
}
198+
199+
/**
200+
* Get OSS Cluster nodes
201+
* @param databaseParameters The database parameters
202+
*/
203+
export async function getClusterNodesApi(databaseParameters: OSSClusterParameters): Promise<string[]> {
204+
const databaseId = await getDatabaseByName(databaseParameters.ossClusterDatabaseName);
205+
const response = await request(endpoint)
206+
.get(`/instance/${databaseId}/cluster-details`)
207+
.set('Accept', 'application/json')
208+
.expect(200);
209+
let nodes = await response.body.nodes;
210+
let nodeNames = await nodes.map((node: ClusterNodes) => (node.host + ':' + node.port));
211+
return nodeNames;
212+
}

tests/e2e/pageObjects/add-redis-database-page.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,13 @@ export type databaseParameters = {
222222
connectionType?: string,
223223
lastConnection?: string
224224
};
225+
226+
/**
227+
* Nodes in OSS Cluster parameters
228+
* @param host The host of the node
229+
* @param port The port of the node
230+
*/
231+
export type ClusterNodes = {
232+
host: string,
233+
port: string
234+
};

tests/e2e/pageObjects/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { DatabaseOverviewPage } from './database-overview-page';
1111
import { HelpCenterPage } from './help-center-page';
1212
import { ShortcutsPage } from './shortcuts-page';
1313
import { MonitorPage } from './monitor-page';
14+
import { OverviewPage } from './overview-page';
1415
import { PubSubPage } from './pub-sub-page';
1516
import { SlowLogPage } from './slow-log-page';
1617
import { NotificationPage } from './notification-page';
@@ -29,6 +30,7 @@ export {
2930
HelpCenterPage,
3031
ShortcutsPage,
3132
MonitorPage,
33+
OverviewPage,
3234
PubSubPage,
3335
SlowLogPage,
3436
NotificationPage

tests/e2e/pageObjects/my-redis-databases-page.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export class MyRedisDatabasePage {
1010
//BUTTONS
1111
settingsButton = Selector('[data-testid=settings-page-btn]');
1212
workbenchButton = Selector('[data-testid=workbench-page-btn]');
13+
analysisPageButton = Selector('[data-testid=analytics-page-btn]');
1314
helpCenterButton = Selector('[data-testid=help-menu-button]');
1415
githubButton = Selector('[data-testid=github-repo-icon]');
1516
browserButton = Selector('[data-testid=browser-page-btn]');
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Selector } from 'testcafe';
2+
3+
export class OverviewPage {
4+
//CSS Selectors
5+
cssTableRow = 'tr[class=euiTableRow]';
6+
//-------------------------------------------------------------------------------------------
7+
//DECLARATION OF SELECTORS
8+
//*Declare all elements/components of the relevant page.
9+
//*Target any element/component via data-id, if possible!
10+
//*The following categories are ordered alphabetically (Alerts, Buttons, Checkboxes, etc.).
11+
//-------------------------------------------------------------------------------------------
12+
//BUTTONS
13+
overviewTab = Selector('[data-testid=analytics-tab-ClusterDetails]');
14+
// COMPONENTS
15+
clusterDetailsUptime = Selector('[data-testid=cluster-details-uptime]');
16+
//TABLE COMPONENTS
17+
tableHeaderCell = Selector('[data-test-subj^=tableHeaderCell]');
18+
primaryNodesTable = Selector('[data-testid=primary-nodes-table]');
19+
tableRow = Selector('tr[class=euiTableRow]');
20+
connectedClientsValue = Selector('[data-testid^=connectedClients-value]');
21+
totalKeysValue = Selector('[data-testid^=totalKeys-value]');
22+
networkInputValue = Selector('[data-testid^=networkInKbps-value]');
23+
networkOutputValue = Selector('[data-testid^=networkOutKbps-value]');
24+
25+
/**
26+
* Get Primary nodes count in table
27+
*/
28+
async getPrimaryNodesCount(): Promise<number> {
29+
return await this.primaryNodesTable.find(this.cssTableRow).count;
30+
}
31+
32+
/**
33+
* Get total value from all rows in column
34+
* @param column The column name
35+
*/
36+
async getTotalValueByColumnName(column: string): Promise<number> {
37+
let totalNumber = 0;
38+
let columnInSelector = '';
39+
switch (column) {
40+
case 'Commands/s':
41+
columnInSelector = 'opsPerSecond';
42+
break;
43+
case 'Clients':
44+
columnInSelector = 'connectedClients';
45+
break;
46+
case 'Total Keys':
47+
columnInSelector = 'totalKeys';
48+
break;
49+
case 'Network Input':
50+
columnInSelector = 'networkInKbps';
51+
break;
52+
case 'Network Output':
53+
columnInSelector = 'networkOutKbps';
54+
break;
55+
case 'Total Memory':
56+
columnInSelector = 'usedMemory';
57+
break;
58+
default: columnInSelector = '';
59+
}
60+
const rowSelector = Selector(`[data-testid^=${columnInSelector}-value]`);
61+
for (let i = 0; i < await rowSelector.count; i++) {
62+
totalNumber += Number(await rowSelector.nth(i).textContent);
63+
}
64+
return totalNumber;
65+
}
66+
}

tests/e2e/pageObjects/slow-log-page.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export class SlowLogPage {
1010
//CSS Selectors
1111
cssSelectorDurationValue = '[data-testid=duration-value]';
1212
//BUTTONS
13-
slowLogPageButton = Selector('[data-testid=slowlog-page-btn]');
1413
slowLogSortByTimestamp = Selector('[data-testid=header-sorting-button]');
1514
slowLogNumberOfCommandsDropdown = Selector('[data-testid=count-select]');
1615
slowLogConfigureButton = Selector('[data-testid=configure-btn]');
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { Selector } from 'testcafe';
2+
import { MyRedisDatabasePage, CliPage, OverviewPage, WorkbenchPage } from '../../../pageObjects';
3+
import { rte } from '../../../helpers/constants';
4+
import { acceptLicenseTermsAndAddOSSClusterDatabase } from '../../../helpers/database';
5+
import { commonUrl, ossClusterConfig } from '../../../helpers/conf';
6+
import { deleteOSSClusterDatabaseApi, getClusterNodesApi } from '../../../helpers/api/api-database';
7+
import { Common } from '../../../helpers/common';
8+
9+
const overviewPage = new OverviewPage();
10+
const myRedisDatabasePage = new MyRedisDatabasePage();
11+
const common = new Common();
12+
const cliPage = new CliPage();
13+
const workbenchPage = new WorkbenchPage();
14+
15+
const headerColumns = {
16+
'Type': 'OSS Cluster',
17+
'Version': '7.0.0',
18+
'User': 'Default'
19+
};
20+
const keyName = common.generateWord(10);
21+
const commandToAddKey = `set ${keyName} test`;
22+
23+
fixture `Overview`
24+
.meta({ type: 'critical_path', rte: rte.ossCluster })
25+
.page(commonUrl)
26+
.beforeEach(async t => {
27+
await acceptLicenseTermsAndAddOSSClusterDatabase(ossClusterConfig, ossClusterConfig.ossClusterDatabaseName);
28+
// Go to Analysis Tools page
29+
await t.click(myRedisDatabasePage.analysisPageButton);
30+
})
31+
.afterEach(async() => {
32+
await deleteOSSClusterDatabaseApi(ossClusterConfig);
33+
});
34+
test('Overview tab header for OSS Cluster', async t => {
35+
const uptime = /[1-9][0-9]\s|[0-9]\smin|[1-9][0-9]\smin|[0-9]\sh/;
36+
// Verify that user see "Overview" tab by default for OSS Cluster
37+
await t.expect(overviewPage.overviewTab.withAttribute('aria-selected', 'true').exists).ok('The Overview tab not opened');
38+
// Verify that user see "Overview" header with OSS Cluster info
39+
for (const key in headerColumns) {
40+
const columnSelector = Selector(`[data-testid=cluster-details-item-${key}]`);
41+
await t.expect(columnSelector.textContent).contains(`${headerColumns[key]}`, `Cluster detail ${key} is incorrect`);
42+
}
43+
// Verify that Uptime is displayed as time in seconds or minutes from start
44+
await t.expect(overviewPage.clusterDetailsUptime.textContent).match(uptime, 'Uptime value is not correct');
45+
});
46+
test
47+
.after(async() => {
48+
//Clear database and delete
49+
await cliPage.sendCommandInCli(`DEL ${keyName}`);
50+
await cliPage.sendCommandInCli('FT.DROPINDEX idx:schools DD');
51+
await deleteOSSClusterDatabaseApi(ossClusterConfig);
52+
})('Primary node statistics table displaying', async t => {
53+
// Remember initial table values
54+
const initialValues: number[] = [];
55+
const nodes = (await getClusterNodesApi(ossClusterConfig)).sort();
56+
const columns = ['Commands/s', 'Clients', 'Total Keys', 'Network Input', 'Network Output', 'Total Memory'];
57+
for (const column in columns) {
58+
initialValues.push(await overviewPage.getTotalValueByColumnName(column));
59+
}
60+
const nodesNumberInHeader = parseInt((await overviewPage.tableHeaderCell.nth(0).textContent).match(/\d+/)![0]);
61+
62+
// Add key from CLI
63+
await t.click(cliPage.cliExpandButton);
64+
await t.typeText(cliPage.cliCommandInput, commandToAddKey);
65+
await t.pressKey('enter');
66+
await t.click(cliPage.cliCollapseButton);
67+
// Verify nodes in header column equal to rows
68+
await t.expect(await overviewPage.getPrimaryNodesCount()).eql(nodesNumberInHeader, 'Primary nodes in table are not displayed');
69+
// Verify that all nodes from BE response are displayed in table
70+
for (const node of nodes) {
71+
await t.expect(overviewPage.tableRow.nth(nodes.indexOf(node)).textContent).contains(node, `Node ${node} is not displayed in table`);
72+
}
73+
// Go to Workbench page
74+
await t.click(myRedisDatabasePage.workbenchButton);
75+
//Run Create hash index command to load network and memory
76+
await t.click(workbenchPage.documentButtonInQuickGuides);
77+
await t.click(workbenchPage.internalLinkWorkingWithHashes);
78+
await t.click(workbenchPage.preselectCreateHashIndex);
79+
await t.click(workbenchPage.submitCommandButton);
80+
// Go to Analysis Tools page
81+
await t.click(myRedisDatabasePage.analysisPageButton);
82+
// Verify that values in table are dynamic
83+
for (const column in columns) {
84+
await t.expect(await overviewPage.getTotalValueByColumnName(column)).notEql(initialValues[columns.indexOf(column)], `${column} not dynamic`);
85+
}
86+
});

tests/e2e/tests/critical-path/slow-log/slow-log.e2e.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SlowLogPage, MyRedisDatabasePage, BrowserPage, CliPage } from '../../../pageObjects';
1+
import { SlowLogPage, MyRedisDatabasePage, BrowserPage, CliPage, OverviewPage } from '../../../pageObjects';
22
import { rte } from '../../../helpers/constants';
33
import { acceptLicenseTermsAndAddDatabaseApi } from '../../../helpers/database';
44
import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf';
@@ -8,6 +8,7 @@ const slowLogPage = new SlowLogPage();
88
const myRedisDatabasePage = new MyRedisDatabasePage();
99
const browserPage = new BrowserPage();
1010
const cliPage = new CliPage();
11+
const overviewPage = new OverviewPage();
1112
const slowerThanParameter = 1;
1213
let maxCommandLength = 50;
1314
let command = `slowlog get ${maxCommandLength}`;
@@ -17,13 +18,15 @@ fixture `Slow Log`
1718
.page(commonUrl)
1819
.beforeEach(async t => {
1920
await acceptLicenseTermsAndAddDatabaseApi(ossStandaloneBigConfig, ossStandaloneBigConfig.databaseName);
20-
await t.click(slowLogPage.slowLogPageButton);
21+
await t.click(myRedisDatabasePage.analysisPageButton);
2122
})
2223
.afterEach(async() => {
2324
await slowLogPage.resetToDefaultConfig();
2425
await deleteStandaloneDatabaseApi(ossStandaloneBigConfig);
2526
});
2627
test('Verify that user can open new Slow Log page using new icon on left app panel', async t => {
28+
// Verify that user see "Slow Log" page by default for non OSS Cluster
29+
await t.expect(overviewPage.overviewTab.withAttribute('aria-selected', 'true').exists).notOk('The Overview tab is displayed for non OSS Cluster db');
2730
// Verify that user can configure slowlog-max-len for Slow Log and see whole set of commands according to the setting
2831
await slowLogPage.changeSlowerThanParameter(slowerThanParameter);
2932
await cliPage.sendCommandInCli(command);
@@ -49,7 +52,7 @@ test('Verify that user can see "No Slow Logs found" message when slowlog-max-len
4952
// Go to Browser page to scan keys and turn back
5053
await t.click(myRedisDatabasePage.browserButton);
5154
await t.click(browserPage.refreshKeysButton);
52-
await t.click(slowLogPage.slowLogPageButton);
55+
await t.click(myRedisDatabasePage.analysisPageButton);
5356
// Compare number of logged commands with maxLength
5457
await t.expect(slowLogPage.slowLogCommandStatistics.withText(`${maxCommandLength} entries`).exists).ok('Number of displayed commands is less than ');
5558
});
@@ -73,7 +76,7 @@ test('Verify that users can specify number of commands that they want to display
7376
// Go to Browser page to scan keys and turn back
7477
await t.click(myRedisDatabasePage.browserButton);
7578
await t.click(browserPage.refreshKeysButton);
76-
await t.click(slowLogPage.slowLogPageButton);
79+
await t.click(myRedisDatabasePage.analysisPageButton);
7780
for (let i = 0; i < numberOfCommandsArray.length; i++) {
7881
await slowLogPage.changeDisplayUpToParameter(numberOfCommandsArray[i]);
7982
if (i === numberOfCommandsArray.length - 1) {

0 commit comments

Comments
 (0)