Skip to content

Commit 32dfd9a

Browse files
committed
add desktop tests from web
1 parent 4b7376f commit 32dfd9a

File tree

19 files changed

+1242
-110
lines changed

19 files changed

+1242
-110
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage } from '../../../../pageObjects';
2+
import { RecommendationIds, rte } from '../../../../helpers/constants';
3+
import { DatabaseHelper } from '../../../../helpers/database';
4+
import {
5+
commonUrl,
6+
ossStandaloneBigConfig,
7+
ossStandaloneV5Config
8+
} from '../../../../helpers/conf';
9+
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
10+
import { RecommendationsActions } from '../../../../common-actions/recommendations-actions';
11+
12+
const memoryEfficiencyPage = new MemoryEfficiencyPage();
13+
const myRedisDatabasePage = new MyRedisDatabasePage();
14+
const browserPage = new BrowserPage();
15+
const recommendationsActions = new RecommendationsActions();
16+
const databaseHelper = new DatabaseHelper();
17+
const databaseAPIRequests = new DatabaseAPIRequests();
18+
19+
const luaScriptRecommendation = RecommendationIds.luaScript;
20+
const useSmallerKeysRecommendation = RecommendationIds.useSmallerKeys;
21+
const redisVersionRecommendation = RecommendationIds.redisVersion;
22+
23+
fixture `Database Analysis Recommendations`
24+
.meta({ type: 'critical_path', rte: rte.standalone })
25+
.page(commonUrl);
26+
test
27+
.before(async t => {
28+
await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneBigConfig);
29+
// Go to Analysis Tools page
30+
await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton);
31+
// Add cached scripts and generate new report
32+
await memoryEfficiencyPage.Cli.addCachedScripts(11);
33+
await t.click(memoryEfficiencyPage.newReportBtn);
34+
// Go to Recommendations tab
35+
await t.click(memoryEfficiencyPage.recommendationsTab);
36+
})
37+
.after(async() => {
38+
await browserPage.Cli.sendCommandInCli('SCRIPT FLUSH');
39+
await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneBigConfig);
40+
})('Recommendations displaying', async t => {
41+
await t.click(memoryEfficiencyPage.newReportBtn);
42+
// Verify that user can see Avoid dynamic Lua script recommendation when number_of_cached_scripts> 10
43+
await t.expect(await memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).exists)
44+
.ok('Avoid dynamic lua script recommendation not displayed');
45+
// Verify that user can see type of recommendation badge
46+
await t.expect(memoryEfficiencyPage.getRecommendationLabelByName(luaScriptRecommendation, 'code').exists)
47+
.ok('Avoid dynamic lua script recommendation not have Code Changes label');
48+
await t.expect(memoryEfficiencyPage.getRecommendationLabelByName(luaScriptRecommendation, 'configuration').exists)
49+
.notOk('Avoid dynamic lua script recommendation have Configuration Changes label');
50+
51+
// Verify that user can see Use smaller keys recommendation when database has 1M+ keys
52+
await t.expect(await memoryEfficiencyPage.getRecommendationByName(useSmallerKeysRecommendation).exists).ok('Use smaller keys recommendation not displayed');
53+
54+
// Verify that user can see all the recommendations expanded by default
55+
await t.expect(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation).getAttribute('aria-expanded'))
56+
.eql('true', 'Avoid dynamic lua script recommendation not expanded');
57+
await t.expect(memoryEfficiencyPage.getRecommendationButtonByName(useSmallerKeysRecommendation).getAttribute('aria-expanded'))
58+
.eql('true', 'Use smaller keys recommendation not expanded');
59+
60+
// Verify that user can expand/collapse recommendation
61+
const expandedTextContaiterSize = await memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight;
62+
await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation));
63+
await t.expect(memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight)
64+
.lt(expandedTextContaiterSize, 'Lua script recommendation not collapsed');
65+
await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation));
66+
await t.expect(memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight)
67+
.eql(expandedTextContaiterSize, 'Lua script recommendation not expanded');
68+
});
69+
test
70+
.before(async t => {
71+
await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config);
72+
// Go to Analysis Tools page and create new report and open recommendations
73+
await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton);
74+
await t.click(memoryEfficiencyPage.newReportBtn);
75+
await t.click(memoryEfficiencyPage.recommendationsTab);
76+
}).after(async() => {
77+
await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config);
78+
})('Verify that user can upvote recommendations', async t => {
79+
const notUsefulVoteOption = 'not useful';
80+
const usefulVoteOption = 'useful';
81+
await recommendationsActions.voteForRecommendation(redisVersionRecommendation, notUsefulVoteOption);
82+
// Verify that user can rate recommendations with one of 2 existing types at the same time
83+
await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, notUsefulVoteOption);
84+
85+
// Verify that user can see the popup with link when he votes for “Not useful”
86+
await recommendationsActions.verifyVotePopUpIsDisplayed(redisVersionRecommendation, notUsefulVoteOption);
87+
88+
// Verify that user can see previous votes when reload the page
89+
await memoryEfficiencyPage.reloadPage();
90+
await t.click(memoryEfficiencyPage.recommendationsTab);
91+
await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, notUsefulVoteOption);
92+
93+
await t.click(memoryEfficiencyPage.newReportBtn);
94+
await recommendationsActions.voteForRecommendation(redisVersionRecommendation, usefulVoteOption);
95+
await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, usefulVoteOption);
96+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { KeyTypesTexts, rte } from '../../../../helpers/constants';
2+
import { DatabaseHelper } from '../../../../helpers/database';
3+
import { BrowserPage } from '../../../../pageObjects';
4+
import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf';
5+
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
6+
import { Common } from '../../../../helpers/common';
7+
import { deleteAllKeysFromDB } from '../../../../helpers/keys';
8+
9+
const browserPage = new BrowserPage();
10+
const databaseHelper = new DatabaseHelper();
11+
const databaseAPIRequests = new DatabaseAPIRequests();
12+
13+
const keyNames = [Common.generateWord(20), Common.generateWord(20)];
14+
const dbParameters = { host: ossStandaloneRedisearch.host, port: ossStandaloneRedisearch.port };
15+
16+
fixture `Bulk Delete`
17+
.meta({ type: 'critical_path', rte: rte.standalone })
18+
.page(commonUrl)
19+
.beforeEach(async t => {
20+
await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch);
21+
await browserPage.addHashKey(keyNames[0], '100000', Common.generateWord(20), Common.generateWord(20));
22+
await browserPage.addSetKey(keyNames[1], '100000', Common.generateWord(20));
23+
if (await browserPage.Toast.toastCloseButton.exists) {
24+
await t.click(browserPage.Toast.toastCloseButton);
25+
}
26+
})
27+
.afterEach(async() => {
28+
// Clear and delete database
29+
await deleteAllKeysFromDB(dbParameters.host, dbParameters.port);
30+
await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch);
31+
});
32+
test('Verify that when bulk deletion is completed, status Action completed is displayed', async t => {
33+
// Filter by Hash keys
34+
await browserPage.selectFilterGroupType(KeyTypesTexts.Hash);
35+
await t.click(browserPage.bulkActionsButton);
36+
await browserPage.BulkActions.startBulkDelete();
37+
await t.expect(browserPage.BulkActions.bulkStatusCompleted.exists).ok('Bulk deletion not completed', { timeout: 15000 });
38+
await t.expect(browserPage.BulkActions.bulkStatusCompleted.textContent).eql('Action completed', 'Action completed text is not visible');
39+
// Verify that when bulk deletion is completed, button Delete changes to Start New
40+
await t.expect(browserPage.BulkActions.bulkStartAgainButton.exists).ok('"Start New" button not displayed');
41+
// Verify that user can click on Start New and existed filter will be applied
42+
await t.click(browserPage.BulkActions.bulkStartAgainButton);
43+
await t.expect(browserPage.BulkActions.bulkDeleteSummary.innerText).contains('Scanned 100% (2/2) and found 1 keys', 'Bulk delete summary is not correct');
44+
});
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import * as path from 'path';
2+
import { t } from 'testcafe';
3+
import { rte } from '../../../../helpers/constants';
4+
import { DatabaseHelper } from '../../../../helpers/database';
5+
import { BrowserPage } from '../../../../pageObjects';
6+
import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf';
7+
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
8+
import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../../helpers/keys';
9+
10+
const browserPage = new BrowserPage();
11+
const databaseHelper = new DatabaseHelper();
12+
const databaseAPIRequests = new DatabaseAPIRequests();
13+
14+
const dbParameters = { host: ossStandaloneRedisearch.host, port: ossStandaloneRedisearch.port };
15+
const filesToUpload = ['bulkUplAllKeyTypes.txt', 'bigKeysData.rtf'];
16+
const filePathes = {
17+
allKeysFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[0]),
18+
bigDataFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[1])
19+
};
20+
const keyNames = ['hashkey1', 'listkey1', 'setkey1', 'zsetkey1', 'stringkey1', 'jsonkey1', 'streamkey1', 'graphkey1', 'tskey1'];
21+
const verifyCompletedResultText = async(resultsText: string[]): Promise<void> => {
22+
for (const result of resultsText) {
23+
await t.expect(browserPage.BulkActions.bulkUploadCompletedSummary.textContent).contains(result, 'Bulk upload completed summary not correct');
24+
}
25+
await t.expect(browserPage.BulkActions.bulkUploadCompletedSummary.textContent).notContains('0:00:00.000', 'Bulk upload Time taken not correct');
26+
};
27+
28+
fixture `Bulk Upload`
29+
.meta({ type: 'critical_path', rte: rte.standalone })
30+
.page(commonUrl)
31+
.beforeEach(async() => {
32+
await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch);
33+
})
34+
.afterEach(async() => {
35+
// Clear and delete database
36+
await deleteAllKeysFromDB(dbParameters.host, dbParameters.port);
37+
await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch);
38+
});
39+
test('Verify bulk upload of different text docs formats', async t => {
40+
// Verify bulk upload for electron app version
41+
const allKeysResults = ['9Commands Processed', '9Success', '0Errors'];
42+
const bigKeysResults = ['10 000Commands Processed', '10 000Success', '0Errors'];
43+
const defaultText = 'Select or drag and drop a file';
44+
45+
// Open bulk actions
46+
await t.click(browserPage.bulkActionsButton);
47+
// Open bulk upload tab
48+
await t.click(browserPage.BulkActions.bulkUpdateTab);
49+
// Verify that Upload button disabled by default
50+
await t.expect(browserPage.BulkActions.actionButton.hasAttribute('disabled')).ok('Upload button enabled without added file');
51+
52+
// Verify that keys of all types can be uploaded
53+
await browserPage.BulkActions.uploadFileInBulk(filePathes.allKeysFile);
54+
await verifyCompletedResultText(allKeysResults);
55+
await browserPage.searchByKeyName('*key1');
56+
await verifyKeysDisplayedInTheList(keyNames);
57+
58+
// Verify that Upload button disabled after starting new upload
59+
await t.click(browserPage.BulkActions.bulkActionStartNewButton);
60+
await t.expect(browserPage.BulkActions.actionButton.hasAttribute('disabled')).ok('Upload button enabled without added file');
61+
62+
// Verify that user can remove uploaded file
63+
await t.setFilesToUpload(browserPage.BulkActions.bulkUploadInput, [filePathes.bigDataFile]);
64+
// update after resolving testcafe Native Automation mode limitations
65+
// await t.expect(browserPage.BulkActions.bulkUploadContainer.textContent).contains(filesToUpload[1], 'Filename not displayed in upload input');
66+
await t.click(browserPage.BulkActions.removeFileBtn);
67+
await t.expect(browserPage.BulkActions.bulkUploadContainer.textContent).contains(defaultText, 'File not removed from upload input');
68+
69+
// Verify that user can upload 10000 keys
70+
await browserPage.BulkActions.uploadFileInBulk(filePathes.bigDataFile);
71+
await verifyCompletedResultText(bigKeysResults);
72+
});
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { rte } from '../../../../helpers/constants';
2+
import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects';
3+
import { commonUrl, ossStandaloneForSSHConfig } from '../../../../helpers/conf';
4+
import { DatabaseHelper } from '../../../../helpers/database';
5+
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
6+
import { sshPrivateKey, sshPrivateKeyWithPasscode } from '../../../../test-data/sshPrivateKeys';
7+
import { Common } from '../../../../helpers/common';
8+
// import { BrowserActions } from '../../../common-actions/browser-actions';
9+
10+
const myRedisDatabasePage = new MyRedisDatabasePage();
11+
const browserPage = new BrowserPage();
12+
const databaseHelper = new DatabaseHelper();
13+
const databaseAPIRequests = new DatabaseAPIRequests();
14+
// const browserActions = new BrowserActions();
15+
16+
const sshParams = {
17+
sshHost: '172.31.100.245',
18+
sshPort: '2222',
19+
sshUsername: 'u'
20+
};
21+
const newClonedDatabaseAlias = 'Cloned ssh database';
22+
const sshDbPass = {
23+
...ossStandaloneForSSHConfig,
24+
databaseName: `SSH_${Common.generateWord(5)}`
25+
};
26+
const sshDbPrivateKey = {
27+
...ossStandaloneForSSHConfig,
28+
databaseName: `SSH_${Common.generateWord(5)}`
29+
};
30+
const sshDbPasscode = {
31+
...ossStandaloneForSSHConfig,
32+
databaseName: `SSH_${Common.generateWord(5)}`
33+
};
34+
35+
fixture `Adding database with SSH`
36+
.meta({ type: 'critical_path', rte: rte.standalone })
37+
.page(commonUrl)
38+
.beforeEach(async() => {
39+
await databaseHelper.acceptLicenseTerms();
40+
})
41+
.after(async() => {
42+
// Delete databases
43+
await databaseAPIRequests.deleteStandaloneDatabasesByNamesApi([sshDbPass.databaseName, sshDbPrivateKey.databaseName, sshDbPasscode.databaseName, newClonedDatabaseAlias]);
44+
});
45+
test('Adding database with SSH', async t => {
46+
const sshWithPass = {
47+
...sshParams,
48+
sshPassword: 'pass'
49+
};
50+
const sshWithPrivateKey = {
51+
...sshParams,
52+
sshPrivateKey: sshPrivateKey
53+
};
54+
const sshWithPassphrase = {
55+
...sshParams,
56+
sshPrivateKey: sshPrivateKeyWithPasscode,
57+
sshPassphrase: 'test'
58+
};
59+
// update after resolving testcafe Native Automation mode limitations
60+
// // Verify that if user have not entered any required value he can see that this field should be specified when hover over the button to add a database
61+
// await t
62+
// .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseButton)
63+
// .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually)
64+
// .click(myRedisDatabasePage.AddRedisDatabase.useSSHCheckbox)
65+
// .click(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyRadioBtn)
66+
// .hover(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton);
67+
// for (const text of tooltipText) {
68+
// await browserActions.verifyTooltipContainsText(text, true);
69+
// }
70+
// // Verify that user can see the Test Connection button enabled/disabled with the same rules as the button to add/apply the changes
71+
// await t.hover(myRedisDatabasePage.AddRedisDatabase.testConnectionBtn);
72+
// for (const text of tooltipText) {
73+
// await browserActions.verifyTooltipContainsText(text, true);
74+
// }
75+
76+
// Verify that user can add SSH tunnel with Password for Standalone database
77+
// await t.click(myRedisDatabasePage.AddRedisDatabase.cancelButton);
78+
await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPass, sshWithPass);
79+
await myRedisDatabasePage.clickOnDBByName(sshDbPass.databaseName);
80+
await Common.checkURLContainsText('browser');
81+
82+
// Verify that user can add SSH tunnel with Private Key
83+
await t.click(browserPage.OverviewPanel.myRedisDBLink);
84+
await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPrivateKey, sshWithPrivateKey);
85+
await myRedisDatabasePage.clickOnDBByName(sshDbPrivateKey.databaseName);
86+
await Common.checkURLContainsText('browser');
87+
88+
// Verify that user can edit SSH parameters for existing database connections
89+
await t.click(browserPage.OverviewPanel.myRedisDBLink);
90+
await myRedisDatabasePage.clickOnEditDBByName(sshDbPrivateKey.databaseName);
91+
await t
92+
.typeText(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyInput, sshWithPassphrase.sshPrivateKey, { replace: true, paste: true })
93+
.typeText(myRedisDatabasePage.AddRedisDatabase.sshPassphraseInput, sshWithPassphrase.sshPassphrase, { replace: true, paste: true });
94+
await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton);
95+
await t.expect(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton.exists).notOk('Edit database panel still displayed');
96+
await databaseHelper.clickOnEditDatabaseByName(sshDbPrivateKey.databaseName);
97+
await t
98+
.expect(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyInput.value).eql(sshWithPassphrase.sshPrivateKey, 'Edited Private key not saved')
99+
.expect(myRedisDatabasePage.AddRedisDatabase.sshPassphraseInput.value).eql(sshWithPassphrase.sshPassphrase, 'Edited Passphrase not saved');
100+
101+
// Verify that user can clone database with SSH tunnel
102+
await databaseHelper.clickOnEditDatabaseByName(sshDbPrivateKey.databaseName);
103+
await t.click(myRedisDatabasePage.AddRedisDatabase.cloneDatabaseButton);
104+
// Edit Database alias before cloning
105+
await t.typeText(myRedisDatabasePage.AddRedisDatabase.databaseAliasInput, newClonedDatabaseAlias, { replace: true });
106+
await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton);
107+
await t.expect(myRedisDatabasePage.dbNameList.withExactText(newClonedDatabaseAlias).exists).ok('DB with SSH was not cloned');
108+
109+
// Verify that user can add SSH tunnel with Passcode
110+
await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPasscode, sshWithPassphrase);
111+
await myRedisDatabasePage.clickOnDBByName(sshDbPasscode.databaseName);
112+
await Common.checkURLContainsText('browser');
113+
});

0 commit comments

Comments
 (0)