diff --git a/.circleci/config.yml b/.circleci/config.yml index 18809756aa..bd92bfc42f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -372,7 +372,7 @@ jobs: - run: name: .AppImage tests command: | - cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. + cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/electron/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. .circleci/e2e/test.app-image.sh - when: condition: @@ -409,7 +409,7 @@ jobs: - run: choco install nodejs --version=18.15.0 - run: command: | - cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. + cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/electron/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. .circleci/e2e/test.exe.cmd shell: bash.exe - when: @@ -460,7 +460,7 @@ jobs: - run: name: Run tests command: | - cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. + cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/web/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. TEST_BIG_DB_DUMP=$TEST_BIG_DB_DUMP \ docker-compose \ -f tests/e2e/rte.docker-compose.yml \ @@ -474,7 +474,7 @@ jobs: - run: name: Run tests command: | - cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. + cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/web/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../.. TEST_BIG_DB_DUMP=$TEST_BIG_DB_DUMP \ docker-compose \ -f tests/e2e/rte.docker-compose.yml \ @@ -1208,6 +1208,18 @@ workflows: requires: - itest-code # E2E tests + - setup-sign-certificates: + name: Setup sign certificates (stage) + requires: + - Start All Tests + - setup-build: + name: Setup build (stage) + requires: + - Setup sign certificates (stage) + - linux: + name: Build app - Linux (stage) + requires: + - Setup build (stage) - docker: name: Build docker image requires: @@ -1218,6 +1230,11 @@ workflows: parallelism: 4 requires: - Build docker image + - e2e-app-image: + name: E2ETest (AppImage) + parallelism: 2 + requires: + - Build app - Linux (stage) # Approve to build - approve: name: Build App diff --git a/tests/e2e/desktop.runner.ts b/tests/e2e/desktop.runner.ts index 1b50d133b7..11444f3694 100644 --- a/tests/e2e/desktop.runner.ts +++ b/tests/e2e/desktop.runner.ts @@ -10,13 +10,10 @@ import testcafe from 'testcafe'; configPath: 'tsconfig.testcafe.json', experimentalDecorators: true }}) - .src((process.env.TEST_FILES || 'tests/**/*.e2e.ts').split('\n')) + .src((process.env.TEST_FILES || 'tests/electron/**/*.e2e.ts').split('\n')) .browsers(['electron']) - .filter((_testName, _fixtureName, _fixturePath, testMeta): boolean => { - return testMeta.env == 'desktop' - }) .screenshots({ - path: 'report/screenshots/', + path: './report/screenshots/', takeOnFails: true, pathPattern: '${USERAGENT}/${DATE}_${TIME}/${FIXTURE}_${TEST}_${FILE_INDEX}.png', }) diff --git a/tests/e2e/desktop.runner.win.ts b/tests/e2e/desktop.runner.win.ts index 2e4aa87e04..20ec80beb1 100644 --- a/tests/e2e/desktop.runner.win.ts +++ b/tests/e2e/desktop.runner.win.ts @@ -10,11 +10,8 @@ import testcafe from 'testcafe'; configPath: 'tsconfig.testcafe.json', experimentalDecorators: true }}) - .src((process.env.TEST_FILES || 'tests/**/*.e2e.ts').split('\n')) + .src((process.env.TEST_FILES || 'tests/electron/**/*.e2e.ts').split('\n')) .browsers(['electron']) - .filter((_testName, _fixtureName, _fixturePath, testMeta): boolean => { - return testMeta.env == 'desktop' && testMeta.rte === 'standalone'; - }) .screenshots({ path: 'report/screenshots/', takeOnFails: true, diff --git a/tests/e2e/tests/critical-path/database/modules.e2e.ts b/tests/e2e/tests/critical-path/database/modules.e2e.ts deleted file mode 100644 index 4e5dab8945..0000000000 --- a/tests/e2e/tests/critical-path/database/modules.e2e.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Chance } from 'chance'; -import { Selector } from 'testcafe'; -import { rte, env } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const browserPage = new BrowserPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); -const chance = new Chance(); - -const moduleNameList = ['RediSearch', 'RedisJSON', 'RedisGraph', 'RedisTimeSeries', 'RedisBloom', 'RedisGears', 'RedisAI']; -const moduleList = [myRedisDatabasePage.moduleSearchIcon, myRedisDatabasePage.moduleJSONIcon, myRedisDatabasePage.moduleGraphIcon, myRedisDatabasePage.moduleTimeseriesIcon, myRedisDatabasePage.moduleBloomIcon, myRedisDatabasePage.moduleGearsIcon, myRedisDatabasePage.moduleAIIcon]; -const uniqueId = chance.string({ length: 10 }); -let database = { - ...ossStandaloneRedisearch, - databaseName: `test_standalone-redisearch-${uniqueId}` -}; - -fixture `Database modules` - .meta({ type: 'critical_path' }) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTerms(); - database = { - ...ossStandaloneRedisearch, - databaseName: `test_standalone-redisearch-${uniqueId}` - }; - await databaseAPIRequests.addNewStandaloneDatabaseApi(database); - // Reload Page - await browserPage.reloadPage(); - }) - .afterEach(async() => { - // Delete database - await databaseAPIRequests.deleteStandaloneDatabaseApi(database); - }); -test - .meta({ rte: rte.standalone, env: env.web })('Verify that user can see DB modules on DB list page for Standalone DB', async t => { - // Check module column on DB list page - await t.expect(myRedisDatabasePage.moduleColumn.exists).ok('Module column not found'); - // Verify that user can see the following sorting order: Search, JSON, Graph, TimeSeries, Bloom, Gears, AI for modules - const databaseLine = myRedisDatabasePage.dbNameList.withExactText(database.databaseName).parent('tr'); - await t.expect(databaseLine.visible).ok('Database not found in db list'); - const moduleIcons = databaseLine.find('[data-testid^=Redi]'); - const numberOfIcons = await moduleIcons.count; - for (let i = 0; i < numberOfIcons; i++) { - const moduleName = await moduleIcons.nth(i).getAttribute('data-testid'); - const expectedName = await moduleList[i].getAttribute('data-testid'); - await t.expect(moduleName).eql(expectedName, `${moduleName} icon not found`); - } - //Minimize the window to check quantifier - await t.resizeWindow(1000, 700); - //Verify that user can see +N icon (where N>1) on DB list page when modules icons don't fit the Module column width - await t.expect(myRedisDatabasePage.moduleQuantifier.textContent).eql('+3'); - await t.expect(myRedisDatabasePage.moduleQuantifier.exists).ok('Quantifier icon not found'); - //Verify that user can hover over the module icons and see tooltip with all modules name - await t.hover(myRedisDatabasePage.moduleQuantifier); - await t.expect(myRedisDatabasePage.moduleTooltip.visible).ok('Module tooltip not found'); - //Verify that user can hover over the module icons and see tooltip with version. - await myRedisDatabasePage.checkModulesInTooltip(moduleNameList); - }); -test - .meta({ rte: rte.standalone })('Verify that user can see full module list in the Edit mode', async t => { - // Verify that module column is displayed - await t.expect(myRedisDatabasePage.moduleColumn.visible).ok('Module column not found'); - // Open Edit mode - await t.click(myRedisDatabasePage.editDatabaseButton); - // Verify that module column is not displayed - await t.expect(myRedisDatabasePage.moduleColumn.exists).notOk('Module column not found'); - // Verify modules in Edit mode - await myRedisDatabasePage.checkModulesOnPage(moduleList); - }); -test - .meta({ rte: rte.standalone })('Verify that user can see icons in DB header for RediSearch, RedisGraph, RedisJSON, RedisBloom, RedisTimeSeries, RedisGears, RedisAI default modules', async t => { - // Connect to DB - await myRedisDatabasePage.clickOnDBByName(database.databaseName); - // Check all available modules in overview - const moduleIcons = Selector('div').find('[data-testid^=Redi]'); - const numberOfIcons = await moduleIcons.count; - for (let i = 0; i < numberOfIcons; i++) { - const moduleName = await moduleIcons.nth(i).getAttribute('data-testid'); - await t.expect(moduleName).eql(await moduleList[i].getAttribute('data-testid'), 'Correct icon not found'); - } - // Verify that if DB has more than 6 modules loaded, user can click on three dots and see other modules in the tooltip - await t.click(browserPage.OverviewPanel.overviewMoreInfo); - for (let j = numberOfIcons; j < moduleNameList.length; j++) { - await t.expect(browserPage.OverviewPanel.overviewTooltip.withText(moduleNameList[j]).visible).ok('Tooltip module not found'); - } - }); diff --git a/tests/e2e/tests/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts b/tests/e2e/tests/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts deleted file mode 100644 index f3f24abe07..0000000000 --- a/tests/e2e/tests/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as fs from 'fs'; -import { Chance } from 'chance'; -import * as editJsonFile from 'edit-json-file'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, workingDirectory } from '../../../helpers/conf'; -import { env } from '../../../helpers/constants'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const databaseHelper = new DatabaseHelper(); -const chance = new Chance(); - -if (fs.existsSync(workingDirectory)) { - const timestampPromoButtonPath = `${workingDirectory}/content/build.json`; - const contentPromoButtonPath = `${workingDirectory}/content/create-redis.json`; - const timestampPromoButtonFile = editJsonFile(timestampPromoButtonPath); - const contentPromoButtonFile = editJsonFile(contentPromoButtonPath); - const timestampBeforeUpdate = timestampPromoButtonFile.get('timestamp'); - const newTimestamp = timestampBeforeUpdate - 1; - const newPromoButtonText = chance.word({ length: 10 }); - - //Edit json file values - contentPromoButtonFile.set('cloud.title', newPromoButtonText); - contentPromoButtonFile.set('cloud.description', newPromoButtonText); - contentPromoButtonFile.save(); - timestampPromoButtonFile.set('timestamp', newTimestamp); - timestampPromoButtonFile.save(); - - fixture `Auto-update in Promo Button` - .meta({type: 'critical_path'}) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTerms(); - }); - test - .meta({ env: env.desktop })('Verify that user has the ability to update "Create free database" button without changing the app', async t => { - // Create new file paths due to cache-ability - const timestampPathNew = editJsonFile(timestampPromoButtonPath); - const contentPathNew = editJsonFile(contentPromoButtonPath); - // Check the promo button after the opening of app - await t.expect(myRedisDatabasePage.promoButton.textContent).notContains(newPromoButtonText, 'Promo button text is not updated'); - // Get the values from build.json and create-redis.json files - const actualTimestamp = await timestampPathNew.get('timestamp'); - const actualPromoButtonTitle = await contentPathNew.get('cloud.title'); - const actualPromoButtonDescription = await contentPathNew.get('cloud.description'); - // Check the json files are automatically updated - await t.expect(actualPromoButtonTitle).notEql(newPromoButtonText, 'The cloud title in the create-redis.json file is automatically updated'); - await t.expect(actualPromoButtonDescription).notEql(newPromoButtonText, 'The cloud description in the create-redis.json file is automatically updated'); - await t.expect(actualTimestamp).notEql(newTimestamp, 'The timestamp in the build.json file is automatically updated'); - }); -} diff --git a/tests/e2e/tests/critical-path/monitor/monitor.e2e.ts b/tests/e2e/tests/critical-path/monitor/monitor.e2e.ts deleted file mode 100644 index f1fb6746fd..0000000000 --- a/tests/e2e/tests/critical-path/monitor/monitor.e2e.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { - MyRedisDatabasePage, - WorkbenchPage, - BrowserPage -} from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const browserPage = new BrowserPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); -const apiKeyRequests = new APIKeyRequests(); - -const keyName = `${Common.generateWord(20)}-key`; -const keyValue = `${Common.generateWord(10)}-value`; - -fixture `Monitor` - .meta({ type: 'critical_path', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - }); -test - .after(async() => { - await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - })('Verify that user can work with Monitor', async t => { - const command = 'set'; - //Verify that user can open Monitor - await t.click(browserPage.Profiler.expandMonitor); - //Check that monitor is opened - await t.expect(browserPage.Profiler.monitorArea.exists).ok('Profiler area'); - await t.expect(browserPage.Profiler.startMonitorButton.exists).ok('Start profiler button'); - //Verify that user can see message inside Monitor "Running Monitor will decrease throughput, avoid running it in production databases." when opens it for the first time - await t.expect(browserPage.Profiler.monitorWarningMessage.exists).ok('Profiler warning message'); - await t.expect(browserPage.Profiler.monitorWarningMessage.withText('Running Profiler will decrease throughput, avoid running it in production databases.').exists).ok('Profiler warning message is not correct'); - //Verify that user can run Monitor by clicking "Run" command in the message inside Monitor - await t.click(browserPage.Profiler.startMonitorButton); - await t.expect(browserPage.Profiler.monitorIsStartedText.innerText).eql('Profiler is started.'); - //Verify that user can see run commands in monitor - await browserPage.Cli.getSuccessCommandResultFromCli(`${command} ${keyName} ${keyValue}`); - await browserPage.Profiler.checkCommandInMonitorResults(command, [keyName, keyValue]); - }); -test - .after(async t => { - await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - })('Verify that user can see the list of all commands from all clients ran for this Redis database in the list of results in Monitor', async t => { - //Define commands in different clients - const cli_command = 'command'; - const workbench_command = 'hello'; - const common_command = 'info'; - const browser_command = 'hset'; - //Start Monitor - await browserPage.Profiler.startMonitor(); - //Send command in CLI - await browserPage.Cli.getSuccessCommandResultFromCli(cli_command); - //Check that command from CLI is displayed in monitor - await browserPage.Profiler.checkCommandInMonitorResults(cli_command); - //Refresh the page to send command from Browser client - await t.click(browserPage.refreshKeysButton); - //Check the command from browser client - await browserPage.addHashKey(keyName); - await browserPage.Profiler.checkCommandInMonitorResults(browser_command); - //Open Workbench page to create new client - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - //Send command in Workbench - await workbenchPage.sendCommandInWorkbench(workbench_command); - //Check that command from Workbench is displayed in monitor - await workbenchPage.Profiler.checkCommandInMonitorResults(workbench_command); - //Check the command from common client - await workbenchPage.Profiler.checkCommandInMonitorResults(common_command); - }); diff --git a/tests/e2e/tests/critical-path/workbench/index-schema.e2e.ts b/tests/e2e/tests/critical-path/workbench/index-schema.e2e.ts deleted file mode 100644 index 4670726609..0000000000 --- a/tests/e2e/tests/critical-path/workbench/index-schema.e2e.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { rte, env } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -let indexName = Common.generateWord(5); - -fixture `Index Schema at Workbench` - .meta({ type: 'critical_path', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); - // Go to Workbench page - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .afterEach(async t => { - // Drop index, documents and database - await t.switchToMainWindow(); - await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); - }); -test - .meta({ env: env.desktop })('Verify that user can open results in Text and Table views for FT.INFO for Hash in Workbench', async t => { - indexName = Common.generateWord(5); - const commandsForSend = [ - `FT.CREATE ${indexName} ON HASH PREFIX 1 product: SCHEMA name TEXT`, - 'HMSET product:1 name "Apple Juice"' - ]; - const searchCommand = `FT.INFO ${indexName}`; - - // Send commands - await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); - // Send search command - await workbenchPage.sendCommandInWorkbench(searchCommand); - // Check that result is displayed in Table view - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); - // Select Text view type - await t.switchToMainWindow(); - await workbenchPage.selectViewTypeText(); - // Check that result is displayed in Text view - await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); - }); -test - .meta({ env: env.desktop })('Verify that user can open results in Text and Table views for FT.INFO for JSON in Workbench', async t => { - indexName = Common.generateWord(5); - const commandsForSend = [ - `FT.CREATE ${indexName} ON JSON SCHEMA $.user.name AS name TEXT $.user.tag AS country TAG`, - 'JSON.SET myDoc1 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}\'' - ]; - const searchCommand = `FT.INFO ${indexName}`; - - // Send commands - await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); - // Send search command - await workbenchPage.sendCommandInWorkbench(searchCommand); - // Check that result is displayed in Table view - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); - // Select Text view type - await t.switchToMainWindow(); - await workbenchPage.selectViewTypeText(); - // Check that result is displayed in Text view - await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); - }); diff --git a/tests/e2e/tests/critical-path/workbench/json-workbench.e2e.ts b/tests/e2e/tests/critical-path/workbench/json-workbench.e2e.ts deleted file mode 100644 index f533d55e5d..0000000000 --- a/tests/e2e/tests/critical-path/workbench/json-workbench.e2e.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -let indexName = Common.generateWord(5); - -fixture `JSON verifications at Workbench` - .meta({ type: 'critical_path', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); - // Go to Workbench page - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .afterEach(async t => { - // Drop index, documents and database - await t.switchToMainWindow(); - await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); - }); -test - .meta({ env: env.desktop })('Verify that user can see result in Table and Text view for JSON data types for FT.AGGREGATE command in Workbench', async t => { - indexName = Common.generateWord(5); - const commandsForSend = [ - `FT.CREATE ${indexName} ON JSON SCHEMA $.user.name AS name TEXT $.user.tag AS country TAG`, - 'JSON.SET myDoc1 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}\'', - 'JSON.SET myDoc2 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":500, "dmg":300}}\'' - ]; - const searchCommand = `FT.AGGREGATE ${indexName} "*" LOAD 6 $.user.hp AS hp $.user.dmg AS dmg APPLY "@hp-@dmg" AS points`; - - // Send commands - await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); - // Send search command - await workbenchPage.sendCommandInWorkbench(searchCommand); - // Check that result is displayed in Table view - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); - // Select Text view type - await t.switchToMainWindow(); - await workbenchPage.selectViewTypeText(); - // Check that result is displayed in Text view - await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); - }); diff --git a/tests/e2e/tests/critical-path/a-first-start-form/autodiscovery.e2e.ts b/tests/e2e/tests/electron/critical-path/a-first-start-form/autodiscovery.e2e.ts similarity index 84% rename from tests/e2e/tests/critical-path/a-first-start-form/autodiscovery.e2e.ts rename to tests/e2e/tests/electron/critical-path/a-first-start-form/autodiscovery.e2e.ts index fa0459f215..930885fc2c 100644 --- a/tests/e2e/tests/critical-path/a-first-start-form/autodiscovery.e2e.ts +++ b/tests/e2e/tests/electron/critical-path/a-first-start-form/autodiscovery.e2e.ts @@ -1,7 +1,7 @@ -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databaseHelper = new DatabaseHelper(); @@ -10,13 +10,12 @@ const standalonePorts = [8100, 8101, 8102, 8103, 12000]; const otherPorts = [28100, 8200]; fixture `Autodiscovery` - .meta({ type: 'critical_path' }) + .meta({ type: 'critical_path', rte: rte.none }) .page(commonUrl) .beforeEach(async() => { await databaseHelper.acceptLicenseTerms(); }); test - .meta({ env: env.desktop, rte: rte.none }) .after(async() => { // Delete all auto-discovered databases for(let i = 0; i < standalonePorts.length; i++) { diff --git a/tests/e2e/tests/electron/critical-path/analysis-tools/recommendations.e2e.ts b/tests/e2e/tests/electron/critical-path/analysis-tools/recommendations.e2e.ts new file mode 100644 index 0000000000..f6e431eda9 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/analysis-tools/recommendations.e2e.ts @@ -0,0 +1,96 @@ +import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage } from '../../../../pageObjects'; +import { RecommendationIds, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { + commonUrl, + ossStandaloneBigConfig, + ossStandaloneV5Config +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { RecommendationsActions } from '../../../../common-actions/recommendations-actions'; + +const memoryEfficiencyPage = new MemoryEfficiencyPage(); +const myRedisDatabasePage = new MyRedisDatabasePage(); +const browserPage = new BrowserPage(); +const recommendationsActions = new RecommendationsActions(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const luaScriptRecommendation = RecommendationIds.luaScript; +const useSmallerKeysRecommendation = RecommendationIds.useSmallerKeys; +const redisVersionRecommendation = RecommendationIds.redisVersion; + +fixture `Database Analysis Recommendations` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl); +test + .before(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneBigConfig); + // Go to Analysis Tools page + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + // Add cached scripts and generate new report + await memoryEfficiencyPage.Cli.addCachedScripts(11); + await t.click(memoryEfficiencyPage.newReportBtn); + // Go to Recommendations tab + await t.click(memoryEfficiencyPage.recommendationsTab); + }) + .after(async() => { + await browserPage.Cli.sendCommandInCli('SCRIPT FLUSH'); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneBigConfig); + })('Recommendations displaying', async t => { + await t.click(memoryEfficiencyPage.newReportBtn); + // Verify that user can see Avoid dynamic Lua script recommendation when number_of_cached_scripts> 10 + await t.expect(await memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).exists) + .ok('Avoid dynamic lua script recommendation not displayed'); + // Verify that user can see type of recommendation badge + await t.expect(memoryEfficiencyPage.getRecommendationLabelByName(luaScriptRecommendation, 'code').exists) + .ok('Avoid dynamic lua script recommendation not have Code Changes label'); + await t.expect(memoryEfficiencyPage.getRecommendationLabelByName(luaScriptRecommendation, 'configuration').exists) + .notOk('Avoid dynamic lua script recommendation have Configuration Changes label'); + + // Verify that user can see Use smaller keys recommendation when database has 1M+ keys + await t.expect(await memoryEfficiencyPage.getRecommendationByName(useSmallerKeysRecommendation).exists).ok('Use smaller keys recommendation not displayed'); + + // Verify that user can see all the recommendations expanded by default + await t.expect(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation).getAttribute('aria-expanded')) + .eql('true', 'Avoid dynamic lua script recommendation not expanded'); + await t.expect(memoryEfficiencyPage.getRecommendationButtonByName(useSmallerKeysRecommendation).getAttribute('aria-expanded')) + .eql('true', 'Use smaller keys recommendation not expanded'); + + // Verify that user can expand/collapse recommendation + const expandedTextContaiterSize = await memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight; + await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation)); + await t.expect(memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight) + .lt(expandedTextContaiterSize, 'Lua script recommendation not collapsed'); + await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation)); + await t.expect(memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight) + .eql(expandedTextContaiterSize, 'Lua script recommendation not expanded'); + }); +test + .before(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); + // Go to Analysis Tools page and create new report and open recommendations + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + await t.click(memoryEfficiencyPage.newReportBtn); + await t.click(memoryEfficiencyPage.recommendationsTab); + }).after(async() => { + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); + })('Verify that user can upvote recommendations', async t => { + const notUsefulVoteOption = 'not useful'; + const usefulVoteOption = 'useful'; + await recommendationsActions.voteForRecommendation(redisVersionRecommendation, notUsefulVoteOption); + // Verify that user can rate recommendations with one of 2 existing types at the same time + await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, notUsefulVoteOption); + + // Verify that user can see the popup with link when he votes for “Not useful” + await recommendationsActions.verifyVotePopUpIsDisplayed(redisVersionRecommendation, notUsefulVoteOption); + + // Verify that user can see previous votes when reload the page + await memoryEfficiencyPage.reloadPage(); + await t.click(memoryEfficiencyPage.recommendationsTab); + await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, notUsefulVoteOption); + + await t.click(memoryEfficiencyPage.newReportBtn); + await recommendationsActions.voteForRecommendation(redisVersionRecommendation, usefulVoteOption); + await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, usefulVoteOption); + }); diff --git a/tests/e2e/tests/electron/critical-path/browser/bulk-delete.e2e.ts b/tests/e2e/tests/electron/critical-path/browser/bulk-delete.e2e.ts new file mode 100644 index 0000000000..8f4a4d55e5 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/browser/bulk-delete.e2e.ts @@ -0,0 +1,44 @@ +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { deleteAllKeysFromDB } from '../../../../helpers/keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const keyNames = [Common.generateWord(20), Common.generateWord(20)]; +const dbParameters = { host: ossStandaloneRedisearch.host, port: ossStandaloneRedisearch.port }; + +fixture `Bulk Delete` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + await browserPage.addHashKey(keyNames[0], '100000', Common.generateWord(20), Common.generateWord(20)); + await browserPage.addSetKey(keyNames[1], '100000', Common.generateWord(20)); + if (await browserPage.Toast.toastCloseButton.exists) { + await t.click(browserPage.Toast.toastCloseButton); + } + }) + .afterEach(async() => { + // Clear and delete database + await deleteAllKeysFromDB(dbParameters.host, dbParameters.port); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + }); +test('Verify that when bulk deletion is completed, status Action completed is displayed', async t => { + // Filter by Hash keys + await browserPage.selectFilterGroupType(KeyTypesTexts.Hash); + await t.click(browserPage.bulkActionsButton); + await browserPage.BulkActions.startBulkDelete(); + await t.expect(browserPage.BulkActions.bulkStatusCompleted.exists).ok('Bulk deletion not completed', { timeout: 15000 }); + await t.expect(browserPage.BulkActions.bulkStatusCompleted.textContent).eql('Action completed', 'Action completed text is not visible'); + // Verify that when bulk deletion is completed, button Delete changes to Start New + await t.expect(browserPage.BulkActions.bulkStartAgainButton.exists).ok('"Start New" button not displayed'); + // Verify that user can click on Start New and existed filter will be applied + await t.click(browserPage.BulkActions.bulkStartAgainButton); + await t.expect(browserPage.BulkActions.bulkDeleteSummary.innerText).contains('Scanned 100% (2/2) and found 1 keys', 'Bulk delete summary is not correct'); +}); diff --git a/tests/e2e/tests/electron/critical-path/browser/bulk-upload.e2e.ts b/tests/e2e/tests/electron/critical-path/browser/bulk-upload.e2e.ts new file mode 100644 index 0000000000..a86c1d2706 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/browser/bulk-upload.e2e.ts @@ -0,0 +1,72 @@ +import * as path from 'path'; +import { t } from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../../helpers/keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const dbParameters = { host: ossStandaloneRedisearch.host, port: ossStandaloneRedisearch.port }; +const filesToUpload = ['bulkUplAllKeyTypes.txt', 'bigKeysData.rtf']; +const filePathes = { + allKeysFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[0]), + bigDataFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[1]) +}; +const keyNames = ['hashkey1', 'listkey1', 'setkey1', 'zsetkey1', 'stringkey1', 'jsonkey1', 'streamkey1', 'graphkey1', 'tskey1']; +const verifyCompletedResultText = async(resultsText: string[]): Promise => { + for (const result of resultsText) { + await t.expect(browserPage.BulkActions.bulkUploadCompletedSummary.textContent).contains(result, 'Bulk upload completed summary not correct'); + } + await t.expect(browserPage.BulkActions.bulkUploadCompletedSummary.textContent).notContains('0:00:00.000', 'Bulk upload Time taken not correct'); +}; + +fixture `Bulk Upload` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + }) + .afterEach(async() => { + // Clear and delete database + await deleteAllKeysFromDB(dbParameters.host, dbParameters.port); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + }); +test('Verify bulk upload of different text docs formats', async t => { + // Verify bulk upload for electron app version + const allKeysResults = ['9Commands Processed', '9Success', '0Errors']; + const bigKeysResults = ['10 000Commands Processed', '10 000Success', '0Errors']; + const defaultText = 'Select or drag and drop a file'; + + // Open bulk actions + await t.click(browserPage.bulkActionsButton); + // Open bulk upload tab + await t.click(browserPage.BulkActions.bulkUpdateTab); + // Verify that Upload button disabled by default + await t.expect(browserPage.BulkActions.actionButton.hasAttribute('disabled')).ok('Upload button enabled without added file'); + + // Verify that keys of all types can be uploaded + await browserPage.BulkActions.uploadFileInBulk(filePathes.allKeysFile); + await verifyCompletedResultText(allKeysResults); + await browserPage.searchByKeyName('*key1'); + await verifyKeysDisplayedInTheList(keyNames); + + // Verify that Upload button disabled after starting new upload + await t.click(browserPage.BulkActions.bulkActionStartNewButton); + await t.expect(browserPage.BulkActions.actionButton.hasAttribute('disabled')).ok('Upload button enabled without added file'); + + // Verify that user can remove uploaded file + await t.setFilesToUpload(browserPage.BulkActions.bulkUploadInput, [filePathes.bigDataFile]); + // update after resolving testcafe Native Automation mode limitations + // await t.expect(browserPage.BulkActions.bulkUploadContainer.textContent).contains(filesToUpload[1], 'Filename not displayed in upload input'); + await t.click(browserPage.BulkActions.removeFileBtn); + await t.expect(browserPage.BulkActions.bulkUploadContainer.textContent).contains(defaultText, 'File not removed from upload input'); + + // Verify that user can upload 10000 keys + await browserPage.BulkActions.uploadFileInBulk(filePathes.bigDataFile); + await verifyCompletedResultText(bigKeysResults); +}); diff --git a/tests/e2e/tests/electron/critical-path/database/add-ssh-db.e2e.ts b/tests/e2e/tests/electron/critical-path/database/add-ssh-db.e2e.ts new file mode 100644 index 0000000000..ac4dcc64c4 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/database/add-ssh-db.e2e.ts @@ -0,0 +1,113 @@ +import { rte } from '../../../../helpers/constants'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneForSSHConfig } from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { sshPrivateKey, sshPrivateKeyWithPasscode } from '../../../../test-data/sshPrivateKeys'; +import { Common } from '../../../../helpers/common'; +// import { BrowserActions } from '../../../common-actions/browser-actions'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +// const browserActions = new BrowserActions(); + +const sshParams = { + sshHost: '172.31.100.245', + sshPort: '2222', + sshUsername: 'u' +}; +const newClonedDatabaseAlias = 'Cloned ssh database'; +const sshDbPass = { + ...ossStandaloneForSSHConfig, + databaseName: `SSH_${Common.generateWord(5)}` +}; +const sshDbPrivateKey = { + ...ossStandaloneForSSHConfig, + databaseName: `SSH_${Common.generateWord(5)}` +}; +const sshDbPasscode = { + ...ossStandaloneForSSHConfig, + databaseName: `SSH_${Common.generateWord(5)}` +}; + +fixture `Adding database with SSH` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + }) + .after(async() => { + // Delete databases + await databaseAPIRequests.deleteStandaloneDatabasesByNamesApi([sshDbPass.databaseName, sshDbPrivateKey.databaseName, sshDbPasscode.databaseName, newClonedDatabaseAlias]); + }); +test('Adding database with SSH', async t => { + const sshWithPass = { + ...sshParams, + sshPassword: 'pass' + }; + const sshWithPrivateKey = { + ...sshParams, + sshPrivateKey: sshPrivateKey + }; + const sshWithPassphrase = { + ...sshParams, + sshPrivateKey: sshPrivateKeyWithPasscode, + sshPassphrase: 'test' + }; + // update after resolving testcafe Native Automation mode limitations + // // 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 + // await t + // .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseButton) + // .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually) + // .click(myRedisDatabasePage.AddRedisDatabase.useSSHCheckbox) + // .click(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyRadioBtn) + // .hover(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + // for (const text of tooltipText) { + // await browserActions.verifyTooltipContainsText(text, true); + // } + // // Verify that user can see the Test Connection button enabled/disabled with the same rules as the button to add/apply the changes + // await t.hover(myRedisDatabasePage.AddRedisDatabase.testConnectionBtn); + // for (const text of tooltipText) { + // await browserActions.verifyTooltipContainsText(text, true); + // } + + // Verify that user can add SSH tunnel with Password for Standalone database + // await t.click(myRedisDatabasePage.AddRedisDatabase.cancelButton); + await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPass, sshWithPass); + await myRedisDatabasePage.clickOnDBByName(sshDbPass.databaseName); + await Common.checkURLContainsText('browser'); + + // Verify that user can add SSH tunnel with Private Key + await t.click(browserPage.OverviewPanel.myRedisDBLink); + await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPrivateKey, sshWithPrivateKey); + await myRedisDatabasePage.clickOnDBByName(sshDbPrivateKey.databaseName); + await Common.checkURLContainsText('browser'); + + // Verify that user can edit SSH parameters for existing database connections + await t.click(browserPage.OverviewPanel.myRedisDBLink); + await myRedisDatabasePage.clickOnEditDBByName(sshDbPrivateKey.databaseName); + await t + .typeText(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyInput, sshWithPassphrase.sshPrivateKey, { replace: true, paste: true }) + .typeText(myRedisDatabasePage.AddRedisDatabase.sshPassphraseInput, sshWithPassphrase.sshPassphrase, { replace: true, paste: true }); + await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + await t.expect(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton.exists).notOk('Edit database panel still displayed'); + await databaseHelper.clickOnEditDatabaseByName(sshDbPrivateKey.databaseName); + await t + .expect(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyInput.value).eql(sshWithPassphrase.sshPrivateKey, 'Edited Private key not saved') + .expect(myRedisDatabasePage.AddRedisDatabase.sshPassphraseInput.value).eql(sshWithPassphrase.sshPassphrase, 'Edited Passphrase not saved'); + + // Verify that user can clone database with SSH tunnel + await databaseHelper.clickOnEditDatabaseByName(sshDbPrivateKey.databaseName); + await t.click(myRedisDatabasePage.AddRedisDatabase.cloneDatabaseButton); + // Edit Database alias before cloning + await t.typeText(myRedisDatabasePage.AddRedisDatabase.databaseAliasInput, newClonedDatabaseAlias, { replace: true }); + await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + await t.expect(myRedisDatabasePage.dbNameList.withExactText(newClonedDatabaseAlias).exists).ok('DB with SSH was not cloned'); + + // Verify that user can add SSH tunnel with Passcode + await myRedisDatabasePage.AddRedisDatabase.addStandaloneSSHDatabase(sshDbPasscode, sshWithPassphrase); + await myRedisDatabasePage.clickOnDBByName(sshDbPasscode.databaseName); + await Common.checkURLContainsText('browser'); +}); diff --git a/tests/e2e/tests/electron/critical-path/database/clone-databases.e2e.ts b/tests/e2e/tests/electron/critical-path/database/clone-databases.e2e.ts new file mode 100644 index 0000000000..7f214bd55e --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/database/clone-databases.e2e.ts @@ -0,0 +1,54 @@ +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +fixture `Clone databases` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + await databaseAPIRequests.addNewStandaloneDatabaseApi(ossStandaloneConfig); + await myRedisDatabasePage.reloadPage(); + }) + .afterEach(async() => { + // Delete databases + const dbNumber = await myRedisDatabasePage.dbNameList.withExactText(ossStandaloneConfig.databaseName).count; + for (let i = 0; i < dbNumber; i++) { + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + } + }); +test('Verify that user can clone Standalone db', async t => { + await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); + + // Verify that user can test Standalone connection on edit and see the success message + await t.click(myRedisDatabasePage.AddRedisDatabase.testConnectionBtn); + await t.expect(myRedisDatabasePage.Toast.toastHeader.textContent).contains('Connection is successful', 'Standalone connection is not successful'); + + // Verify that user can cancel the Clone by clicking the “Cancel” or the “x” button + await t.click(myRedisDatabasePage.AddRedisDatabase.cloneDatabaseButton); + await t.click(myRedisDatabasePage.AddRedisDatabase.cancelButton); + await t.expect(myRedisDatabasePage.editAliasButton.withText('Clone ').exists).notOk('Clone panel is still displayed', { timeout: 2000 }); + await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); + await t.click(myRedisDatabasePage.AddRedisDatabase.cloneDatabaseButton); + // Verify that user see the “Add Database Manually” form pre-populated with all the connection data when cloning DB + await t + // Verify that name in the header has the prefix “Clone” + .expect(myRedisDatabasePage.editAliasButton.withText('Clone ').exists).ok('Clone panel is not displayed') + .expect(myRedisDatabasePage.AddRedisDatabase.hostInput.getAttribute('value')).eql(ossStandaloneConfig.host, 'Wrong host value') + .expect(myRedisDatabasePage.AddRedisDatabase.portInput.getAttribute('value')).eql(ossStandaloneConfig.port, 'Wrong port value') + .expect(myRedisDatabasePage.AddRedisDatabase.databaseAliasInput.getAttribute('value')).eql(ossStandaloneConfig.databaseName, 'Wrong host value') + // Verify that timeout input is displayed for clone db window + .expect(myRedisDatabasePage.AddRedisDatabase.timeoutInput.value).eql('30', 'Timeout is not defaulted to 30 on clone window'); + // Verify that user can confirm the creation of the database by clicking “Clone Database” + await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + await t.expect(myRedisDatabasePage.dbNameList.withExactText(ossStandaloneConfig.databaseName).count).eql(2, 'DB was not cloned'); + + // Verify new connection badge for cloned database + await myRedisDatabasePage.verifyDatabaseStatusIsVisible(ossStandaloneConfig.databaseName); +}); diff --git a/tests/e2e/tests/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts b/tests/e2e/tests/electron/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts similarity index 50% rename from tests/e2e/tests/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts rename to tests/e2e/tests/electron/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts index 07d2614220..4517ddcc7b 100644 --- a/tests/e2e/tests/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts +++ b/tests/e2e/tests/electron/critical-path/files-auto-update/enablement-area-autoupdate.e2e.ts @@ -2,11 +2,11 @@ // import * as os from 'os'; import * as fs from 'fs'; import * as editJsonFile from 'edit-json-file'; -import { DatabaseHelper} from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig, workingDirectory } from '../../../helpers/conf'; -import { rte, env } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig, workingDirectory } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); @@ -40,7 +40,7 @@ if (fs.existsSync(workingDirectory)) { tutorialsTimestampFile.save(); fixture `Auto-update in Enablement Area` - .meta({ type: 'critical_path' }) + .meta({ type: 'critical_path', rte: rte.standalone }) .page(commonUrl) .beforeEach(async() => { await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); @@ -48,30 +48,29 @@ if (fs.existsSync(workingDirectory)) { .afterEach(async() => { await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); }); - test - .meta({ rte: rte.standalone, env: env.desktop })('Verify that user can see updated info in Enablement Area', async t => { - // Create new file due to cache-ability - const guidesTimestampFileNew = editJsonFile(guidesTimestampPath); - const tutorialsTimestampFileNew = editJsonFile(tutorialsTimestampPath); + test('Verify that user can see updated info in Enablement Area', async t => { + // Create new file due to cache-ability + const guidesTimestampFileNew = editJsonFile(guidesTimestampPath); + const tutorialsTimestampFileNew = editJsonFile(tutorialsTimestampPath); - // Open Workbench page - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + // Open Workbench page + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - // Check Enablement area and validate that removed file is existed in Guides - await t.click(workbenchPage.guidesGraphAccordion); - await t.click(workbenchPage.guidesIntroductionGraphLink.nth(1)); - await t.expect(workbenchPage.enablementAreaEmptyContent.visible).notOk('Guides folder is not updated'); - await t.click(workbenchPage.closeEnablementPage); + // Check Enablement area and validate that removed file is existed in Guides + await t.click(workbenchPage.guidesGraphAccordion); + await t.click(workbenchPage.guidesIntroductionGraphLink.nth(1)); + await t.expect(workbenchPage.enablementAreaEmptyContent.visible).notOk('Guides folder is not updated'); + await t.click(workbenchPage.closeEnablementPage); - // Check Enablement area and validate that removed file is existed in Tutorials - await t.click(workbenchPage.redisStackTutorialsButton); - await t.click(workbenchPage.timeSeriesLink); - await t.expect(workbenchPage.enablementAreaEmptyContent.visible).notOk('Tutorials folder is not updated'); + // Check Enablement area and validate that removed file is existed in Tutorials + await t.click(workbenchPage.redisStackTutorialsButton); + await t.click(workbenchPage.timeSeriesLink); + await t.expect(workbenchPage.enablementAreaEmptyContent.visible).notOk('Tutorials folder is not updated'); - // Check that timestamp is new - const actualGuidesTimestamp = await guidesTimestampFileNew.get('timestamp'); - const actualTutorialTimestamp = await tutorialsTimestampFileNew.get('timestamp'); - await t.expect(actualGuidesTimestamp).notEql(guidesNewTimestamp, 'Guides timestamp is not updated'); - await t.expect(actualTutorialTimestamp).notEql(tutorialNewTimestamp, 'Tutorials timestamp is not updated'); - }); + // Check that timestamp is new + const actualGuidesTimestamp = await guidesTimestampFileNew.get('timestamp'); + const actualTutorialTimestamp = await tutorialsTimestampFileNew.get('timestamp'); + await t.expect(actualGuidesTimestamp).notEql(guidesNewTimestamp, 'Guides timestamp is not updated'); + await t.expect(actualTutorialTimestamp).notEql(tutorialNewTimestamp, 'Tutorials timestamp is not updated'); + }); } diff --git a/tests/e2e/tests/electron/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts b/tests/e2e/tests/electron/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts new file mode 100644 index 0000000000..daedfdf294 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/files-auto-update/promo-button-autoupdate.e2e.ts @@ -0,0 +1,49 @@ +import * as fs from 'fs'; +import { Chance } from 'chance'; +import * as editJsonFile from 'edit-json-file'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, workingDirectory } from '../../../../helpers/conf'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const chance = new Chance(); + +if (fs.existsSync(workingDirectory)) { + const timestampPromoButtonPath = `${workingDirectory}/content/build.json`; + const contentPromoButtonPath = `${workingDirectory}/content/create-redis.json`; + const timestampPromoButtonFile = editJsonFile(timestampPromoButtonPath); + const contentPromoButtonFile = editJsonFile(contentPromoButtonPath); + const timestampBeforeUpdate = timestampPromoButtonFile.get('timestamp'); + const newTimestamp = timestampBeforeUpdate - 1; + const newPromoButtonText = chance.word({ length: 10 }); + + //Edit json file values + contentPromoButtonFile.set('cloud.title', newPromoButtonText); + contentPromoButtonFile.set('cloud.description', newPromoButtonText); + contentPromoButtonFile.save(); + timestampPromoButtonFile.set('timestamp', newTimestamp); + timestampPromoButtonFile.save(); + + fixture `Auto-update in Promo Button` + .meta({ type: 'critical_path' }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + }); + test('Verify that user has the ability to update "Create free database" button without changing the app', async t => { + // Create new file paths due to cache-ability + const timestampPathNew = editJsonFile(timestampPromoButtonPath); + const contentPathNew = editJsonFile(contentPromoButtonPath); + // Check the promo button after the opening of app + await t.expect(myRedisDatabasePage.promoButton.textContent).notContains(newPromoButtonText, 'Promo button text is not updated'); + // Get the values from build.json and create-redis.json files + const actualTimestamp = await timestampPathNew.get('timestamp'); + const actualPromoButtonTitle = await contentPathNew.get('cloud.title'); + const actualPromoButtonDescription = await contentPathNew.get('cloud.description'); + // Check the json files are automatically updated + await t.expect(actualPromoButtonTitle).notEql(newPromoButtonText, 'The cloud title in the create-redis.json file is automatically updated'); + await t.expect(actualPromoButtonDescription).notEql(newPromoButtonText, 'The cloud description in the create-redis.json file is automatically updated'); + await t.expect(actualTimestamp).notEql(newTimestamp, 'The timestamp in the build.json file is automatically updated'); + }); +} diff --git a/tests/e2e/tests/electron/critical-path/monitor/monitor.e2e.ts b/tests/e2e/tests/electron/critical-path/monitor/monitor.e2e.ts new file mode 100644 index 0000000000..b79adef488 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/monitor/monitor.e2e.ts @@ -0,0 +1,75 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { + MyRedisDatabasePage, + WorkbenchPage, + BrowserPage +} from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +const keyName = `${Common.generateWord(20)}-key`; +const keyValue = `${Common.generateWord(10)}-value`; + +fixture `Monitor` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can work with Monitor', async t => { + const command = 'set'; + //Verify that user can open Monitor + await t.click(browserPage.Profiler.expandMonitor); + //Check that monitor is opened + await t.expect(browserPage.Profiler.monitorArea.exists).ok('Profiler area'); + await t.expect(browserPage.Profiler.startMonitorButton.exists).ok('Start profiler button'); + //Verify that user can see message inside Monitor "Running Monitor will decrease throughput, avoid running it in production databases." when opens it for the first time + await t.expect(browserPage.Profiler.monitorWarningMessage.exists).ok('Profiler warning message'); + await t.expect(browserPage.Profiler.monitorWarningMessage.withText('Running Profiler will decrease throughput, avoid running it in production databases.').exists).ok('Profiler warning message is not correct'); + //Verify that user can run Monitor by clicking "Run" command in the message inside Monitor + await t.click(browserPage.Profiler.startMonitorButton); + await t.expect(browserPage.Profiler.monitorIsStartedText.innerText).eql('Profiler is started.'); + //Verify that user can see run commands in monitor + await browserPage.Cli.getSuccessCommandResultFromCli(`${command} ${keyName} ${keyValue}`); + await browserPage.Profiler.checkCommandInMonitorResults(command, [keyName, keyValue]); +}); +test('Verify that user can see the list of all commands from all clients ran for this Redis database in the list of results in Monitor', async t => { + //Define commands in different clients + const cli_command = 'command'; + const workbench_command = 'hello'; + const common_command = 'info'; + const browser_command = 'hset'; + //Start Monitor + await browserPage.Profiler.startMonitor(); + //Send command in CLI + await browserPage.Cli.getSuccessCommandResultFromCli(cli_command); + //Check that command from CLI is displayed in monitor + await browserPage.Profiler.checkCommandInMonitorResults(cli_command); + //Refresh the page to send command from Browser client + await t.click(browserPage.refreshKeysButton); + //Check the command from browser client + await browserPage.addHashKey(keyName); + await browserPage.Profiler.checkCommandInMonitorResults(browser_command); + //Open Workbench page to create new client + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + //Send command in Workbench + await workbenchPage.sendCommandInWorkbench(workbench_command); + //Check that command from Workbench is displayed in monitor + await workbenchPage.Profiler.checkCommandInMonitorResults(workbench_command); + //Check the command from common client + await workbenchPage.Profiler.checkCommandInMonitorResults(common_command); +}); diff --git a/tests/e2e/tests/electron/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts b/tests/e2e/tests/electron/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts new file mode 100644 index 0000000000..f331e1cc05 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts @@ -0,0 +1,46 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, PubSubPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { verifyMessageDisplayingInPubSub } from '../../../../helpers/pub-sub'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const pubSubPage = new PubSubPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +fixture `Subscribe/Unsubscribe from a channel` + .meta({ rte: rte.standalone, type: 'critical_path' }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + //Go to PubSub page + await t.click(myRedisDatabasePage.NavigationPanel.pubSubButton); + }) + .afterEach(async() => { + await databaseAPIRequests.deleteAllDatabasesApi(); + }); +test('Verify that when user subscribe to the pubsub channel he can see all the messages being published to my database from the moment of my subscription', async t => { + // Verify that the Channel field placeholder is 'Enter Channel Name' + await t.expect(pubSubPage.channelNameInput.getAttribute('placeholder')).eql('Enter Channel Name', 'No placeholder in Channel field'); + // Verify that the Message field placeholder is 'Enter Message' + await t.expect(pubSubPage.messageInput.getAttribute('placeholder')).eql('Enter Message', 'No placeholder in Message field'); + // Verify that user is unsubscribed from the pubsub channel when he go to the pubsub window after launching application for the first time + await t.expect(pubSubPage.subscribeStatus.textContent).eql('You are not subscribed', 'User is not unsubscribed'); + await t.expect(pubSubPage.subscribeButton.textContent).eql('Subscribe', 'Subscribe button is not displayed'); + + // Subscribe to channel + await t.click(pubSubPage.subscribeButton); + await t.expect(pubSubPage.subscribeStatus.textContent).eql('You are subscribed', 'User is not subscribed', { timeout: 10000 }); + // Verify that user can publish a message to a channel + await pubSubPage.publishMessage('test', 'published message'); + await verifyMessageDisplayingInPubSub('published message', true); + await t.click(pubSubPage.unsubscribeButton); + //Verify that when user unsubscribe from a pubsub channel he can see no new data being published to the channel from the moment he unsubscribe + await t.expect(pubSubPage.subscribeStatus.textContent).eql('You are not subscribed', 'User is not unsubscribed', { timeout: 10000 }); + //Verify that user can publish a message regardless of my subscription state. + await pubSubPage.publishMessage('test', 'message in unsubscribed status'); + //Verify that message is not displayed + await verifyMessageDisplayingInPubSub('message in unsubscribed status', false); +}); diff --git a/tests/e2e/tests/electron/critical-path/slow-log/slow-log.e2e.ts b/tests/e2e/tests/electron/critical-path/slow-log/slow-log.e2e.ts new file mode 100644 index 0000000000..6c08ce36ab --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/slow-log/slow-log.e2e.ts @@ -0,0 +1,62 @@ +import { SlowLogPage, MyRedisDatabasePage, BrowserPage, ClusterDetailsPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const slowLogPage = new SlowLogPage(); +const myRedisDatabasePage = new MyRedisDatabasePage(); +const browserPage = new BrowserPage(); +const overviewPage = new ClusterDetailsPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const slowerThanParameter = 1; +let maxCommandLength = 50; +const command = `slowlog get ${maxCommandLength}`; + +fixture `Slow Log` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneBigConfig); + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + await t.click(slowLogPage.slowLogTab); + }) + .afterEach(async() => { + await slowLogPage.resetToDefaultConfig(); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneBigConfig); + }); +test('Verify that user can open new Slow Log page using new icon on left app panel', async t => { + // Verify that user see "Slow Log" page by default for non OSS Cluster + await t.expect(overviewPage.overviewTab.withAttribute('aria-selected', 'true').exists).notOk('The Overview tab is displayed for non OSS Cluster db'); + // Verify that user can configure slowlog-max-len for Slow Log and see whole set of commands according to the setting + await slowLogPage.changeSlowerThanParameter(slowerThanParameter, slowLogPage.slowLogConfigureMicroSecondsUnit); + await slowLogPage.Cli.sendCommandInCli(command); + await t.click(slowLogPage.slowLogRefreshButton); + const duration = await slowLogPage.slowLogCommandValue.withExactText(command).parent(3).find(slowLogPage.cssSelectorDurationValue).textContent; + await t.expect(parseInt(duration)).gte(slowerThanParameter, 'Displayed command time execution is more than specified'); + // Verify that user can see 3 columns with timestamp, duration and command in Slow Log + await t.expect(slowLogPage.slowLogTimestampValue.exists).ok('Timestamp column'); + await t.expect(slowLogPage.slowLogDurationValue.exists).ok('Duration column'); + await t.expect(slowLogPage.slowLogCommandValue.exists).ok('Command column'); +}); +test('Verify that user can see "No Slow Logs found" message when slowlog-max-len=0', async t => { + // Set slowlog-max-len=0 + maxCommandLength = 0; + await slowLogPage.changeMaxLengthParameter(maxCommandLength); + await t.click(slowLogPage.slowLogRefreshButton); + // Check that no records are displayed in SlowLog table + await t.expect(slowLogPage.slowLogEmptyResult.exists).ok('Empty results not found'); + // Verify that user can see not more that number of commands that was specified in configuration + maxCommandLength = 30; + await slowLogPage.changeSlowerThanParameter(slowerThanParameter, slowLogPage.slowLogConfigureMicroSecondsUnit); + await slowLogPage.changeMaxLengthParameter(maxCommandLength); + // Go to Browser page to scan keys and turn back + await t.click(myRedisDatabasePage.NavigationPanel.browserButton); + await t.click(browserPage.refreshKeysButton); + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + await t.click(slowLogPage.slowLogTab); + // Compare number of logged commands with maxLength + await t.expect(slowLogPage.slowLogCommandStatistics.withText(`${maxCommandLength} entries`).exists).ok(`Number of displayed commands is less than selected ${maxCommandLength}`); +}); diff --git a/tests/e2e/tests/critical-path/tree-view/tree-view-improvements.e2e.ts b/tests/e2e/tests/electron/critical-path/tree-view/tree-view-improvements.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/tree-view/tree-view-improvements.e2e.ts rename to tests/e2e/tests/electron/critical-path/tree-view/tree-view-improvements.e2e.ts index 2219891483..f3db07e435 100644 --- a/tests/e2e/tests/critical-path/tree-view/tree-view-improvements.e2e.ts +++ b/tests/e2e/tests/electron/critical-path/tree-view/tree-view-improvements.e2e.ts @@ -1,12 +1,12 @@ import { Selector, t } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList } from '../../../helpers/keys'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/electron/critical-path/triggers-and-functions/libraries.e2e.ts b/tests/e2e/tests/electron/critical-path/triggers-and-functions/libraries.e2e.ts new file mode 100644 index 0000000000..45a9347cb8 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/triggers-and-functions/libraries.e2e.ts @@ -0,0 +1,60 @@ +import * as path from 'path'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { + BrowserPage, + TriggersAndFunctionsFunctionsPage, + TriggersAndFunctionsLibrariesPage +} from '../../../../pageObjects'; +import { + commonUrl, + ossStandaloneRedisGears +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const triggersAndFunctionsLibrariesPage = new TriggersAndFunctionsLibrariesPage(); +const triggersAndFunctionsFunctionsPage = new TriggersAndFunctionsFunctionsPage(); + +const libraryName = Common.generateWord(5); + +const filePathes = { + upload: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'library.txt'), + invoke: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'invoke_function.txt') +}; + +fixture `Triggers and Functions` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisGears); + }) + .afterEach(async() => { + // Delete database + await browserPage.Cli.sendCommandInCli(`TFUNCTION DELETE ${libraryName}`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisGears); + }); +test('Verify that function can be invoked', async t => { + const functionNameFromFile = 'function'; + const libNameFromFile = 'lib'; + const keyName = ['Hello']; + const argumentsName = ['world', '!!!' ]; + const expectedCommand = `TFCALL "${libNameFromFile}.${functionNameFromFile}" "${keyName.length}" "${keyName}" "${argumentsName.join('" "')}"`; + + await t.click(browserPage.NavigationPanel.triggeredFunctionsButton); + await t.click(triggersAndFunctionsFunctionsPage.librariesLink); + await t.click(triggersAndFunctionsLibrariesPage.addLibraryButton); + await t.setFilesToUpload(triggersAndFunctionsLibrariesPage.uploadInput, [filePathes.invoke]); + await t.click(triggersAndFunctionsLibrariesPage.addLibrarySubmitButton); + await t.click(triggersAndFunctionsLibrariesPage.functionsLink); + await t.click(triggersAndFunctionsFunctionsPage.getFunctionsNameSelector(functionNameFromFile)); + await t.click(triggersAndFunctionsFunctionsPage.invokeButton); + await triggersAndFunctionsFunctionsPage.enterFunctionArguments(argumentsName); + await triggersAndFunctionsFunctionsPage.enterFunctionKeyName(keyName); + await t.click(triggersAndFunctionsFunctionsPage.runInCliButton); + await t.expect(await triggersAndFunctionsFunctionsPage.Cli.getExecutedCommandTextByIndex()).eql(expectedCommand); + await t.click(triggersAndFunctionsFunctionsPage.Cli.cliCollapseButton); +}); diff --git a/tests/e2e/tests/electron/critical-path/workbench/index-schema.e2e.ts b/tests/e2e/tests/electron/critical-path/workbench/index-schema.e2e.ts new file mode 100644 index 0000000000..a9dc8ae6bd --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/workbench/index-schema.e2e.ts @@ -0,0 +1,70 @@ +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +let indexName = Common.generateWord(5); + +fixture `Index Schema at Workbench` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + // Go to Workbench page + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .afterEach(async t => { + // Drop index, documents and database + await t.switchToMainWindow(); + await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + }); +test('Verify that user can open results in Text and Table views for FT.INFO for Hash in Workbench', async t => { + indexName = Common.generateWord(5); + const commandsForSend = [ + `FT.CREATE ${indexName} ON HASH PREFIX 1 product: SCHEMA name TEXT`, + 'HMSET product:1 name "Apple Juice"' + ]; + const searchCommand = `FT.INFO ${indexName}`; + + // Send commands + await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); + // Send search command + await workbenchPage.sendCommandInWorkbench(searchCommand); + // Check that result is displayed in Table view + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); + // Select Text view type + await t.switchToMainWindow(); + await workbenchPage.selectViewTypeText(); + // Check that result is displayed in Text view + await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); +}); +test('Verify that user can open results in Text and Table views for FT.INFO for JSON in Workbench', async t => { + indexName = Common.generateWord(5); + const commandsForSend = [ + `FT.CREATE ${indexName} ON JSON SCHEMA $.user.name AS name TEXT $.user.tag AS country TAG`, + 'JSON.SET myDoc1 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}\'' + ]; + const searchCommand = `FT.INFO ${indexName}`; + + // Send commands + await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); + // Send search command + await workbenchPage.sendCommandInWorkbench(searchCommand); + // Check that result is displayed in Table view + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); + // Select Text view type + await t.switchToMainWindow(); + await workbenchPage.selectViewTypeText(); + // Check that result is displayed in Text view + await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); +}); diff --git a/tests/e2e/tests/electron/critical-path/workbench/json-workbench.e2e.ts b/tests/e2e/tests/electron/critical-path/workbench/json-workbench.e2e.ts new file mode 100644 index 0000000000..cfac929e85 --- /dev/null +++ b/tests/e2e/tests/electron/critical-path/workbench/json-workbench.e2e.ts @@ -0,0 +1,50 @@ +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +let indexName = Common.generateWord(5); + +fixture `JSON verifications at Workbench` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + // Go to Workbench page + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .afterEach(async t => { + // Drop index, documents and database + await t.switchToMainWindow(); + await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + }); +test('Verify that user can see result in Table and Text view for JSON data types for FT.AGGREGATE command in Workbench', async t => { + indexName = Common.generateWord(5); + const commandsForSend = [ + `FT.CREATE ${indexName} ON JSON SCHEMA $.user.name AS name TEXT $.user.tag AS country TAG`, + 'JSON.SET myDoc1 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}\'', + 'JSON.SET myDoc2 $ \'{"user":{"name":"John Smith","tag":"foo,bar","hp":500, "dmg":300}}\'' + ]; + const searchCommand = `FT.AGGREGATE ${indexName} "*" LOAD 6 $.user.hp AS hp $.user.dmg AS dmg APPLY "@hp-@dmg" AS points`; + + // Send commands + await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n')); + // Send search command + await workbenchPage.sendCommandInWorkbench(searchCommand); + // Check that result is displayed in Table view + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The result is displayed in Table view'); + // Select Text view type + await t.switchToMainWindow(); + await workbenchPage.selectViewTypeText(); + // Check that result is displayed in Text view + await t.expect(workbenchPage.queryTextResult.exists).ok('The result is displayed in Text view'); +}); diff --git a/tests/e2e/tests/electron/regression/database/cloud-sso.e2e.ts b/tests/e2e/tests/electron/regression/database/cloud-sso.e2e.ts new file mode 100644 index 0000000000..dfd5100735 --- /dev/null +++ b/tests/e2e/tests/electron/regression/database/cloud-sso.e2e.ts @@ -0,0 +1,53 @@ +import * as path from 'path'; +import { MyRedisDatabasePage, WelcomePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { deleteRowsFromTableInDB } from '../../../../helpers/database-scripts'; +import { modifyFeaturesConfigJson, updateControlNumber } from '../../../../helpers/insights'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const welcomePage = new WelcomePage(); + +const featuresConfigTable = 'features_config'; +const pathes = { + defaultRemote: path.join('.', 'test-data', 'features-configs', 'insights-default-remote.json'), + dockerConfig: path.join('.', 'test-data', 'features-configs', 'sso-docker-build.json'), + electronConfig: path.join('.', 'test-data', 'features-configs', 'sso-electron-build.json') +}; + +fixture `Cloud SSO` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseAPIRequests.deleteAllDatabasesApi(); + await databaseHelper.acceptLicenseTerms(); + }) + .afterEach(async() => { + await databaseAPIRequests.deleteAllDatabasesApi(); + await myRedisDatabasePage.reloadPage(); + // Update remote config .json to default + await modifyFeaturesConfigJson(pathes.defaultRemote); + // Clear features config table + await deleteRowsFromTableInDB(featuresConfigTable); + }); +test('Verify that user can see SSO feature if it is enabled in feature config', async t => { + // Update remote config .json to config with buildType filter excluding current app build + await modifyFeaturesConfigJson(pathes.dockerConfig); + await updateControlNumber(48.2); + // Verify that user can't see SSO feature if it is disabled in feature config + await t.expect(welcomePage.importCloudDbBtn.exists).notOk('Import Cloud database button displayed when SSO feature disabled'); + + // Update remote config .json to config with buildType filter including current app build + await modifyFeaturesConfigJson(pathes.electronConfig); + await updateControlNumber(48.2); + await t.expect(welcomePage.importCloudDbBtn.exists).ok('Import Cloud database button not displayed when SSO feature enabled'); + + await t.click(welcomePage.addDbAutoBtn); + // Verify that RE Cloud auto-discovery options Use Cloud Account and Use Cloud API Keys are displayed on Welcome screen + await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudAccount.exists).ok('Use Cloud Account accordion not displayed when SSO feature enabled'); + await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudKeys.exists).ok('Use Cloud Keys accordion not displayed when SSO feature enabled'); +}); diff --git a/tests/e2e/tests/electron/regression/database/edit-db.e2e.ts b/tests/e2e/tests/electron/regression/database/edit-db.e2e.ts new file mode 100644 index 0000000000..51b83c0b7f --- /dev/null +++ b/tests/e2e/tests/electron/regression/database/edit-db.e2e.ts @@ -0,0 +1,60 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { + commonUrl, + ossStandaloneBigConfig, + ossStandaloneConfig +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +const database = Object.assign({}, ossStandaloneConfig); +const previousDatabaseName = Common.generateWord(20); +database.databaseName = previousDatabaseName; +const keyName = Common.generateWord(10); + +fixture `List of Databases` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async t => { + // Clear and delete database + await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); + await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); + await t.typeText(myRedisDatabasePage.AddRedisDatabase.portInput, ossStandaloneConfig.port, { replace: true, paste: true }); + await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteAllDatabasesApi(); + }); +test('Verify that context for previous database not saved after editing port/username/password/certificates/SSH', async t => { + const command = 'HSET'; + + // Create context modificaions and navigate to db list + await browserPage.addStringKey(keyName); + await browserPage.openKeyDetails(keyName); + await t.click(browserPage.Cli.cliExpandButton); + await t.typeText(browserPage.Cli.cliCommandInput, command, { replace: true, paste: true }); + await t.pressKey('enter'); + await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); + // Edit port of added database + await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); + await t.typeText(myRedisDatabasePage.AddRedisDatabase.portInput, ossStandaloneBigConfig.port, { replace: true, paste: true }); + await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); + await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); + // Verify that keys from the database with new port are displayed + await t.expect(browserPage.keysSummary.find('b').withText('18 00').exists).ok('DB with new port not opened'); + // Verify that context not saved + await t.expect(browserPage.keyNameFormDetails.withExactText(keyName).exists).notOk('The key details is still selected'); + await t.expect(browserPage.Cli.cliCommandExecuted.withExactText(command).exists).notOk(`Executed command '${command}' in CLI is still displayed`); +}); diff --git a/tests/e2e/tests/electron/regression/insights/feature-flag.e2e.ts b/tests/e2e/tests/electron/regression/insights/feature-flag.e2e.ts new file mode 100644 index 0000000000..27a316261a --- /dev/null +++ b/tests/e2e/tests/electron/regression/insights/feature-flag.e2e.ts @@ -0,0 +1,44 @@ +import * as path from 'path'; +import { BrowserPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { deleteRowsFromTableInDB } from '../../../../helpers/database-scripts'; +import { modifyFeaturesConfigJson, updateControlNumber } from '../../../../helpers/insights'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const featuresConfigTable = 'features_config'; +const pathes = { + defaultRemote: path.join('.', 'test-data', 'features-configs', 'insights-default-remote.json'), + dockerConfig: path.join('.', 'test-data', 'features-configs', 'insights-docker-build.json'), + electronConfig: path.join('.', 'test-data', 'features-configs', 'insights-electron-build.json') +}; + +fixture `Feature flag` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); + }) + .afterEach(async() => { + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); + // Update remote config .json to default + await modifyFeaturesConfigJson(pathes.defaultRemote); + // Clear features config table + await deleteRowsFromTableInDB(featuresConfigTable); + }); +test('Verify that Insights panel can be displayed for Electron app according to filters', async t => { + // Update remote config .json to config with buildType filter excluding current app build + await modifyFeaturesConfigJson(pathes.dockerConfig); + await updateControlNumber(48.2); + await t.expect(browserPage.InsightsPanel.insightsBtn.exists).notOk('Insights panel displayed when filter excludes this buildType'); + + // Update remote config .json to config with buildType filter including current app build + await modifyFeaturesConfigJson(pathes.electronConfig); + await updateControlNumber(48.2); + await t.expect(browserPage.InsightsPanel.insightsBtn.exists).ok('Insights panel not displayed when filter includes this buildType'); +}); diff --git a/tests/e2e/tests/electron/regression/shortcuts/shortcuts.e2e.ts b/tests/e2e/tests/electron/regression/shortcuts/shortcuts.e2e.ts new file mode 100644 index 0000000000..497d909995 --- /dev/null +++ b/tests/e2e/tests/electron/regression/shortcuts/shortcuts.e2e.ts @@ -0,0 +1,33 @@ +// import { ClientFunction } from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl } from '../../../../helpers/conf'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +// const getPageUrl = ClientFunction(() => window.location.href); + +fixture `Shortcuts` + .meta({ type: 'regression', rte: rte.none }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + }); +test('Verify that user can see a summary of Shortcuts by clicking "Keyboard Shortcuts" button in Help Center for desktop', async t => { + // Click on help center icon and verify panel + await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); + await t.expect(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterPanel.exists).ok('Help Center panel is not opened'); + // Click on Shortcuts option and verify panel + await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); + // Validate Title and sections of Shortcuts + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsTitle.exists).ok('shortcutsTitle is not opened'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsDesktopApplicationSection.exists).ok('shortcutsDesktopApplicationSection is not opened'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsCLISection.exists).ok('shortcutsCLISection is not displayed'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsWorkbenchSection.exists).ok('shortcutsWorkbenchSection is not displayed'); + // Verify that user can close the Shortcuts + await t.click(myRedisDatabasePage.ShortcutsPanel.shortcutsCloseButton); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).notOk('Shortcuts panel is not displayed'); +}); diff --git a/tests/e2e/tests/electron/regression/workbench/redis-stack-commands.e2e.ts b/tests/e2e/tests/electron/regression/workbench/redis-stack-commands.e2e.ts new file mode 100644 index 0000000000..19dc3a8b81 --- /dev/null +++ b/tests/e2e/tests/electron/regression/workbench/redis-stack-commands.e2e.ts @@ -0,0 +1,62 @@ +import { t } from 'testcafe'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const keyNameGraph = 'bikes_graph'; + +fixture `Redis Stack command in Workbench` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .afterEach(async() => { + // Drop key and database + await t.switchToMainWindow(); + await workbenchPage.sendCommandInWorkbench(`GRAPH.DELETE ${keyNameGraph}`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +//skipped due the inaccessibility of the iframe +test.skip('Verify that user can switches between Graph and Text for GRAPH command and see results corresponding to their views', async t => { + // Send Graph command + await t.click(workbenchPage.redisStackTutorialsButton); + await t.click(workbenchPage.tutorialsWorkingWithGraphLink); + await t.click(workbenchPage.createGraphBikeButton); + await t.click(workbenchPage.submitCommandButton); + // Switch to Text view and check result + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The text view is not switched for GRAPH command'); + // Switch to Graph view and check result + await workbenchPage.selectViewTypeGraph(); + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.queryGraphContainer).exists).ok('The Graph view is not switched for GRAPH command'); +}); +//skipped due to Graph no longer displayed in tutorials +test.skip('Verify that user can see "No data to visualize" message for Graph command', async t => { + // Send Graph command + await t.click(workbenchPage.redisStackTutorialsButton); + await t.click(workbenchPage.tutorialsWorkingWithGraphLink); + await t.click(workbenchPage.preselectModelBikeSalesButton); + await t.click(workbenchPage.submitCommandButton); + // Check result + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.responseInfo.textContent).eql('No data to visualize. Raw information is presented below.', 'The info message is not displayed for Graph'); + + // Get result text content + const graphModeText = await workbenchPage.parsedRedisReply.textContent; + // Switch to Text view and check result + await t.switchToMainWindow(); + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryTextResult.exists).ok('The result in text view is not displayed'); + // Verify that when there is nothing to visualize in RedisGraph, user can see just text result + await t.expect(workbenchPage.queryTextResult.textContent).notEql(graphModeText, 'Text of command in Graph mode is the same as in Text mode'); +}); diff --git a/tests/e2e/tests/electron/smoke/browser/add-keys.e2e.ts b/tests/e2e/tests/electron/smoke/browser/add-keys.e2e.ts new file mode 100644 index 0000000000..18b457f1fa --- /dev/null +++ b/tests/e2e/tests/electron/smoke/browser/add-keys.e2e.ts @@ -0,0 +1,115 @@ +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +let keyName = Common.generateWord(10); + +fixture `Add keys` + .meta({ type: 'smoke', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + // Clear and delete database + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can add Hash Key', async t => { + keyName = Common.generateWord(10); + // Add Hash key + await browserPage.addHashKey(keyName); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The Hash key is not added'); +}); +test('Verify that user can add Set Key', async t => { + keyName = Common.generateWord(10); + // Add Set key + await browserPage.addSetKey(keyName); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The Set key is not added'); +}); +test('Verify that user can add List Key', async t => { + keyName = Common.generateWord(10); + // Add List key + await browserPage.addListKey(keyName); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The List key is not added'); +}); +test('Verify that user can add String Key', async t => { + keyName = Common.generateWord(10); + // Add String key + await browserPage.addStringKey(keyName); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The String key is not added'); +}); +test('Verify that user can add ZSet Key', async t => { + keyName = Common.generateWord(10); + // Add ZSet key + await browserPage.addZSetKey(keyName, '111'); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The ZSet key is not added'); +}); +test('Verify that user can add JSON Key', async t => { + keyName = Common.generateWord(10); + const keyTTL = '2147476121'; + const value = '{"name":"xyz"}'; + + // Add JSON key + await browserPage.addJsonKey(keyName, value, keyTTL); + // Check the notification message + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification not displayed'); + // Check that new key is displayed in the list + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The JSON key is not added'); +}); +test('Verify that user can add Stream key', async t => { + keyName = Common.generateWord(20); + const keyField = Common.generateWord(20); + const keyValue = Common.generateWord(20); + + // Add New Stream Key + await browserPage.addStreamKey(keyName, keyField, keyValue); + // Verify that user can see Stream details opened after key creation + await t.expect(browserPage.keyNameFormDetails.withExactText(keyName).exists).ok('Stream Key Name not visible'); + // Verify that user can see newly added Stream key in key list clicking on keys refresh button + await t.click(browserPage.refreshKeysButton); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('Stream is not added'); +}); diff --git a/tests/e2e/tests/smoke/browser/list-of-keys-verifications.e2e.ts b/tests/e2e/tests/electron/smoke/browser/list-of-keys-verifications.e2e.ts similarity index 90% rename from tests/e2e/tests/smoke/browser/list-of-keys-verifications.e2e.ts rename to tests/e2e/tests/electron/smoke/browser/list-of-keys-verifications.e2e.ts index 4a84fd0c02..92a88438ad 100644 --- a/tests/e2e/tests/smoke/browser/list-of-keys-verifications.e2e.ts +++ b/tests/e2e/tests/electron/smoke/browser/list-of-keys-verifications.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/electron/smoke/cli/cli.e2e.ts b/tests/e2e/tests/electron/smoke/cli/cli.e2e.ts new file mode 100644 index 0000000000..9adb93ebf2 --- /dev/null +++ b/tests/e2e/tests/electron/smoke/cli/cli.e2e.ts @@ -0,0 +1,41 @@ +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +let keyName = Common.generateWord(10); + +fixture `CLI` + .meta({ type: 'smoke', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can add data via CLI', async t => { + keyName = Common.generateWord(10); + // Open CLI + await t.click(browserPage.Cli.cliExpandButton); + // Verify that user can expand CLI + await t.expect(browserPage.Cli.cliArea.exists).ok('CLI area is not displayed'); + await t.expect(browserPage.Cli.cliCommandInput.exists).ok('CLI input is not displayed'); + + // Add key from CLI + await t.typeText(browserPage.Cli.cliCommandInput, `SADD ${keyName} "chinese" "japanese" "german"`, { replace: true, paste: true }); + await t.pressKey('enter'); + // Check that the key is added + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The key is not added'); +}); diff --git a/tests/e2e/tests/regression/cli/cli-command-helper.e2e.ts b/tests/e2e/tests/regression/cli/cli-command-helper.e2e.ts deleted file mode 100644 index 58a1d8d1a4..0000000000 --- a/tests/e2e/tests/regression/cli/cli-command-helper.e2e.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { Common } from '../../../helpers/common'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { BrowserPage } from '../../../pageObjects'; - -const browserPage = new BrowserPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -let filteringGroup = ''; -let filteringGroups: string[] = []; -let commandToCheck = ''; -let commandsToCheck: string[] = []; -let commandArgumentsToCheck = ''; -let commandsArgumentsToCheck: string[] = []; -let externalPageLink = ''; -let externalPageLinks: string[] = []; - -fixture `CLI Command helper` - .meta({ type: 'regression', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - }) - .afterEach(async() => { - // Delete database - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - }); -test('Verify that user can open/close CLI separately from Command Helper', async t => { - // Open CLI - await t.click(browserPage.Cli.cliExpandButton); - // Verify that CLI is opened separately - await t.expect(browserPage.CommandHelper.commandHelperArea.visible).notOk('Command Helper is not closed'); - await t.expect(browserPage.Cli.cliCollapseButton.visible).ok('CLI is not opended'); - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Verify that user can close CLI separately - await t.click(browserPage.Cli.cliCollapseButton); - await t.expect(browserPage.CommandHelper.commandHelperArea.visible).ok('Command Helper is not displayed'); - await t.expect(browserPage.Cli.cliCollapseButton.visible).notOk('CLI is not closed'); - - // Verify that user can open/close Command Helper separately from CLI - await t.expect(browserPage.CommandHelper.commandHelperArea.visible).ok('Command Helper is not opened'); - await t.expect(browserPage.Cli.cliCollapseButton.visible).notOk('CLI is not closed'); - // Open CLI - await t.click(browserPage.Cli.cliExpandButton); - // Verify that Command Helper is closed separately - await t.click(browserPage.CommandHelper.closeCommandHelperButton); - await t.expect(browserPage.CommandHelper.commandHelperArea.visible).notOk('Command Helper is not closed'); - await t.expect(browserPage.Cli.cliCollapseButton.visible).ok('CLI is not opended'); -}); -test('Verify that user can see that Command Helper is minimized when he clicks the "minimize" button', async t => { - const helperColourBefore = await Common.getBackgroundColour(browserPage.CommandHelper.commandHelperBadge); - // Open Command Helper and minimize - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - await t.click(browserPage.CommandHelper.minimizeCommandHelperButton); - // Verify Command helper is minimized - const helperColourAfter = await Common.getBackgroundColour(browserPage.CommandHelper.commandHelperBadge); - await t.expect(helperColourAfter).notEql(helperColourBefore, 'Command helper badge colour is not changed'); - await t.expect(browserPage.Cli.minimizeCliButton.visible).eql(false, 'Command helper is not mimized'); -}); -test('Verify that user can see that Command Helper displays the previous information when he re-opens it', async t => { - filteringGroup = 'Search'; - commandToCheck = 'FT.EXPLAIN'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select one command from the list - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Minimize and re-open Command Helper - await t.click(browserPage.CommandHelper.minimizeCommandHelperButton); - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Verify Command helper information - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).contains(commandToCheck, 'Command Helper information not persists after reopening'); -}); -test - .meta({ env: env.web })('Verify that user can see in Command helper and click on new group "JSON", can choose it and see list of commands in the group', async t => { - filteringGroup = 'JSON'; - commandToCheck = 'JSON.SET'; - commandArgumentsToCheck = 'JSON.SET key path value [condition]'; - externalPageLink = 'https://redis.io/commands/json.set/'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select one command from the list - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Click on Read More link for selected command - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLink); - // await t.switchToParentWindow(); - }); -test - .meta({ env: env.web })('Verify that user can see in Command helper and click on new group "Search", can choose it and see list of commands in the group', async t => { - filteringGroup = 'Search'; - commandToCheck = 'FT.EXPLAIN'; - commandArgumentsToCheck = 'FT.EXPLAIN index query [dialect]'; - externalPageLink = 'https://redis.io/commands/ft.explain/'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select one command from the list - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Click on Read More link for selected command - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLink); - // await t.switchToParentWindow(); - }); -test - .meta({ env: env.web })('Verify that user can see HyperLogLog title in Command Helper for this command group', async t => { - filteringGroup = 'HyperLogLog'; - commandToCheck = 'PFCOUNT'; - commandArgumentsToCheck = 'PFCOUNT key [key ...]'; - externalPageLink = 'https://redis.io/commands/pfcount/'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select one command from the list - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Click on Read More link for selected command - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLink); - // // await t.expect(getPageUrl()).eql(externalPageLink, 'The opened page'); - // await t.switchToParentWindow(); - }); -test - .meta({ env: env.web })('Verify that user can see all separated groups for AI json file (model, tensor, inference, script)', async t => { - filteringGroups = ['Model', 'Script', 'Inference', 'Tensor']; - commandsToCheck = [ - 'AI.MODELDEL', - 'AI.SCRIPTSTORE', - 'AI.SCRIPTEXECUTE', - 'AI.TENSORSET' - ]; - commandsArgumentsToCheck = [ - 'AI.MODELDEL key', - 'AI.SCRIPTSTORE key CPU|GPU [TAG tag] ENTRY_POINTS entry_point_count entry_point [entry_point ...]', - 'AI.SCRIPTEXECUTE key function [KEYS key_count key [key ...]] [INPUTS input_count input [input ...]] [ARGS arg_count arg [arg ...]] [OUTPUTS output_count output [output ...]] [TIMEOUT timeout]', - 'AI.TENSORSET key FLOAT|DOUBLE|INT8|INT16|INT32|INT64|UINT8|UINT16|STRING|BOOL shape [shape ...] [BLOB blob] [VALUES value [VALUES value ...]]' - ]; - externalPageLinks = [ - 'https://redis.io/commands/ai.modeldel', - 'https://redis.io/commands/ai.scriptstore', - 'https://redis.io/commands/ai.scriptexecute', - 'https://redis.io/commands/ai.tensorset' - ]; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - let i = 0; - while (i < filteringGroups.length) { - // Select one group from the list - await browserPage.CommandHelper.selectFilterGroupType(filteringGroups[i]); - // Click on the group - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandsToCheck[i])); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandsArgumentsToCheck[i], 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Click on Read More link for selected command - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLinks[i]); - // // Close the window with external link to switch to the application window - // await t.closeWindow(); - i++; - } - }); -test - .meta({ env: env.web })('Verify that user can work with Gears group in Command Helper (RedisGears module)', async t => { - filteringGroup = 'Gears'; - commandToCheck = 'RG.GETEXECUTION'; - commandArgumentsToCheck = 'RG.GETEXECUTION id [SHARD|CLUSTER]'; - externalPageLink = 'https://redis.io/commands/rg.getexecution'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Verify that user can see Gears group in Command Helper (RedisGears module) - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - // Select one command from the Gears list - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Verify that user can use Read More link for Gears group in Command Helper (RedisGears module) - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLink); - // // Close the window with external link to switch to the application window - // await t.closeWindow(); - }); -test - .meta({ env: env.web })('Verify that user can work with Bloom groups in Command Helper (RedisBloom module)', async t => { - filteringGroups = ['Bloom Filter', 'CMS', 'TDigest', 'TopK', 'Cuckoo Filter']; - commandsToCheck = [ - 'BF.MEXISTS', - 'CMS.QUERY', - 'TDIGEST.RESET', - 'TOPK.LIST', - 'CF.ADD' - ]; - commandsArgumentsToCheck = [ - 'BF.MEXISTS key item [item ...]', - 'CMS.QUERY key item [item ...]', - 'TDIGEST.RESET key', - 'TOPK.LIST key [withcount]', - 'CF.ADD key item' - ]; - externalPageLinks = [ - 'https://redis.io/commands/bf.mexists/', - 'https://redis.io/commands/cms.query/', - 'https://redis.io/commands/tdigest.reset/', - 'https://redis.io/commands/topk.list/', - 'https://redis.io/commands/cf.add/' - ]; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - let i = 0; - while (i < filteringGroup.length) { - // Verify that user can see Bloom, Cuckoo, CMS, TDigest, TopK groups in Command Helper (RedisBloom module) - await browserPage.CommandHelper.selectFilterGroupType(filteringGroups[i]); - // Click on the command - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandsToCheck[i])); - // Verify results of opened command - await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandsArgumentsToCheck[i], 'Selected command title not correct'); - // update after resolving testcafe Native Automation mode limitations - // // Verify that user can use Read More link for Bloom, Cuckoo, CMS, TDigest, TopK groups in Command Helper (RedisBloom module). - // await t.click(browserPage.CommandHelper.readMoreButton); - // // Check new opened window page with the correct URL - // await Common.checkURL(externalPageLinks[i]); - // // Close the window with external link to switch to the application window - // await t.closeWindow(); - i++; - } - }); -test('Verify that user can go back to list of commands for group in Command Helper', async t => { - filteringGroup = 'Search'; - commandToCheck = 'FT.EXPLAIN'; - const commandForSearch = 'EXPLAIN'; - - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select one command from the list - await t.typeText(browserPage.CommandHelper.cliHelperSearch, commandForSearch); - await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); - // Remember found commands - const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; - const filteredCommands: string[] = []; - for (let i = 0; i < commandsFilterCount; i++) { - filteredCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); - } - // Select command - await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); - // Click return button - await t.click(browserPage.CommandHelper.returnToList); - // Check that user returned to list with filter and search applied - await browserPage.CommandHelper.checkCommandsInCommandHelper(filteredCommands); - await t.expect(browserPage.CommandHelper.returnToList.exists).notOk('Return to list button still displayed'); -}); diff --git a/tests/e2e/tests/regression/database/cloud-sso.e2e.ts b/tests/e2e/tests/regression/database/cloud-sso.e2e.ts deleted file mode 100644 index 715baec2c3..0000000000 --- a/tests/e2e/tests/regression/database/cloud-sso.e2e.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as path from 'path'; -import { MyRedisDatabasePage, WelcomePage } from '../../../pageObjects'; -import { rte, env } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { deleteRowsFromTableInDB } from '../../../helpers/database-scripts'; -import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../helpers/insights'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); -const welcomePage = new WelcomePage(); - -const featuresConfigTable = 'features_config'; -const pathes = { - defaultRemote: path.join('.', 'test-data', 'features-configs', 'insights-default-remote.json'), - dockerConfig: path.join('.', 'test-data', 'features-configs', 'sso-docker-build.json'), - electronConfig: path.join('.', 'test-data', 'features-configs', 'sso-electron-build.json') -}; - -fixture `Cloud SSO` - .meta({ type: 'regression', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async() => { - await databaseAPIRequests.deleteAllDatabasesApi(); - await refreshFeaturesTestData(); - await databaseHelper.acceptLicenseTerms(); - }) - .afterEach(async() => { - // Delete database - await databaseAPIRequests.deleteAllDatabasesApi(); - await refreshFeaturesTestData(); - }); -test - .meta({ env: env.web })('Verify that user can not see the import Cloud databases on the Welcome screen for docker build', async t => { - // Update remote config .json to config with buildType filter excluding current app build - await modifyFeaturesConfigJson(pathes.dockerConfig); - await updateControlNumber(48.2); - await t.expect(welcomePage.importCloudDbBtn.exists).notOk('Import Cloud database button displayed for docker build'); - - // Verify that user can not see the import Cloud databases on the Auto-discovery flow for docker build - await t.click(welcomePage.addDbAutoBtn); - // Verify that when SSO flag disabled - Use Cloud API Keys displayed not as dropdown - await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudAccount.exists).notOk('Use Cloud Account accordion displayed for docker build'); - await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudKeys.exists).notOk('Use Cloud Keys accordion displayed for docker build'); - }); -test - .meta({ env: env.desktop }) - .before(async() => { - await databaseAPIRequests.deleteAllDatabasesApi(); - await databaseHelper.acceptLicenseTerms(); - }) - .after(async() => { - await databaseAPIRequests.deleteAllDatabasesApi(); - await myRedisDatabasePage.reloadPage(); - // Update remote config .json to default - await modifyFeaturesConfigJson(pathes.defaultRemote); - // Clear features config table - await deleteRowsFromTableInDB(featuresConfigTable); - })('Verify that user can see SSO feature if it is enabled in feature config', async t => { - // Update remote config .json to config with buildType filter excluding current app build - await modifyFeaturesConfigJson(pathes.dockerConfig); - await updateControlNumber(48.2); - // Verify that user can't see SSO feature if it is disabled in feature config - await t.expect(welcomePage.importCloudDbBtn.exists).notOk('Import Cloud database button displayed when SSO feature disabled'); - - // Update remote config .json to config with buildType filter including current app build - await modifyFeaturesConfigJson(pathes.electronConfig); - await updateControlNumber(48.2); - await t.expect(welcomePage.importCloudDbBtn.exists).ok('Import Cloud database button not displayed when SSO feature enabled'); - - await t.click(welcomePage.addDbAutoBtn); - // Verify that RE Cloud auto-discovery options Use Cloud Account and Use Cloud API Keys are displayed on Welcome screen - await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudAccount.exists).ok('Use Cloud Account accordion not displayed when SSO feature enabled'); - await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudKeys.exists).ok('Use Cloud Keys accordion not displayed when SSO feature enabled'); - }); diff --git a/tests/e2e/tests/regression/database/edit-db.e2e.ts b/tests/e2e/tests/regression/database/edit-db.e2e.ts deleted file mode 100644 index 9b1b176276..0000000000 --- a/tests/e2e/tests/regression/database/edit-db.e2e.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { - commonUrl, - ossStandaloneBigConfig, - ossStandaloneConfig -} from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const browserPage = new BrowserPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); -const apiKeyRequests = new APIKeyRequests(); - -const database = Object.assign({}, ossStandaloneConfig); -const previousDatabaseName = Common.generateWord(20); -const newDatabaseName = Common.generateWord(20); -database.databaseName = previousDatabaseName; -const keyName = Common.generateWord(10); - -fixture `List of Databases` - .meta({ type: 'regression', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async() => { - await databaseAPIRequests.deleteAllDatabasesApi(); - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(database); - }); -test - .after(async() => { - // Delete database - await databaseAPIRequests.deleteAllDatabasesApi(); - })('Verify that user can edit DB alias of Standalone DB', async t => { - await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); - // Edit alias of added database - await databaseHelper.clickOnEditDatabaseByName(database.databaseName); - - // Verify that timeout input is displayed for edit db window with default value when it wasn't specified - await t.expect(myRedisDatabasePage.AddRedisDatabase.timeoutInput.value).eql('30', 'Timeout is not defaulted to 30'); - - await t.click(myRedisDatabasePage.editAliasButton); - await t.typeText(myRedisDatabasePage.aliasInput, newDatabaseName, { replace: true }); - await t.click(myRedisDatabasePage.applyButton); - await t.click(myRedisDatabasePage.submitChangesButton); - // Verify that database has new alias - await t.expect(myRedisDatabasePage.dbNameList.withExactText(newDatabaseName).exists).ok('The database with new alias is in not the list', { timeout: 10000 }); - await t.expect(myRedisDatabasePage.dbNameList.withExactText(previousDatabaseName).exists).notOk('The database with previous alias is still in the list', { timeout: 10000 }); - }); -test - .meta({ env: env.desktop }) - .before(async() => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - }) - .after(async t => { - // Clear and delete database - await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); - await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); - await t.typeText(myRedisDatabasePage.AddRedisDatabase.portInput, ossStandaloneConfig.port, { replace: true, paste: true }); - await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); - await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); - await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); - await databaseAPIRequests.deleteAllDatabasesApi(); - })('Verify that context for previous database not saved after editing port/username/password/certificates/SSH', async t => { - const command = 'HSET'; - - // Create context modificaions and navigate to db list - await browserPage.addStringKey(keyName); - await browserPage.openKeyDetails(keyName); - await t.click(browserPage.Cli.cliExpandButton); - await t.typeText(browserPage.Cli.cliCommandInput, command, { replace: true, paste: true }); - await t.pressKey('enter'); - await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); - // Edit port of added database - await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); - await t.typeText(myRedisDatabasePage.AddRedisDatabase.portInput, ossStandaloneBigConfig.port, { replace: true, paste: true }); - await t.click(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton); - await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); - // Verify that keys from the database with new port are displayed - await t.expect(browserPage.keysSummary.find('b').withText('18 00').exists).ok('DB with new port not opened'); - // Verify that context not saved - await t.expect(browserPage.keyNameFormDetails.withExactText(keyName).exists).notOk('The key details is still selected'); - await t.expect(browserPage.Cli.cliCommandExecuted.withExactText(command).exists).notOk(`Executed command '${command}' in CLI is still displayed`); - }); diff --git a/tests/e2e/tests/regression/database/github.e2e.ts b/tests/e2e/tests/regression/database/github.e2e.ts deleted file mode 100644 index f3795c6c38..0000000000 --- a/tests/e2e/tests/regression/database/github.e2e.ts +++ /dev/null @@ -1,41 +0,0 @@ -// import {ClientFunction} from 'testcafe'; -import {rte, env} from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import {MyRedisDatabasePage} from '../../../pageObjects'; -import {commonUrl, ossStandaloneConfig} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); -// const getPageUrl = ClientFunction(() => window.location.href); - -fixture `Github functionality` - .meta({ type: 'regression' }) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTerms(); - await databaseAPIRequests.addNewStandaloneDatabaseApi(ossStandaloneConfig); - // Reload Page - await myRedisDatabasePage.reloadPage(); - }) - .afterEach(async() => { - // Delete database - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - }); -test - .meta({ rte: rte.standalone, env: env.web })('Verify that user can work with Github link in the application', async t => { - // Verify that user can see the icon for GitHub reference at the bottom of the left side bar in the List of DBs - await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button not found'); - //Verify that user can see the icon for GitHub reference at the bottom of the left side bar on the Browser page - await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); - await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button not found'); - // Verify that user can see the icon for GitHub reference at the bottom of the left side bar on the Workbench page - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button'); - // update after resolving testcafe Native Automation mode limitations - // // Verify that when user clicks on Github icon he redirects to the URL: https://github.com/RedisInsight/RedisInsight - // await t.click(myRedisDatabasePage.NavigationPanel.githubButton); - // await t.expect(getPageUrl()).contains('https://github.com/RedisInsight/RedisInsight', 'Link is not correct'); - // await t.switchToParentWindow(); - }); diff --git a/tests/e2e/tests/regression/pub-sub/debug-mode.e2e.ts b/tests/e2e/tests/regression/pub-sub/debug-mode.e2e.ts deleted file mode 100644 index 16b96b86fc..0000000000 --- a/tests/e2e/tests/regression/pub-sub/debug-mode.e2e.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, PubSubPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { verifyMessageDisplayingInPubSub } from '../../../helpers/pub-sub'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const pubSubPage = new PubSubPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -fixture `PubSub debug mode` - .meta({ type: 'regression', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - // Go to PubSub page and subscribe to channel - await t.click(myRedisDatabasePage.NavigationPanel.pubSubButton); - await t.click(pubSubPage.subscribeButton); - // Publish different messages - await pubSubPage.Cli.sendCommandInCli('10 publish channel first'); - await pubSubPage.Cli.sendCommandInCli('10 publish channel second'); - await pubSubPage.Cli.sendCommandInCli('10 publish channel third'); - }) - .afterEach(async() => { - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - }); - -test - .meta({ env: env.web })('Verify that when user navigating away and back to pubsub window the debug mode state will be reset to default auto-scroll', async t => { - // Scroll to the first messages - await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); - // Verify that new messages keep arriving in the background and user can always see up to date count of total messages received. - await pubSubPage.publishMessage('test', 'message sent in the background'); - await t.expect(pubSubPage.totalMessagesCount.textContent).contains('31', 'Total counter value is incorrect'); - // Verify that when user scroll away from the newest message the auto-scroll is stopped - await pubSubPage.Cli.sendCommandInCli('30 publish channel additionalMessages'); - await pubSubPage.publishMessage('test', 'new message with no scroll'); - await verifyMessageDisplayingInPubSub('new message with no scroll', false); - // Go to Browser Page - await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); - // Go to PubSub page - await t.click(myRedisDatabasePage.NavigationPanel.pubSubButton); - // Verify that the debug mode state is reset to default auto-scroll - await verifyMessageDisplayingInPubSub('new message with no scroll', true); - }); -test - .meta({ env: env.web })('Verify that when user scroll all the way to the newest available message (down), auto-scroll resumes automatically.', async t => { - // Scroll to the first messages - await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); - await pubSubPage.publishMessage('test', 'message to scroll'); - await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('message to scroll')); - await pubSubPage.Cli.sendCommandInCli('20 publish channel fourth'); - // Verify auto-scroll resumes automatically - await verifyMessageDisplayingInPubSub('fourth', true); - }); -test - .meta({ env: env.web })('Verify that user can get to the newest message in one click', async t => { - // Scroll to the first messages - await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); - await pubSubPage.publishMessage('test', 'new message'); - await t.click(pubSubPage.scrollDownButton); - // Verify the user scrolled to the newest message - await verifyMessageDisplayingInPubSub('new message', true); - }); diff --git a/tests/e2e/tests/regression/shortcuts/shortcuts.e2e.ts b/tests/e2e/tests/regression/shortcuts/shortcuts.e2e.ts deleted file mode 100644 index 2f2e18215b..0000000000 --- a/tests/e2e/tests/regression/shortcuts/shortcuts.e2e.ts +++ /dev/null @@ -1,83 +0,0 @@ -// import { ClientFunction } from 'testcafe'; -import { rte, env } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl } from '../../../helpers/conf'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const databaseHelper = new DatabaseHelper(); -// const getPageUrl = ClientFunction(() => window.location.href); - -fixture `Shortcuts` - .meta({ type: 'regression', rte: rte.none }) - .page(commonUrl) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTerms(); - }); -test - .meta({ env: env.web })('Verify that user can see a summary of Shortcuts by clicking "Keyboard Shortcuts" button in Help Center', async t => { - // const link = 'https://github.com/RedisInsight/RedisInsight/releases'; - - // Click on help center icon and verify panel - await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); - await t.expect(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterPanel.exists).ok('Help Center panel is not opened'); - // Click on Shortcuts option and verify panel - await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); - // Validate Title and sections of Shortcuts - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsTitle.exists).ok('shortcutsTitle is not opened'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsCLISection.exists).ok('shortcutsCLISection is not displayed'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsWorkbenchSection.exists).ok('shortcutsWorkbenchSection is not displayed'); - // Verify that user can close the Shortcuts - await t.click(myRedisDatabasePage.ShortcutsPanel.shortcutsCloseButton); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).notOk('Shortcuts panel is not displayed'); - // update after resolving testcafe Native Automation mode limitations - // // Click on the Release Notes in Help Center - // await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); - // await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterReleaseNotesButton); - // // Verify redirected link opening Release Notes in Help Center - // await t.expect(getPageUrl()).eql(link, 'The Release Notes link not correct'); - }); -test - .meta({ env: env.desktop })('Verify that user can see a summary of Shortcuts by clicking "Keyboard Shortcuts" button in Help Center for desktop', async t => { - // Click on help center icon and verify panel - await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); - await t.expect(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterPanel.exists).ok('Help Center panel is not opened'); - // Click on Shortcuts option and verify panel - await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); - // Validate Title and sections of Shortcuts - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsTitle.exists).ok('shortcutsTitle is not opened'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsDesktopApplicationSection.exists).ok('shortcutsDesktopApplicationSection is not opened'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsCLISection.exists).ok('shortcutsCLISection is not displayed'); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsWorkbenchSection.exists).ok('shortcutsWorkbenchSection is not displayed'); - // Verify that user can close the Shortcuts - await t.click(myRedisDatabasePage.ShortcutsPanel.shortcutsCloseButton); - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).notOk('Shortcuts panel is not displayed'); - }); -test('Verify that user can see description of the “up” shortcut in the Help Center > Keyboard Shortcuts > Workbench table', async t => { - const description = [ - 'Quick-access to command history', - 'Up Arrow' - ]; - const description2 = [ - 'Use Non-Redis Editor', - 'Shift+Space' - ]; - - // Open Shortcuts - await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); - await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); - - // Verify that user can see the description of the “Shift+Space” keyboard shortcut in the Keyboard Shortcuts - for (const element of description2) { - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.textContent).contains(element, 'The user can not see description of the “Shift+Space” shortcut'); - } - - // Verify that user can see description of the “up” shortcut - for (const element of description) { - await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.textContent).contains(element, 'The user can not see description of the “up” shortcut'); - } -}); diff --git a/tests/e2e/tests/regression/workbench/command-results.e2e.ts b/tests/e2e/tests/regression/workbench/command-results.e2e.ts deleted file mode 100644 index e9f013039e..0000000000 --- a/tests/e2e/tests/regression/workbench/command-results.e2e.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { WorkbenchActions } from '../../../common-actions/workbench-actions'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const workBenchActions = new WorkbenchActions(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -const indexName = Common.generateWord(5); -const commandsForIndex = [ - `FT.CREATE ${indexName} ON HASH PREFIX 1 product: SCHEMA price NUMERIC SORTABLE`, - 'HMSET product:1 price 20', - 'HMSET product:2 price 100' -]; - -fixture `Command results at Workbench` - .meta({ type: 'regression', rte: rte.standalone }) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); - // Add index and data - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - await workbenchPage.sendCommandsArrayInWorkbench(commandsForIndex); - }) - .afterEach(async t => { - // Drop index and database - await t.switchToMainWindow(); - await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); - }); -test - .meta({ env: env.web })('Verify that user can switches between Table and Text for FT.INFO and see results corresponding to their views', async t => { - const infoCommand = `FT.INFO ${indexName}`; - - // Send FT.INFO and switch to Text view - await workbenchPage.sendCommandInWorkbench(infoCommand); - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The text view is not switched for command FT.INFO'); - // Switch to Table view and check result - await workbenchPage.selectViewTypeTable(); - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.INFO'); - }); -test - .meta({ env: env.web })('Verify that user can switches between Table and Text for FT.SEARCH and see results corresponding to their views', async t => { - const searchCommand = `FT.SEARCH ${indexName} *`; - - // Send FT.SEARCH and switch to Text view - await workbenchPage.sendCommandInWorkbench(searchCommand); - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The text view is not switched for command FT.SEARCH'); - // Switch to Table view and check result - await workbenchPage.selectViewTypeTable(); - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.SEARCH'); - }); -test - .meta({ env: env.web })('Verify that user can switches between Table and Text for FT.AGGREGATE and see results corresponding to their views', async t => { - const aggregateCommand = `FT.Aggregate ${indexName} * GROUPBY 0 REDUCE MAX 1 @price AS max_price`; - - // Send FT.AGGREGATE and switch to Text view - await workbenchPage.sendCommandInWorkbench(aggregateCommand); - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The text view is not switched for command FT.AGGREGATE'); - // Switch to Table view and check result - await workbenchPage.selectViewTypeTable(); - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.AGGREGATE'); - }); -// Skipped due to issue https://redislabs.atlassian.net/browse/RI-3524 -test.skip - .meta({ env: env.web })('Verify that user can switches between views and see results according to this view in full mode in Workbench', async t => { - const command = 'CLIENT LIST'; - - // Send command and check table view is default in full mode - await workbenchPage.sendCommandInWorkbench(command); - await t.click(workbenchPage.fullScreenButton); - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTableResult).visible).ok('The search results are displayed in Table view by default'); - // Select Text view from dropdown - await t.switchToMainWindow(); - await workbenchPage.selectViewTypeText(); - // Verify that search results are displayed in Text view - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The result is displayed in Text view'); - }); -test('Big output in workbench is visible in virtualized table', async t => { - // Send commands - const command = 'graph.query t "UNWIND range(1,1000) AS x return x"'; - const bottomText = 'Query internal execution time'; - let numberOfScrolls = 0; - - // Send command in workbench with Text view type - await workbenchPage.sendCommandInWorkbench(command); - await workbenchPage.selectViewTypeText(); - - const containerOfCommand = await workbenchPage.getCardContainerByCommand(command); - const listItems = containerOfCommand.find(workbenchPage.cssRowInVirtualizedTable); - const lastExpectedItem = listItems.withText(bottomText); - - // Scroll down the virtualized list until the last row - while (!await lastExpectedItem.exists && numberOfScrolls < 100) { - const currentLastRenderedItemIndex = await listItems.count - 1; - const currentLastRenderedItemText = await listItems.nth(currentLastRenderedItemIndex).textContent; - const currentLastRenderedItem = listItems.withText(currentLastRenderedItemText); - - await t.scrollIntoView(currentLastRenderedItem); - numberOfScrolls++; - } - - // Verify that all commands scrolled - await t.expect(lastExpectedItem.visible).ok('Final execution time message not displayed'); -}); -test - .before(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .after(async t => { - await t.switchToMainWindow(); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); - })('Verify that user can see the client List visualization available for all users', async t => { - const command = 'CLIENT LIST'; - // Send command in workbench to view client list - await workbenchPage.sendCommandInWorkbench(command); - await t.expect(workbenchPage.typeSelectedClientsList.exists).ok('client list view button is not visible'); - await workBenchActions.verifyClientListColumnsAreVisible(['id', 'addr', 'name', 'user']); - // verify table view row count match with text view after client list command - await workBenchActions.verifyClientListTableViewRowCount(); - }); -test('Verify that user can clear all results at once.', async t => { - - await t.click(workbenchPage.clearResultsBtn); - await t.expect(workbenchPage.queryTextResult.exists).notOk('Clear all button does not remove commands'); -}); diff --git a/tests/e2e/tests/regression/workbench/redis-stack-commands.e2e.ts b/tests/e2e/tests/regression/workbench/redis-stack-commands.e2e.ts deleted file mode 100644 index 81643dc801..0000000000 --- a/tests/e2e/tests/regression/workbench/redis-stack-commands.e2e.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { t } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -const keyNameGraph = 'bikes_graph'; - -fixture `Redis Stack command in Workbench` - .meta({type: 'regression', rte: rte.standalone}) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .afterEach(async() => { - // Drop key and database - await t.switchToMainWindow(); - await workbenchPage.sendCommandInWorkbench(`GRAPH.DELETE ${keyNameGraph}`); - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); - }); -//skipped due the inaccessibility of the iframe -test.skip - .meta({ env: env.desktop })('Verify that user can switches between Graph and Text for GRAPH command and see results corresponding to their views', async t => { - // Send Graph command - await t.click(workbenchPage.redisStackTutorialsButton); - await t.click(workbenchPage.tutorialsWorkingWithGraphLink); - await t.click(workbenchPage.createGraphBikeButton); - await t.click(workbenchPage.submitCommandButton); - // Switch to Text view and check result - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The text view is not switched for GRAPH command'); - // Switch to Graph view and check result - await workbenchPage.selectViewTypeGraph(); - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.queryGraphContainer).exists).ok('The Graph view is not switched for GRAPH command'); - }); -//skipped due to Graph no longer displayed in tutorials -test.skip - .meta({ env: env.desktop })('Verify that user can see "No data to visualize" message for Graph command', async t => { - // Send Graph command - await t.click(workbenchPage.redisStackTutorialsButton); - await t.click(workbenchPage.tutorialsWorkingWithGraphLink); - await t.click(workbenchPage.preselectModelBikeSalesButton); - await t.click(workbenchPage.submitCommandButton); - // Check result - await t.switchToIframe(workbenchPage.iframe); - await t.expect(workbenchPage.responseInfo.textContent).eql('No data to visualize. Raw information is presented below.', 'The info message is not displayed for Graph'); - - // Get result text content - const graphModeText = await workbenchPage.parsedRedisReply.textContent; - // Switch to Text view and check result - await t.switchToMainWindow(); - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryTextResult.exists).ok('The result in text view is not displayed'); - // Verify that when there is nothing to visualize in RedisGraph, user can see just text result - await t.expect(workbenchPage.queryTextResult.textContent).notEql(graphModeText, 'Text of command in Graph mode is the same as in Text mode'); - }); -test('Verify that user can switches between Chart and Text for TimeSeries command and see results corresponding to their views', async t => { - // Send TimeSeries command - await t.click(workbenchPage.redisStackTutorialsButton); - await t.click(workbenchPage.timeSeriesLink); - await t.click(workbenchPage.showSalesPerRegiomButton); - await t.click(workbenchPage.submitCommandButton); - // Check result is in chart view - await t.expect(workbenchPage.chartViewTypeOptionSelected.exists).ok('The chart view option is not selected by default'); - // Switch to Text view and check result - await workbenchPage.selectViewTypeText(); - await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The result in text view is not displayed'); -}); diff --git a/tests/e2e/tests/regression/workbench/redisearch-module-not-available.e2e.ts b/tests/e2e/tests/regression/workbench/redisearch-module-not-available.e2e.ts deleted file mode 100644 index 0d254edf3f..0000000000 --- a/tests/e2e/tests/regression/workbench/redisearch-module-not-available.e2e.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ClientFunction } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneV5Config } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const workbenchPage = new WorkbenchPage(); -const databaseHelper = new DatabaseHelper(); -const databaseAPIRequests = new DatabaseAPIRequests(); - -const commandForSend = 'FT._LIST'; -const getPageUrl = ClientFunction(() => window.location.href); - -fixture `Redisearch module not available` - .meta({type: 'regression'}) - .page(commonUrl) - .beforeEach(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); - // Go to Workbench page - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .afterEach(async() => { - // Delete database - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); - }); -// Skipped as outdated after implementing RI-4230 -test.skip - .meta({ env: env.web, rte: rte.standalone })('Verify that user can see the "Create your free Redis database with RediSearch on Redis Cloud" button and click on it in Workbench when module in not loaded', async t => { - const link = 'https://redis.com/try-free/?utm_source=redis&utm_medium=app&utm_campaign=redisinsight_redisearch'; - - // Send command with 'FT.' - await workbenchPage.sendCommandInWorkbench(commandForSend); - // Verify the button in the results - await t.expect(await workbenchPage.queryCardNoModuleButton.visible).ok('The "Create your free Redis database with RediSearch on Redis Cloud" button is not visible'); - // Click on the button in the results - await t.click(workbenchPage.queryCardNoModuleButton); - await t.expect(getPageUrl()).contains(link, 'The Try Redis Enterprise page is not opened'); - await t.switchToParentWindow(); - }); -// https://redislabs.atlassian.net/browse/RI-4230 -test - .meta({ env: env.web, rte: rte.standalone }) - .before(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); - await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); - }) - .after(async() => { - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); - })('Verify that user can see options on what can be done to work with capabilities in Workbench for docker', async t => { - const commandJSON = 'JSON.ARRAPPEND key value'; - const commandFT = 'FT.LIST'; - await workbenchPage.sendCommandInWorkbench(commandJSON); - // Verify change screens when capability not available - 'JSON' - await t.expect(await workbenchPage.commandExecutionResult.withText('RedisJSON is not available for this database').visible) - .ok('Missing RedisJSON title is not visible'); - await workbenchPage.sendCommandInWorkbench(commandFT); - // Verify change screens when capability not available - 'Search' - await t.expect(await workbenchPage.commandExecutionResult.withText('RediSearch is not available for this database').visible) - .ok('Missing RedisSearch title is not visible'); - }); diff --git a/tests/e2e/tests/smoke/database/add-sentinel-db.e2e.ts b/tests/e2e/tests/smoke/database/add-sentinel-db.e2e.ts deleted file mode 100644 index 36cef9d481..0000000000 --- a/tests/e2e/tests/smoke/database/add-sentinel-db.e2e.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossSentinelConfig } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { MyRedisDatabasePage } from '../../../pageObjects'; - -const myRedisDatabasePage = new MyRedisDatabasePage(); -const databaseHelper = new DatabaseHelper(); - -fixture `Add DBs from Sentinel` - .page(commonUrl) - .meta({ type: 'smoke'}) - .beforeEach(async() => { - await databaseHelper.acceptLicenseTerms(); - }) - .afterEach(async() => { - //Delete database - await myRedisDatabasePage.deleteDatabaseByName(ossSentinelConfig.masters[0].alias); - await myRedisDatabasePage.deleteDatabaseByName(ossSentinelConfig.masters[1].alias); - }); -test - .meta({ env: env.web, rte: rte.standalone })('Verify that user can add Sentinel DB', async t => { - await databaseHelper.discoverSentinelDatabase(ossSentinelConfig); - await t.expect(myRedisDatabasePage.hostPort.textContent).eql(`${ossSentinelConfig.sentinelHost}:${ossSentinelConfig.sentinelPort}`, 'The sentinel database is not in the list'); - }); diff --git a/tests/e2e/tests/critical-path/a-first-start-form/user-agreements-form.e2e.ts b/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/a-first-start-form/user-agreements-form.e2e.ts rename to tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts index fb9ea53294..809f9b5e38 100644 --- a/tests/e2e/tests/critical-path/a-first-start-form/user-agreements-form.e2e.ts +++ b/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts @@ -1,8 +1,8 @@ -import { commonUrl } from '../../../helpers/conf'; -import { SettingsPage, MyRedisDatabasePage, WelcomePage } from '../../../pageObjects'; -import { Common } from '../../../helpers/common'; -import { env, rte } from '../../../helpers/constants'; -import { UserAgreementDialog } from '../../../pageObjects/dialogs'; +import { commonUrl } from '../../../../helpers/conf'; +import { SettingsPage, MyRedisDatabasePage, WelcomePage } from '../../../../pageObjects'; +import { Common } from '../../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { UserAgreementDialog } from '../../../../pageObjects/dialogs'; const userAgreementDialog = new UserAgreementDialog(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -10,7 +10,7 @@ const settingsPage = new SettingsPage(); const welcomePage = new WelcomePage(); fixture `Agreements Verification` - .meta({ type: 'critical_path', env: env.web, rte: rte.none }) + .meta({ type: 'critical_path', rte: rte.none }) .page(commonUrl) .requestHooks(Common.mockSettingsResponse()) .beforeEach(async t => { diff --git a/tests/e2e/tests/critical-path/browser/bulk-delete.e2e.ts b/tests/e2e/tests/web/critical-path/browser/bulk-delete.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/browser/bulk-delete.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/bulk-delete.e2e.ts index 99ec0f9b70..23684ecd17 100644 --- a/tests/e2e/tests/critical-path/browser/bulk-delete.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/bulk-delete.e2e.ts @@ -1,10 +1,10 @@ -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { deleteAllKeysFromDB, populateDBWithHashes } from '../../../helpers/keys'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { deleteAllKeysFromDB, populateDBWithHashes } from '../../../../helpers/keys'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/browser/bulk-upload.e2e.ts b/tests/e2e/tests/web/critical-path/browser/bulk-upload.e2e.ts similarity index 86% rename from tests/e2e/tests/critical-path/browser/bulk-upload.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/bulk-upload.e2e.ts index b10eb089d4..1509482f92 100644 --- a/tests/e2e/tests/critical-path/browser/bulk-upload.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/bulk-upload.e2e.ts @@ -1,11 +1,11 @@ import * as path from 'path'; import { t } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../helpers/keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../../helpers/keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -14,8 +14,8 @@ const databaseAPIRequests = new DatabaseAPIRequests(); const dbParameters = { host: ossStandaloneRedisearch.host, port: ossStandaloneRedisearch.port }; const filesToUpload = ['bulkUplAllKeyTypes.txt', 'bigKeysData.rtf']; const filePathes = { - allKeysFile: path.join('..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[0]), - bigDataFile: path.join('..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[1]) + allKeysFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[0]), + bigDataFile: path.join('..', '..', '..', '..', 'test-data', 'bulk-upload', filesToUpload[1]) }; const keyNames = ['hashkey1', 'listkey1', 'setkey1', 'zsetkey1', 'stringkey1', 'jsonkey1', 'streamkey1', 'graphkey1', 'tskey1']; const verifyCompletedResultText = async(resultsText: string[]): Promise => { diff --git a/tests/e2e/tests/critical-path/browser/consumer-group.e2e.ts b/tests/e2e/tests/web/critical-path/browser/consumer-group.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/browser/consumer-group.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/consumer-group.e2e.ts index 250edf73ab..7899f7cba7 100644 --- a/tests/e2e/tests/critical-path/browser/consumer-group.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/consumer-group.e2e.ts @@ -1,13 +1,13 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/context.e2e.ts b/tests/e2e/tests/web/critical-path/browser/context.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/browser/context.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/context.e2e.ts index 0dc7af682f..9125b4a017 100644 --- a/tests/e2e/tests/critical-path/browser/context.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/context.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { verifySearchFilterValue } from '../../../helpers/keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { verifySearchFilterValue } from '../../../../helpers/keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/critical-path/browser/filtering-history.e2e.ts b/tests/e2e/tests/web/critical-path/browser/filtering-history.e2e.ts similarity index 91% rename from tests/e2e/tests/critical-path/browser/filtering-history.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/filtering-history.e2e.ts index fb201db2d9..392b0a3dc2 100644 --- a/tests/e2e/tests/critical-path/browser/filtering-history.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/filtering-history.e2e.ts @@ -1,11 +1,11 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig -} from '../../../helpers/conf'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../helpers/conf'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/filtering.e2e.ts b/tests/e2e/tests/web/critical-path/browser/filtering.e2e.ts similarity index 91% rename from tests/e2e/tests/critical-path/browser/filtering.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/filtering.e2e.ts index 5fddb68409..b381f5f59b 100644 --- a/tests/e2e/tests/critical-path/browser/filtering.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/filtering.e2e.ts @@ -1,15 +1,15 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig -} from '../../../helpers/conf'; -import { keyLength, KeyTypesTexts, rte } from '../../../helpers/constants'; -import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../helpers/keys'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { keyLength, KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../../helpers/keys'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/formatters.e2e.ts b/tests/e2e/tests/web/critical-path/browser/formatters.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/browser/formatters.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/formatters.e2e.ts index 6f814852d3..d39ca364e1 100644 --- a/tests/e2e/tests/critical-path/browser/formatters.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/formatters.e2e.ts @@ -1,12 +1,12 @@ import { Selector } from 'testcafe'; -import { keyLength, rte } from '../../../helpers/constants'; -import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../helpers/keys'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { formatters, phpData } from '../../../test-data/formatters-data'; +import { keyLength, rte } from '../../../../helpers/constants'; +import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../../helpers/keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { formatters, phpData } from '../../../../test-data/formatters-data'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/hash-field.e2e.ts b/tests/e2e/tests/web/critical-path/browser/hash-field.e2e.ts similarity index 82% rename from tests/e2e/tests/critical-path/browser/hash-field.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/hash-field.e2e.ts index 747df12277..9b2f812396 100644 --- a/tests/e2e/tests/critical-path/browser/hash-field.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/hash-field.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/json-key.e2e.ts b/tests/e2e/tests/web/critical-path/browser/json-key.e2e.ts similarity index 84% rename from tests/e2e/tests/critical-path/browser/json-key.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/json-key.e2e.ts index afd8d35836..396181f30f 100644 --- a/tests/e2e/tests/critical-path/browser/json-key.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/json-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/key-details.e2e.ts b/tests/e2e/tests/web/critical-path/browser/key-details.e2e.ts similarity index 78% rename from tests/e2e/tests/critical-path/browser/key-details.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/key-details.e2e.ts index 14ba6864ca..936eaa15ee 100644 --- a/tests/e2e/tests/critical-path/browser/key-details.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/key-details.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/keylist-actions.e2e.ts b/tests/e2e/tests/web/critical-path/browser/keylist-actions.e2e.ts similarity index 76% rename from tests/e2e/tests/critical-path/browser/keylist-actions.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/keylist-actions.e2e.ts index 8d5cccb003..f55db126d9 100644 --- a/tests/e2e/tests/critical-path/browser/keylist-actions.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/keylist-actions.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/large-data.e2e.ts b/tests/e2e/tests/web/critical-path/browser/large-data.e2e.ts similarity index 81% rename from tests/e2e/tests/critical-path/browser/large-data.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/large-data.e2e.ts index 43c9711cb7..4d721612bd 100644 --- a/tests/e2e/tests/critical-path/browser/large-data.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/large-data.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { Common } from '../../../helpers/common'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { Common } from '../../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/list-key.e2e.ts b/tests/e2e/tests/web/critical-path/browser/list-key.e2e.ts similarity index 88% rename from tests/e2e/tests/critical-path/browser/list-key.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/list-key.e2e.ts index a13d87886a..8494514401 100644 --- a/tests/e2e/tests/critical-path/browser/list-key.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/list-key.e2e.ts @@ -1,15 +1,15 @@ import { toNumber } from 'lodash'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/scan-keys.e2e.ts b/tests/e2e/tests/web/critical-path/browser/scan-keys.e2e.ts similarity index 88% rename from tests/e2e/tests/critical-path/browser/scan-keys.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/scan-keys.e2e.ts index 31ad156e2c..3d51c36c0c 100644 --- a/tests/e2e/tests/critical-path/browser/scan-keys.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/scan-keys.e2e.ts @@ -1,13 +1,13 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, BrowserPage, SettingsPage -} from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/critical-path/browser/search-capabilities.e2e.ts b/tests/e2e/tests/web/critical-path/browser/search-capabilities.e2e.ts similarity index 97% rename from tests/e2e/tests/critical-path/browser/search-capabilities.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/search-capabilities.e2e.ts index 76dadd6e16..ac7d0b952d 100644 --- a/tests/e2e/tests/critical-path/browser/search-capabilities.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/search-capabilities.e2e.ts @@ -1,17 +1,17 @@ import { Selector, t } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig, ossStandaloneV5Config -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList } from '../../../helpers/keys'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/browser/set-key.e2e.ts b/tests/e2e/tests/web/critical-path/browser/set-key.e2e.ts similarity index 83% rename from tests/e2e/tests/critical-path/browser/set-key.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/set-key.e2e.ts index 912aca47df..b8062a2409 100644 --- a/tests/e2e/tests/critical-path/browser/set-key.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/set-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/stream-key-entry-deletion.e2e.ts b/tests/e2e/tests/web/critical-path/browser/stream-key-entry-deletion.e2e.ts similarity index 87% rename from tests/e2e/tests/critical-path/browser/stream-key-entry-deletion.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/stream-key-entry-deletion.e2e.ts index 990d0db0fe..13ff8aa41b 100644 --- a/tests/e2e/tests/critical-path/browser/stream-key-entry-deletion.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/stream-key-entry-deletion.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); const databaseAPIRequests = new DatabaseAPIRequests(); diff --git a/tests/e2e/tests/critical-path/browser/stream-key.e2e.ts b/tests/e2e/tests/web/critical-path/browser/stream-key.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/browser/stream-key.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/stream-key.e2e.ts index 3ce878e180..c2123af937 100644 --- a/tests/e2e/tests/critical-path/browser/stream-key.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/stream-key.e2e.ts @@ -1,15 +1,15 @@ import { Chance } from 'chance'; import { Selector } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/stream-pending-messages.e2e.ts b/tests/e2e/tests/web/critical-path/browser/stream-pending-messages.e2e.ts similarity index 92% rename from tests/e2e/tests/critical-path/browser/stream-pending-messages.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/stream-pending-messages.e2e.ts index e94ab2cad2..081eded3d6 100644 --- a/tests/e2e/tests/critical-path/browser/stream-pending-messages.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/stream-pending-messages.e2e.ts @@ -1,13 +1,13 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/browser/zset-key.e2e.ts b/tests/e2e/tests/web/critical-path/browser/zset-key.e2e.ts similarity index 84% rename from tests/e2e/tests/critical-path/browser/zset-key.e2e.ts rename to tests/e2e/tests/web/critical-path/browser/zset-key.e2e.ts index be842ee96b..4f6d1ec985 100644 --- a/tests/e2e/tests/critical-path/browser/zset-key.e2e.ts +++ b/tests/e2e/tests/web/critical-path/browser/zset-key.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { Common } from '../../../helpers/common'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { Common } from '../../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/cli/cli-command-helper.e2e.ts b/tests/e2e/tests/web/critical-path/cli/cli-command-helper.e2e.ts similarity index 61% rename from tests/e2e/tests/critical-path/cli/cli-command-helper.e2e.ts rename to tests/e2e/tests/web/critical-path/cli/cli-command-helper.e2e.ts index 6dd1fe995d..8c688fd678 100644 --- a/tests/e2e/tests/critical-path/cli/cli-command-helper.e2e.ts +++ b/tests/e2e/tests/web/critical-path/cli/cli-command-helper.e2e.ts @@ -1,8 +1,8 @@ -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { BrowserPage } from '../../../../pageObjects'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -75,47 +75,45 @@ test('Verify Command Helper search and filter', async t => { await t.expect(browserPage.CommandHelper.cliHelperTitle.innerText).contains('STRING', 'Command Group badge not displayed'); await t.expect(browserPage.CommandHelper.cliHelperSummary.innerText).contains('Appends a string to the value of a key. Creates the key if it doesn\'t exist.', 'Command summary not displayed'); }); -test - .meta({ env: env.web })('Verify that user can type TS. in Command helper and see commands from RedisTimeSeries commands.json', async t => { - const commandForSearch = 'TS.'; - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select group from list and remember commands - await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_TIMESERIES); - const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; - const timeSeriesCommands: string[] = []; - for(let i = 0; i < commandsFilterCount; i++) { - timeSeriesCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); - } - // Unselect group from list - await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_TIMESERIES); - // Search per part of command and check all opened commands - await browserPage.CommandHelper.checkSearchedCommandInCommandHelper(commandForSearch, timeSeriesCommands); - // update after resolving testcafe Native Automation mode limitations - // // Check the first command documentation url - // await browserPage.CommandHelper.checkURLCommand(timeSeriesCommands[0], `https://redis.io/commands/${timeSeriesCommands[0].toLowerCase()}/`); - // await t.switchToParentWindow(); - }); +test('Verify that user can type TS. in Command helper and see commands from RedisTimeSeries commands.json', async t => { + const commandForSearch = 'TS.'; + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select group from list and remember commands + await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_TIMESERIES); + const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; + const timeSeriesCommands: string[] = []; + for(let i = 0; i < commandsFilterCount; i++) { + timeSeriesCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); + } + // Unselect group from list + await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_TIMESERIES); + // Search per part of command and check all opened commands + await browserPage.CommandHelper.checkSearchedCommandInCommandHelper(commandForSearch, timeSeriesCommands); + // update after resolving testcafe Native Automation mode limitations + // // Check the first command documentation url + // await browserPage.CommandHelper.checkURLCommand(timeSeriesCommands[0], `https://redis.io/commands/${timeSeriesCommands[0].toLowerCase()}/`); + // await t.switchToParentWindow(); +}); // outdated after https://redislabs.atlassian.net/browse/RI-4608 -test.skip - .meta({ env: env.web })('Verify that user can type GRAPH. in Command helper and see auto-suggestions from RedisGraph commands.json', async t => { - const commandForSearch = 'GRAPH.'; - // const externalPageLink = 'https://redis.io/commands/graph.config-get/'; - // Open Command Helper - await t.click(browserPage.CommandHelper.expandCommandHelperButton); - // Select group from list and remember commands - await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_GRAPH); - const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; - const graphCommands: string[] = []; - for(let i = 0; i < commandsFilterCount; i++) { - graphCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); - } - // Unselect group from list - await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_GRAPH); - // Search per part of command and check all opened commands - await browserPage.CommandHelper.checkSearchedCommandInCommandHelper(commandForSearch, graphCommands); - // update after resolving testcafe Native Automation mode limitations - // // Check the first command documentation url - // await browserPage.CommandHelper.checkURLCommand(graphCommands[0], externalPageLink); - // await t.switchToParentWindow(); - }); +test.skip('Verify that user can type GRAPH. in Command helper and see auto-suggestions from RedisGraph commands.json', async t => { + const commandForSearch = 'GRAPH.'; + // const externalPageLink = 'https://redis.io/commands/graph.config-get/'; + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select group from list and remember commands + await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_GRAPH); + const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; + const graphCommands: string[] = []; + for(let i = 0; i < commandsFilterCount; i++) { + graphCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); + } + // Unselect group from list + await browserPage.CommandHelper.selectFilterGroupType(COMMAND_GROUP_GRAPH); + // Search per part of command and check all opened commands + await browserPage.CommandHelper.checkSearchedCommandInCommandHelper(commandForSearch, graphCommands); + // update after resolving testcafe Native Automation mode limitations + // // Check the first command documentation url + // await browserPage.CommandHelper.checkURLCommand(graphCommands[0], externalPageLink); + // await t.switchToParentWindow(); +}); diff --git a/tests/e2e/tests/critical-path/cli/cli-critical.e2e.ts b/tests/e2e/tests/web/critical-path/cli/cli-critical.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/cli/cli-critical.e2e.ts rename to tests/e2e/tests/web/critical-path/cli/cli-critical.e2e.ts index cec9a5011b..586f5d37c1 100644 --- a/tests/e2e/tests/critical-path/cli/cli-critical.e2e.ts +++ b/tests/e2e/tests/web/critical-path/cli/cli-critical.e2e.ts @@ -1,14 +1,14 @@ import { Chance } from 'chance'; -import { Common } from '../../../helpers/common'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { DatabaseHelper } from '../../../helpers/database'; +import { Common } from '../../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; import { commonUrl, ossClusterConfig, ossStandaloneConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/cluster-details/cluster-details.e2e.ts b/tests/e2e/tests/web/critical-path/cluster-details/cluster-details.e2e.ts similarity index 92% rename from tests/e2e/tests/critical-path/cluster-details/cluster-details.e2e.ts rename to tests/e2e/tests/web/critical-path/cluster-details/cluster-details.e2e.ts index 2303f9d77e..7d4bd8b59a 100644 --- a/tests/e2e/tests/critical-path/cluster-details/cluster-details.e2e.ts +++ b/tests/e2e/tests/web/critical-path/cluster-details/cluster-details.e2e.ts @@ -1,10 +1,10 @@ import { Selector } from 'testcafe'; -import { BrowserPage, MyRedisDatabasePage, ClusterDetailsPage, WorkbenchPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossClusterConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { BrowserPage, MyRedisDatabasePage, ClusterDetailsPage, WorkbenchPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossClusterConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const clusterDetailsPage = new ClusterDetailsPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/database-overview/database-index.e2e.ts b/tests/e2e/tests/web/critical-path/database-overview/database-index.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/database-overview/database-index.e2e.ts rename to tests/e2e/tests/web/critical-path/database-overview/database-index.e2e.ts index 209efe1bc2..8e523bf85c 100644 --- a/tests/e2e/tests/critical-path/database-overview/database-index.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database-overview/database-index.e2e.ts @@ -1,15 +1,15 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { Common } from '../../../helpers/common'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; import { MyRedisDatabasePage, BrowserPage, WorkbenchPage, MemoryEfficiencyPage -} from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList, verifySearchFilterValue } from '../../../helpers/keys'; +} from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList, verifySearchFilterValue } from '../../../../helpers/keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/critical-path/database-overview/database-overview.e2e.ts b/tests/e2e/tests/web/critical-path/database-overview/database-overview.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/database-overview/database-overview.e2e.ts rename to tests/e2e/tests/web/critical-path/database-overview/database-overview.e2e.ts index 88dc1891e3..b6bd6cb85f 100644 --- a/tests/e2e/tests/critical-path/database-overview/database-overview.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database-overview/database-overview.e2e.ts @@ -1,20 +1,20 @@ import { Chance } from 'chance'; import { Selector } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { rte } from '../../../helpers/constants'; -import { Common } from '../../../helpers/common'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; import { MyRedisDatabasePage, BrowserPage, WorkbenchPage -} from '../../../pageObjects'; +} from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch, ossStandaloneBigConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/database/clone-databases.e2e.ts b/tests/e2e/tests/web/critical-path/database/clone-databases.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/database/clone-databases.e2e.ts rename to tests/e2e/tests/web/critical-path/database/clone-databases.e2e.ts index 51cec4c848..ff0d396931 100644 --- a/tests/e2e/tests/critical-path/database/clone-databases.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database/clone-databases.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossClusterConfig, ossSentinelConfig, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossClusterConfig, ossSentinelConfig, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/database/connecting-to-the-db.e2e.ts b/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/database/connecting-to-the-db.e2e.ts rename to tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts index dd636ac17f..e179965d69 100644 --- a/tests/e2e/tests/critical-path/database/connecting-to-the-db.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { BrowserPage, MyRedisDatabasePage, WelcomePage } from '../../../pageObjects'; -import { commonUrl, invalidOssStandaloneConfig, ossStandaloneForSSHConfig } from '../../../helpers/conf'; -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { sshPrivateKey, sshPrivateKeyWithPasscode } from '../../../test-data/sshPrivateKeys'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage, MyRedisDatabasePage, WelcomePage } from '../../../../pageObjects'; +import { commonUrl, invalidOssStandaloneConfig, ossStandaloneForSSHConfig } from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { sshPrivateKey, sshPrivateKeyWithPasscode } from '../../../../test-data/sshPrivateKeys'; +import { Common } from '../../../../helpers/common'; // import { BrowserActions } from '../../../common-actions/browser-actions'; const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/database/export-databases.e2e.ts b/tests/e2e/tests/web/critical-path/database/export-databases.e2e.ts similarity index 93% rename from tests/e2e/tests/critical-path/database/export-databases.e2e.ts rename to tests/e2e/tests/web/critical-path/database/export-databases.e2e.ts index b999f564e8..734c483ae3 100644 --- a/tests/e2e/tests/critical-path/database/export-databases.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database/export-databases.e2e.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import { join as joinPath } from 'path'; -import { rte } from '../../../helpers/constants'; -import { MyRedisDatabasePage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; import { cloudDatabaseConfig, commonUrl, @@ -10,10 +10,10 @@ import { ossSentinelConfig, ossStandaloneConfig, ossStandaloneTlsConfig -} from '../../../helpers/conf'; -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { DatabasesActions } from '../../../common-actions/databases-actions'; +} from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { DatabasesActions } from '../../../../common-actions/databases-actions'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databasesActions = new DatabasesActions(); @@ -36,11 +36,9 @@ test await myRedisDatabasePage.reloadPage(); }) .after(async() => { - // Delete all databases + // Delete exported file fs.unlinkSync(joinPath(fileDownloadPath, foundExportedFiles[0])); await databaseAPIRequests.deleteAllDatabasesApi(); - // await databaseAPIRequests.deleteOSSClusterDatabaseApi(ossClusterConfig); - // Delete exported file })('Exporting Standalone, OSS Cluster, and Sentinel connection types', async t => { const databaseNames = [ ossStandaloneConfig.databaseName, @@ -97,7 +95,6 @@ test await databaseHelper.clickOnEditDatabaseByName(ossStandaloneConfig.databaseName); await t.expect(myRedisDatabasePage.AddRedisDatabase.selectCompressor.textContent).eql(compressor, 'Compressor import incorrect'); - }); test .before(async() => { diff --git a/tests/e2e/tests/critical-path/database/import-databases.e2e.ts b/tests/e2e/tests/web/critical-path/database/import-databases.e2e.ts similarity index 93% rename from tests/e2e/tests/critical-path/database/import-databases.e2e.ts rename to tests/e2e/tests/web/critical-path/database/import-databases.e2e.ts index 0dbafbfad7..d591e50e15 100644 --- a/tests/e2e/tests/critical-path/database/import-databases.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database/import-databases.e2e.ts @@ -1,11 +1,11 @@ import * as path from 'path'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { DatabasesActions } from '../../../common-actions/databases-actions'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { DatabasesActions } from '../../../../common-actions/databases-actions'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -22,12 +22,12 @@ const fileNames = { racompFullSSHJson: 'racompFullSSH.json' }; const filePathes = { - ardmValidPath: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.ardmValidAno), - racompassInvalidJsonPath: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.racompassInvalidJson), - rdmPath: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.rdmFullJson), - rdmCertsPath: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.rdmCertsJson), - racompassValidJson: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.racompassValidJson), - racompassSshPath: path.join('..', '..', '..', 'test-data', 'import-databases', fileNames.racompFullSSHJson) + ardmValidPath: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.ardmValidAno), + racompassInvalidJsonPath: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.racompassInvalidJson), + rdmPath: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.rdmFullJson), + rdmCertsPath: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.rdmCertsJson), + racompassValidJson: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.racompassValidJson), + racompassSshPath: path.join('..', '..', '..', '..', 'test-data', 'import-databases', fileNames.racompFullSSHJson) }; const rdmListOfDB = databasesActions.parseDbJsonByPath(path.join('test-data', 'import-databases', fileNames.rdmFullJson)); diff --git a/tests/e2e/tests/critical-path/database/logical-databases.e2e.ts b/tests/e2e/tests/web/critical-path/database/logical-databases.e2e.ts similarity index 90% rename from tests/e2e/tests/critical-path/database/logical-databases.e2e.ts rename to tests/e2e/tests/web/critical-path/database/logical-databases.e2e.ts index cb7eed7b03..4a5a43764d 100644 --- a/tests/e2e/tests/critical-path/database/logical-databases.e2e.ts +++ b/tests/e2e/tests/web/critical-path/database/logical-databases.e2e.ts @@ -1,7 +1,7 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/web/critical-path/database/modules.e2e.ts b/tests/e2e/tests/web/critical-path/database/modules.e2e.ts new file mode 100644 index 0000000000..a05e863335 --- /dev/null +++ b/tests/e2e/tests/web/critical-path/database/modules.e2e.ts @@ -0,0 +1,89 @@ +import { Chance } from 'chance'; +import { Selector } from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const chance = new Chance(); + +const moduleNameList = ['RediSearch', 'RedisJSON', 'RedisGraph', 'RedisTimeSeries', 'RedisBloom', 'RedisGears', 'RedisAI']; +const moduleList = [myRedisDatabasePage.moduleSearchIcon, myRedisDatabasePage.moduleJSONIcon, myRedisDatabasePage.moduleGraphIcon, myRedisDatabasePage.moduleTimeseriesIcon, myRedisDatabasePage.moduleBloomIcon, myRedisDatabasePage.moduleGearsIcon, myRedisDatabasePage.moduleAIIcon]; +const uniqueId = chance.string({ length: 10 }); +let database = { + ...ossStandaloneRedisearch, + databaseName: `test_standalone-redisearch-${uniqueId}` +}; + +fixture `Database modules` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + database = { + ...ossStandaloneRedisearch, + databaseName: `test_standalone-redisearch-${uniqueId}` + }; + await databaseAPIRequests.addNewStandaloneDatabaseApi(database); + // Reload Page + await browserPage.reloadPage(); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteStandaloneDatabaseApi(database); + }); +test('Verify that user can see DB modules on DB list page for Standalone DB', async t => { + // Check module column on DB list page + await t.expect(myRedisDatabasePage.moduleColumn.exists).ok('Module column not found'); + // Verify that user can see the following sorting order: Search, JSON, Graph, TimeSeries, Bloom, Gears, AI for modules + const databaseLine = myRedisDatabasePage.dbNameList.withExactText(database.databaseName).parent('tr'); + await t.expect(databaseLine.visible).ok('Database not found in db list'); + const moduleIcons = databaseLine.find('[data-testid^=Redi]'); + const numberOfIcons = await moduleIcons.count; + for (let i = 0; i < numberOfIcons; i++) { + const moduleName = await moduleIcons.nth(i).getAttribute('data-testid'); + const expectedName = await moduleList[i].getAttribute('data-testid'); + await t.expect(moduleName).eql(expectedName, `${moduleName} icon not found`); + } + //Minimize the window to check quantifier + await t.resizeWindow(1000, 700); + //Verify that user can see +N icon (where N>1) on DB list page when modules icons don't fit the Module column width + await t.expect(myRedisDatabasePage.moduleQuantifier.textContent).eql('+3'); + await t.expect(myRedisDatabasePage.moduleQuantifier.exists).ok('Quantifier icon not found'); + //Verify that user can hover over the module icons and see tooltip with all modules name + await t.hover(myRedisDatabasePage.moduleQuantifier); + await t.expect(myRedisDatabasePage.moduleTooltip.visible).ok('Module tooltip not found'); + //Verify that user can hover over the module icons and see tooltip with version. + await myRedisDatabasePage.checkModulesInTooltip(moduleNameList); +}); +test('Verify that user can see full module list in the Edit mode', async t => { + // Verify that module column is displayed + await t.expect(myRedisDatabasePage.moduleColumn.visible).ok('Module column not found'); + // Open Edit mode + await t.click(myRedisDatabasePage.editDatabaseButton); + // Verify that module column is not displayed + await t.expect(myRedisDatabasePage.moduleColumn.exists).notOk('Module column not found'); + // Verify modules in Edit mode + await myRedisDatabasePage.checkModulesOnPage(moduleList); +}); +test('Verify that user can see icons in DB header for RediSearch, RedisGraph, RedisJSON, RedisBloom, RedisTimeSeries, RedisGears, RedisAI default modules', async t => { + // Connect to DB + await myRedisDatabasePage.clickOnDBByName(database.databaseName); + // Check all available modules in overview + const moduleIcons = Selector('div').find('[data-testid^=Redi]'); + const numberOfIcons = await moduleIcons.count; + for (let i = 0; i < numberOfIcons; i++) { + const moduleName = await moduleIcons.nth(i).getAttribute('data-testid'); + await t.expect(moduleName).eql(await moduleList[i].getAttribute('data-testid'), 'Correct icon not found'); + } + // Verify that if DB has more than 6 modules loaded, user can click on three dots and see other modules in the tooltip + await t.click(browserPage.OverviewPanel.overviewMoreInfo); + for (let j = numberOfIcons; j < moduleNameList.length; j++) { + await t.expect(browserPage.OverviewPanel.overviewTooltip.withText(moduleNameList[j]).visible).ok('Tooltip module not found'); + } +}); diff --git a/tests/e2e/tests/critical-path/memory-efficiency/memory-efficiency.e2e.ts b/tests/e2e/tests/web/critical-path/memory-efficiency/memory-efficiency.e2e.ts similarity index 86% rename from tests/e2e/tests/critical-path/memory-efficiency/memory-efficiency.e2e.ts rename to tests/e2e/tests/web/critical-path/memory-efficiency/memory-efficiency.e2e.ts index 0ec0ba91a1..ad75b106d5 100644 --- a/tests/e2e/tests/critical-path/memory-efficiency/memory-efficiency.e2e.ts +++ b/tests/e2e/tests/web/critical-path/memory-efficiency/memory-efficiency.e2e.ts @@ -1,11 +1,11 @@ import { Chance } from 'chance'; -import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage, WorkbenchPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { verifySearchFilterValue } from '../../../helpers/keys'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage, WorkbenchPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { verifySearchFilterValue } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const memoryEfficiencyPage = new MemoryEfficiencyPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -36,31 +36,31 @@ fixture `Memory Efficiency` .afterEach(async() => { await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); }); -test.before(async t => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); - // Go to Analysis Tools page - await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); - await browserPage.Cli.sendCommandInCli('flushdb'); - -})('No reports/keys message and report tooltip', async t => { - const noReportsMessage = 'No Reports foundRun "New Analysis" to generate first report.'; - const noKeysMessage = 'No keys to displayUse Workbench Guides and Tutorials to quickly load the data.'; - const tooltipText = 'Analyze up to 10 000 keys to get an overview of your data and recommendations'; +test + .before(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + // Go to Analysis Tools page + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + await browserPage.Cli.sendCommandInCli('flushdb'); + })('No reports/keys message and report tooltip', async t => { + const noReportsMessage = 'No Reports foundRun "New Analysis" to generate first report.'; + const noKeysMessage = 'No keys to displayUse Workbench Guides and Tutorials to quickly load the data.'; + const tooltipText = 'Analyze up to 10 000 keys to get an overview of your data and recommendations'; - // Verify that user can see the “No reports found” message when report wasn't generated - await t.expect(memoryEfficiencyPage.noReportsText.textContent).eql(noReportsMessage, 'No reports message not displayed or text is invalid'); - // Verify that user can see the “No keys to display” message when there are no keys in database - await t.click(memoryEfficiencyPage.newReportBtn); - await t.expect(memoryEfficiencyPage.noKeysText.textContent).eql(noKeysMessage, 'No keys message not displayed or text is invalid'); - // Verify that user can open workbench page from No keys to display message - await t.click(browserPage.NavigationPanel.workbenchButton); - await t.expect(workbenchPage.expandArea.visible).ok('Workbench page is not opened'); - // Turn back to Memory Efficiency page - await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); - // Verify that user can see a tooltip when hovering over the icon on the right of the “New analysis” button - await t.hover(memoryEfficiencyPage.reportTooltipIcon); - await t.expect(browserPage.tooltip.textContent).contains(tooltipText, 'Report tooltip is not displayed or text is invalid'); -}); + // Verify that user can see the “No reports found” message when report wasn't generated + await t.expect(memoryEfficiencyPage.noReportsText.textContent).eql(noReportsMessage, 'No reports message not displayed or text is invalid'); + // Verify that user can see the “No keys to display” message when there are no keys in database + await t.click(memoryEfficiencyPage.newReportBtn); + await t.expect(memoryEfficiencyPage.noKeysText.textContent).eql(noKeysMessage, 'No keys message not displayed or text is invalid'); + // Verify that user can open workbench page from No keys to display message + await t.click(browserPage.NavigationPanel.workbenchButton); + await t.expect(workbenchPage.expandArea.visible).ok('Workbench page is not opened'); + // Turn back to Memory Efficiency page + await t.click(myRedisDatabasePage.NavigationPanel.analysisPageButton); + // Verify that user can see a tooltip when hovering over the icon on the right of the “New analysis” button + await t.hover(memoryEfficiencyPage.reportTooltipIcon); + await t.expect(browserPage.tooltip.textContent).contains(tooltipText, 'Report tooltip is not displayed or text is invalid'); + }); test .before(async t => { await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); @@ -229,9 +229,9 @@ test // Create new report await t.click(memoryEfficiencyPage.newReportBtn); // Points are displayed in graph according to their TTL - const firstPointLocation = +((await memoryEfficiencyPage.firstPoint.getAttribute('y')).slice(0, 2)); + const firstPointLocation = +((await memoryEfficiencyPage.firstPoint.getAttribute('y'))!.slice(0, 2)); const thirdPointLocation = await memoryEfficiencyPage.thirdPoint.getAttribute('y'); - const fourthPointLocation = +((await memoryEfficiencyPage.fourthPoint.getAttribute('y')).slice(0, 2)); + const fourthPointLocation = +((await memoryEfficiencyPage.fourthPoint.getAttribute('y'))!.slice(0, 2)); const noExpiryDefaultPointLocation = memoryEfficiencyPage.noExpiryPoint; await t.expect(firstPointLocation).lt(yAxis, 'Point in <1 hr breakdown doesn\'t contain key'); @@ -240,7 +240,7 @@ test await t.expect(noExpiryDefaultPointLocation.visible).notOk('No expiry breakdown displayed when toggle is off', { timeout: 1000 }); // No Expiry toggle shows No expiry breakdown await t.click(memoryEfficiencyPage.showNoExpiryToggle); - const noExpiryPointLocation = +((await memoryEfficiencyPage.noExpiryPoint.getAttribute('y')).slice(0, 2)); + const noExpiryPointLocation = +((await memoryEfficiencyPage.noExpiryPoint.getAttribute('y'))!.slice(0, 2)); await t.expect(noExpiryPointLocation).lt(yAxis, 'Point in No expiry breakdown doesn\'t contain key'); }); test diff --git a/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts b/tests/e2e/tests/web/critical-path/memory-efficiency/recommendations.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts rename to tests/e2e/tests/web/critical-path/memory-efficiency/recommendations.e2e.ts index 33f3b0b339..776c4a7daf 100644 --- a/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts +++ b/tests/e2e/tests/web/critical-path/memory-efficiency/recommendations.e2e.ts @@ -1,16 +1,16 @@ -import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage, WorkbenchPage } from '../../../pageObjects'; -import { RecommendationIds, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; +import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage, WorkbenchPage } from '../../../../pageObjects'; +import { RecommendationIds, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig, ossStandaloneV5Config -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { RecommendationsActions } from '../../../common-actions/recommendations-actions'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { RecommendationsActions } from '../../../../common-actions/recommendations-actions'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const memoryEfficiencyPage = new MemoryEfficiencyPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/memory-efficiency/top-keys-table.e2e.ts b/tests/e2e/tests/web/critical-path/memory-efficiency/top-keys-table.e2e.ts similarity index 92% rename from tests/e2e/tests/critical-path/memory-efficiency/top-keys-table.e2e.ts rename to tests/e2e/tests/web/critical-path/memory-efficiency/top-keys-table.e2e.ts index 4c8e46fa40..9e417e3ebe 100644 --- a/tests/e2e/tests/critical-path/memory-efficiency/top-keys-table.e2e.ts +++ b/tests/e2e/tests/web/critical-path/memory-efficiency/top-keys-table.e2e.ts @@ -1,13 +1,13 @@ import { Chance } from 'chance'; import { Selector } from 'testcafe'; -import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { deleteAllKeysFromDB, populateDBWithHashes, populateHashWithFields } from '../../../helpers/keys'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { MyRedisDatabasePage, MemoryEfficiencyPage, BrowserPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { deleteAllKeysFromDB, populateDBWithHashes, populateHashWithFields } from '../../../../helpers/keys'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const memoryEfficiencyPage = new MemoryEfficiencyPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/web/critical-path/monitor/monitor.e2e.ts b/tests/e2e/tests/web/critical-path/monitor/monitor.e2e.ts new file mode 100644 index 0000000000..b79adef488 --- /dev/null +++ b/tests/e2e/tests/web/critical-path/monitor/monitor.e2e.ts @@ -0,0 +1,75 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { + MyRedisDatabasePage, + WorkbenchPage, + BrowserPage +} from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +const keyName = `${Common.generateWord(20)}-key`; +const keyValue = `${Common.generateWord(10)}-value`; + +fixture `Monitor` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can work with Monitor', async t => { + const command = 'set'; + //Verify that user can open Monitor + await t.click(browserPage.Profiler.expandMonitor); + //Check that monitor is opened + await t.expect(browserPage.Profiler.monitorArea.exists).ok('Profiler area'); + await t.expect(browserPage.Profiler.startMonitorButton.exists).ok('Start profiler button'); + //Verify that user can see message inside Monitor "Running Monitor will decrease throughput, avoid running it in production databases." when opens it for the first time + await t.expect(browserPage.Profiler.monitorWarningMessage.exists).ok('Profiler warning message'); + await t.expect(browserPage.Profiler.monitorWarningMessage.withText('Running Profiler will decrease throughput, avoid running it in production databases.').exists).ok('Profiler warning message is not correct'); + //Verify that user can run Monitor by clicking "Run" command in the message inside Monitor + await t.click(browserPage.Profiler.startMonitorButton); + await t.expect(browserPage.Profiler.monitorIsStartedText.innerText).eql('Profiler is started.'); + //Verify that user can see run commands in monitor + await browserPage.Cli.getSuccessCommandResultFromCli(`${command} ${keyName} ${keyValue}`); + await browserPage.Profiler.checkCommandInMonitorResults(command, [keyName, keyValue]); +}); +test('Verify that user can see the list of all commands from all clients ran for this Redis database in the list of results in Monitor', async t => { + //Define commands in different clients + const cli_command = 'command'; + const workbench_command = 'hello'; + const common_command = 'info'; + const browser_command = 'hset'; + //Start Monitor + await browserPage.Profiler.startMonitor(); + //Send command in CLI + await browserPage.Cli.getSuccessCommandResultFromCli(cli_command); + //Check that command from CLI is displayed in monitor + await browserPage.Profiler.checkCommandInMonitorResults(cli_command); + //Refresh the page to send command from Browser client + await t.click(browserPage.refreshKeysButton); + //Check the command from browser client + await browserPage.addHashKey(keyName); + await browserPage.Profiler.checkCommandInMonitorResults(browser_command); + //Open Workbench page to create new client + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + //Send command in Workbench + await workbenchPage.sendCommandInWorkbench(workbench_command); + //Check that command from Workbench is displayed in monitor + await workbenchPage.Profiler.checkCommandInMonitorResults(workbench_command); + //Check the command from common client + await workbenchPage.Profiler.checkCommandInMonitorResults(common_command); +}); diff --git a/tests/e2e/tests/critical-path/monitor/save-commands.e2e.ts b/tests/e2e/tests/web/critical-path/monitor/save-commands.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/monitor/save-commands.e2e.ts rename to tests/e2e/tests/web/critical-path/monitor/save-commands.e2e.ts index 9ab2fd3257..18c3e5f889 100644 --- a/tests/e2e/tests/critical-path/monitor/save-commands.e2e.ts +++ b/tests/e2e/tests/web/critical-path/monitor/save-commands.e2e.ts @@ -1,14 +1,14 @@ import * as fs from 'fs'; import * as os from 'os'; import { join as joinPath } from 'path'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/notifications/notification-center.e2e.ts b/tests/e2e/tests/web/critical-path/notifications/notification-center.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/notifications/notification-center.e2e.ts rename to tests/e2e/tests/web/critical-path/notifications/notification-center.e2e.ts index b8c5aeb4a1..09eb937d38 100644 --- a/tests/e2e/tests/critical-path/notifications/notification-center.e2e.ts +++ b/tests/e2e/tests/web/critical-path/notifications/notification-center.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { deleteAllNotificationsFromDB } from '../../../helpers/notifications'; -import { commonUrl } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { MyRedisDatabasePage, SettingsPage } from '../../../pageObjects'; -import { NotificationParameters } from '../../../pageObjects/components/navigation/notification-panel'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { deleteAllNotificationsFromDB } from '../../../../helpers/notifications'; +import { commonUrl } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects'; +import { NotificationParameters } from '../../../../pageObjects/components/navigation/notification-panel'; const description = require('./notifications.json'); const jsonNotifications: NotificationParameters[] = description.notifications; diff --git a/tests/e2e/tests/critical-path/notifications/notifications.json b/tests/e2e/tests/web/critical-path/notifications/notifications.json similarity index 100% rename from tests/e2e/tests/critical-path/notifications/notifications.json rename to tests/e2e/tests/web/critical-path/notifications/notifications.json diff --git a/tests/e2e/tests/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts b/tests/e2e/tests/web/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts rename to tests/e2e/tests/web/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts index c504375e47..7d0c2c7cc3 100644 --- a/tests/e2e/tests/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts +++ b/tests/e2e/tests/web/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, PubSubPage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { verifyMessageDisplayingInPubSub } from '../../../helpers/pub-sub'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, PubSubPage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { verifyMessageDisplayingInPubSub } from '../../../../helpers/pub-sub'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const pubSubPage = new PubSubPage(); @@ -12,7 +12,7 @@ const databaseHelper = new DatabaseHelper(); const databaseAPIRequests = new DatabaseAPIRequests(); fixture `Subscribe/Unsubscribe from a channel` - .meta({ env: env.web, rte: rte.standalone, type: 'critical_path' }) + .meta({ rte: rte.standalone, type: 'critical_path' }) .page(commonUrl) .beforeEach(async t => { await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); diff --git a/tests/e2e/tests/critical-path/settings/settings.e2e.ts b/tests/e2e/tests/web/critical-path/settings/settings.e2e.ts similarity index 89% rename from tests/e2e/tests/critical-path/settings/settings.e2e.ts rename to tests/e2e/tests/web/critical-path/settings/settings.e2e.ts index 17b51cd6bb..fcc26fdc21 100644 --- a/tests/e2e/tests/critical-path/settings/settings.e2e.ts +++ b/tests/e2e/tests/web/critical-path/settings/settings.e2e.ts @@ -1,7 +1,7 @@ -import { MyRedisDatabasePage, SettingsPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl } from '../../../helpers/conf'; +import { MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl } from '../../../../helpers/conf'; const myRedisDatabasePage = new MyRedisDatabasePage(); const settingsPage = new SettingsPage(); diff --git a/tests/e2e/tests/critical-path/slow-log/slow-log.e2e.ts b/tests/e2e/tests/web/critical-path/slow-log/slow-log.e2e.ts similarity index 96% rename from tests/e2e/tests/critical-path/slow-log/slow-log.e2e.ts rename to tests/e2e/tests/web/critical-path/slow-log/slow-log.e2e.ts index 9526ce26e3..f04578921f 100644 --- a/tests/e2e/tests/critical-path/slow-log/slow-log.e2e.ts +++ b/tests/e2e/tests/web/critical-path/slow-log/slow-log.e2e.ts @@ -1,8 +1,8 @@ -import { SlowLogPage, MyRedisDatabasePage, BrowserPage, ClusterDetailsPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { SlowLogPage, MyRedisDatabasePage, BrowserPage, ClusterDetailsPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const slowLogPage = new SlowLogPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/critical-path/tree-view/delimiter.e2e.ts b/tests/e2e/tests/web/critical-path/tree-view/delimiter.e2e.ts similarity index 83% rename from tests/e2e/tests/critical-path/tree-view/delimiter.e2e.ts rename to tests/e2e/tests/web/critical-path/tree-view/delimiter.e2e.ts index 9d0c06b0ee..1a800a1ba0 100644 --- a/tests/e2e/tests/critical-path/tree-view/delimiter.e2e.ts +++ b/tests/e2e/tests/web/critical-path/tree-view/delimiter.e2e.ts @@ -1,8 +1,8 @@ -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/web/critical-path/tree-view/tree-view-improvements.e2e.ts b/tests/e2e/tests/web/critical-path/tree-view/tree-view-improvements.e2e.ts new file mode 100644 index 0000000000..f3db07e435 --- /dev/null +++ b/tests/e2e/tests/web/critical-path/tree-view/tree-view-improvements.e2e.ts @@ -0,0 +1,197 @@ +import { Selector, t } from 'testcafe'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { verifyKeysDisplayedInTheList, verifyKeysNotDisplayedInTheList } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +let keyNames: string[]; +let keyName1: string; +let keyName2: string; +let keyNameSingle: string; +let index: string; + +fixture `Tree view navigations improvement tests` + .meta({ type: 'critical_path', rte: rte.standalone }) + .page(commonUrl); +test + .before(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .after(async() => { + await t.click(browserPage.patternModeBtn); + await browserPage.deleteKeysByNames(keyNames); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + })('Tree view preselected folder', async t => { + keyName1 = Common.generateWord(10); // used to create index name + keyName2 = Common.generateWord(10); // used to create index name + keyNameSingle = Common.generateWord(10); + keyNames = [`${keyName1}:1`, `${keyName1}:2`, `${keyName2}:1`, `${keyName2}:2`, keyNameSingle]; + + const commands = [ + 'flushdb', + `HSET ${keyNames[0]} field value`, + `HSET ${keyNames[1]} field value`, + `HSET ${keyNames[2]} field value`, + `HSET ${keyNames[3]} field value`, + `SADD ${keyNames[4]} value` + ]; + + // Create 5 keys + await browserPage.Cli.sendCommandsInCli(commands); + await t.click(browserPage.treeViewButton); + // The folder without any patterns selected and the list of keys is displayed when there is a folder without any patterns + await verifyKeysDisplayedInTheList([keyNameSingle]); + + await browserPage.openTreeFolders([await browserPage.getTextFromNthTreeElement(1)]); + await browserPage.selectFilterGroupType(KeyTypesTexts.Set); + // The folder without any namespaces is selected (if exists) when folder does not exist after search/filter + await verifyKeysDisplayedInTheList([keyNameSingle]); + + await browserPage.setAllKeyType(); + // The folder without any patterns selected and the list of keys is displayed when there is a folder without any patterns + await verifyKeysDisplayedInTheList([keyNameSingle]); + await verifyKeysNotDisplayedInTheList([`${keyNames[0]}:1`, `${keyNames[2]}:2`]); + + // switch between browser view and tree view + await t.click(browserPage.browserViewButton) + .click(browserPage.treeViewButton); + await browserPage.deleteKeyByName(keyNames[4]); + await t.click(browserPage.clearFilterButton); + // get first folder name + const firstTreeItemText = await browserPage.getTextFromNthTreeElement(0); + const firstTreeItemKeys = Selector(`[data-testid="node-item_${firstTreeItemText}:keys:keys:"]`); // keys after node item opened + // The first folder with namespaces is expanded and selected when there is no folder without any patterns + await t.expect(firstTreeItemKeys.visible) + .ok('First folder is not expanded'); + await verifyKeysDisplayedInTheList([`${firstTreeItemText}:1`, `${firstTreeItemText}:2`]); + + const commands1 = [ + `HSET ${keyNames[4]} field value` + ]; + + await browserPage.Cli.sendCommandsInCli(commands1); + await t.click(browserPage.refreshKeysButton); + // Refreshed Tree view preselected folder + await t.expect(firstTreeItemKeys.visible) + .ok('Folder is not selected'); + await verifyKeysDisplayedInTheList([`${firstTreeItemText}:1`, `${firstTreeItemText}:2`]); + + await browserPage.selectFilterGroupType(KeyTypesTexts.Hash); + await t.expect(firstTreeItemKeys.visible).ok('Folder is not selected after searching with HASH'); + // Filtered Tree view preselected folder + await verifyKeysDisplayedInTheList([`${firstTreeItemText}:1`, `${firstTreeItemText}:2`]); + + await browserPage.searchByKeyName('*'); + // Search capability Filtered Tree view preselected folder + await t.expect(firstTreeItemKeys.visible).ok('Folder is not selected'); + await verifyKeysDisplayedInTheList([`${firstTreeItemText}:1`, `${firstTreeItemText}:2`]); + + await t.click(browserPage.clearFilterButton); + // Filtered Tree view preselected folder + await t.expect(firstTreeItemKeys.visible).ok('Folder is not selected'); + await verifyKeysDisplayedInTheList([`${firstTreeItemText}:1`, `${firstTreeItemText}:2`]); + + await browserPage.selectFilterGroupType(KeyTypesTexts.Stream); + // Filtered Tree view preselected folder + await t.expect(browserPage.keyListTable.textContent).contains('No results found.', 'Key is not found message not displayed'); + + await browserPage.setAllKeyType(); // clear stream from filter + // Filtered Tree view preselected folder + await t.expect(browserPage.keyListTable.textContent).notContains('No results found.', 'Key is not found message still displayed'); + await t.expect( + firstTreeItemKeys.exists) + .notOk('First folder is expanded'); + }); + +test + .before(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .after(async() => { + await browserPage.Cli.sendCommandInCli(`FT.DROPINDEX ${index}`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + })('Verify tree view navigation for index based search', async t => { + keyName1 = Common.generateWord(10); // used to create index name + keyName2 = Common.generateWord(10); // used to create index name + const subFolder1 = Common.generateWord(10); // used to create index name + keyNames = [`${keyName1}:${subFolder1}:1`, `${keyName1}:${subFolder1}:2`, `${keyName2}:1:1`, `${keyName2}:1:2`]; + const commands = [ + 'flushdb', + `HSET ${keyNames[0]} field value`, + `HSET ${keyNames[1]} field value`, + `HSET ${keyNames[2]} field value`, + `HSET ${keyNames[3]} field value` + ]; + await browserPage.Cli.sendCommandsInCli(commands); + + // generate index based on keyName + const folders = [keyName1, subFolder1]; + index = await browserPage.Cli.createIndexwithCLI(folders.join(':')); + await t.click(browserPage.redisearchModeBtn); // click redisearch button + await browserPage.selectIndexByName(index); + await t.click(browserPage.treeViewButton); + await t.click(Selector(`[data-testid="${`node-item_${folders[0]}:`}"]`)); // close folder + await browserPage.openTreeFolders(folders); + await t.click(browserPage.refreshKeysButton); + // Refreshed Tree view preselected folder for index based search + await t.expect( + Selector(`[data-testid="node-item_${folders[0]}:${folders[1]}:keys:keys:"]`).visible) + .ok('Folder is not selected'); + }); + +test + .before(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .after(async() => { + await t.click(browserPage.patternModeBtn); + for (const element of keyNames.slice(1)) { + await apiKeyRequests.deleteKeyByNameApi(element, ossStandaloneConfig.databaseName); + } + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + })('Search capability Refreshed Tree view preselected folder', async t => { + keyName1 = Common.generateWord(10); + keyName2 = Common.generateWord(10); + keyNameSingle = Common.generateWord(10); + keyNames = [`${keyName1}:1`, `${keyName1}:2`, `${keyName2}:1`, `${keyName2}:2`, keyNameSingle]; + const commands = [ + 'flushdb', + `HSET ${keyNames[0]} field value`, + `HSET ${keyNames[1]} field value`, + `RPUSH ${keyNames[2]} field`, + `RPUSH ${keyNames[3]} field`, + `SADD ${keyNames[4]} value` + ]; + await browserPage.Cli.sendCommandsInCli(commands); + await t.click(browserPage.treeViewButton); + // The folder without any patterns selected and the list of keys is displayed when there is a folder without any patterns + await verifyKeysDisplayedInTheList([keyNameSingle]); + + await browserPage.openTreeFolders([keyName1]); // Type: hash + await browserPage.openTreeFolders([keyName2]); // Type: list + await browserPage.selectFilterGroupType(KeyTypesTexts.Hash); + // The first folder with namespaces is expanded and selected when folder and folder without any namespaces does not exist after search/filter + await verifyKeysDisplayedInTheList([keyNames[0], keyNames[1]]); + + await browserPage.setAllKeyType(); + await browserPage.Cli.sendCommandsInCli([`DEL ${keyNames[0]}`]); + await t.click(browserPage.refreshKeysButton); // refresh keys + // The previously selected folder is preselected when key does not exist after keys refresh + await verifyKeysDisplayedInTheList([keyNames[1]]); + await verifyKeysNotDisplayedInTheList([keyNames[0], keyNames[2], keyNames[3], keyNames[4]]); + + await browserPage.searchByKeyName('*'); + await t.click(browserPage.refreshKeysButton); + // Search capability Refreshed Tree view preselected folder + await verifyKeysDisplayedInTheList([keyNames[1]]); + await verifyKeysNotDisplayedInTheList([keyNames[0], keyNames[2], keyNames[3], keyNames[4]]); + }); diff --git a/tests/e2e/tests/critical-path/tree-view/tree-view.e2e.ts b/tests/e2e/tests/web/critical-path/tree-view/tree-view.e2e.ts similarity index 87% rename from tests/e2e/tests/critical-path/tree-view/tree-view.e2e.ts rename to tests/e2e/tests/web/critical-path/tree-view/tree-view.e2e.ts index 3ff8703a3f..74175a7508 100644 --- a/tests/e2e/tests/critical-path/tree-view/tree-view.e2e.ts +++ b/tests/e2e/tests/web/critical-path/tree-view/tree-view.e2e.ts @@ -1,11 +1,11 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { rte, KeyTypesTexts } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { verifySearchFilterValue } from '../../../helpers/keys'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { rte, KeyTypesTexts } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { verifySearchFilterValue } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/critical-path/triggers-and-functions/libraries.e2e.ts b/tests/e2e/tests/web/critical-path/triggers-and-functions/libraries.e2e.ts similarity index 88% rename from tests/e2e/tests/critical-path/triggers-and-functions/libraries.e2e.ts rename to tests/e2e/tests/web/critical-path/triggers-and-functions/libraries.e2e.ts index d80af4bf2b..8cab2d068f 100644 --- a/tests/e2e/tests/critical-path/triggers-and-functions/libraries.e2e.ts +++ b/tests/e2e/tests/web/critical-path/triggers-and-functions/libraries.e2e.ts @@ -1,18 +1,18 @@ import * as path from 'path'; -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { BrowserPage, TriggersAndFunctionsFunctionsPage, TriggersAndFunctionsLibrariesPage -} from '../../../pageObjects'; +} from '../../../../pageObjects'; import { commonUrl, ossClusterRedisGears, ossStandaloneRedisGears -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -23,8 +23,8 @@ const triggersAndFunctionsFunctionsPage = new TriggersAndFunctionsFunctionsPage( const libraryName = Common.generateWord(5); const filePathes = { - upload: path.join('..', '..', '..', 'test-data', 'triggers-and-functions', 'library.txt'), - invoke: path.join('..', '..', '..', 'test-data', 'triggers-and-functions', 'invoke_function.txt') + upload: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'library.txt'), + invoke: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'invoke_function.txt') }; fixture `Triggers and Functions` diff --git a/tests/e2e/tests/critical-path/url-handling/url-handling.e2e.ts b/tests/e2e/tests/web/critical-path/url-handling/url-handling.e2e.ts similarity index 91% rename from tests/e2e/tests/critical-path/url-handling/url-handling.e2e.ts rename to tests/e2e/tests/web/critical-path/url-handling/url-handling.e2e.ts index c15dbd970b..26f33fd8c1 100644 --- a/tests/e2e/tests/critical-path/url-handling/url-handling.e2e.ts +++ b/tests/e2e/tests/web/critical-path/url-handling/url-handling.e2e.ts @@ -1,9 +1,9 @@ -import { commonUrl, ossStandaloneRedisGears } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { DatabaseHelper } from '../../../helpers/database'; +import { commonUrl, ossStandaloneRedisGears } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/autocomplete.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/autocomplete.e2e.ts similarity index 91% rename from tests/e2e/tests/critical-path/workbench/autocomplete.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/autocomplete.e2e.ts index a54cf37275..58da68269e 100644 --- a/tests/e2e/tests/critical-path/workbench/autocomplete.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/autocomplete.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/command-results.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/command-results.e2e.ts similarity index 95% rename from tests/e2e/tests/critical-path/workbench/command-results.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/command-results.e2e.ts index d05ebc2fc0..ac4e43621b 100644 --- a/tests/e2e/tests/critical-path/workbench/command-results.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/command-results.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/context.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/context.e2e.ts similarity index 79% rename from tests/e2e/tests/critical-path/workbench/context.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/context.e2e.ts index 9a63341570..ba1892f705 100644 --- a/tests/e2e/tests/critical-path/workbench/context.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/context.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/cypher.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/cypher.e2e.ts similarity index 88% rename from tests/e2e/tests/critical-path/workbench/cypher.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/cypher.e2e.ts index a867146201..288c300b0c 100644 --- a/tests/e2e/tests/critical-path/workbench/cypher.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/cypher.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/default-scripts-area.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/default-scripts-area.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/workbench/default-scripts-area.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/default-scripts-area.e2e.ts index 6a329d0b58..271e86e35c 100644 --- a/tests/e2e/tests/critical-path/workbench/default-scripts-area.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/default-scripts-area.e2e.ts @@ -1,10 +1,10 @@ import { Chance } from 'chance'; -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Telemetry } from '../../../helpers/telemetry'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Telemetry } from '../../../../helpers/telemetry'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/redisearch-module-not-available.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/redisearch-module-not-available.e2e.ts similarity index 77% rename from tests/e2e/tests/critical-path/workbench/redisearch-module-not-available.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/redisearch-module-not-available.e2e.ts index 2d9dcc7ebe..76b9505c00 100644 --- a/tests/e2e/tests/critical-path/workbench/redisearch-module-not-available.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/redisearch-module-not-available.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneV5Config } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/critical-path/workbench/scripting-area.e2e.ts b/tests/e2e/tests/web/critical-path/workbench/scripting-area.e2e.ts similarity index 94% rename from tests/e2e/tests/critical-path/workbench/scripting-area.e2e.ts rename to tests/e2e/tests/web/critical-path/workbench/scripting-area.e2e.ts index 595bf954a6..4fc4f744c6 100644 --- a/tests/e2e/tests/critical-path/workbench/scripting-area.e2e.ts +++ b/tests/e2e/tests/web/critical-path/workbench/scripting-area.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/browser/add-keys.e2e.ts b/tests/e2e/tests/web/regression/browser/add-keys.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/browser/add-keys.e2e.ts rename to tests/e2e/tests/web/regression/browser/add-keys.e2e.ts index 2badd61303..82a11fb17f 100644 --- a/tests/e2e/tests/regression/browser/add-keys.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/add-keys.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { BrowserActions } from '../../../common-actions/browser-actions'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { BrowserActions } from '../../../../common-actions/browser-actions'; const browserPage = new BrowserPage(); const browserActions = new BrowserActions(); diff --git a/tests/e2e/tests/regression/browser/consumer-group.e2e.ts b/tests/e2e/tests/web/regression/browser/consumer-group.e2e.ts similarity index 94% rename from tests/e2e/tests/regression/browser/consumer-group.e2e.ts rename to tests/e2e/tests/web/regression/browser/consumer-group.e2e.ts index 0182733bfe..351fe26094 100644 --- a/tests/e2e/tests/regression/browser/consumer-group.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/consumer-group.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/context.e2e.ts b/tests/e2e/tests/web/regression/browser/context.e2e.ts similarity index 87% rename from tests/e2e/tests/regression/browser/context.e2e.ts rename to tests/e2e/tests/web/regression/browser/context.e2e.ts index 87db780b3b..c54087b6a4 100644 --- a/tests/e2e/tests/regression/browser/context.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/context.e2e.ts @@ -1,14 +1,14 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, BrowserPage -} from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { verifySearchFilterValue } from '../../../helpers/keys'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { verifySearchFilterValue } from '../../../../helpers/keys'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/browser/filtering-iteratively.e2e.ts b/tests/e2e/tests/web/regression/browser/filtering-iteratively.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/browser/filtering-iteratively.e2e.ts rename to tests/e2e/tests/web/regression/browser/filtering-iteratively.e2e.ts index 59ea2b06b3..a8b6dae260 100644 --- a/tests/e2e/tests/regression/browser/filtering-iteratively.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/filtering-iteratively.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossClusterConfig, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossClusterConfig, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/filtering.e2e.ts b/tests/e2e/tests/web/regression/browser/filtering.e2e.ts similarity index 95% rename from tests/e2e/tests/regression/browser/filtering.e2e.ts rename to tests/e2e/tests/web/regression/browser/filtering.e2e.ts index 501bf75ddb..a637a6e8bc 100644 --- a/tests/e2e/tests/regression/browser/filtering.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/filtering.e2e.ts @@ -1,12 +1,12 @@ import { Selector } from 'testcafe'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { keyTypes } from '../../../helpers/keys'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { keyTypes } from '../../../../helpers/keys'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/format-switcher.e2e.ts b/tests/e2e/tests/web/regression/browser/format-switcher.e2e.ts similarity index 91% rename from tests/e2e/tests/regression/browser/format-switcher.e2e.ts rename to tests/e2e/tests/web/regression/browser/format-switcher.e2e.ts index 3f5e4b1798..267cc12ee1 100644 --- a/tests/e2e/tests/regression/browser/format-switcher.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/format-switcher.e2e.ts @@ -1,10 +1,10 @@ -import { keyLength, rte } from '../../../helpers/constants'; -import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../helpers/keys'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { keyLength, rte } from '../../../../helpers/constants'; +import { addKeysViaCli, deleteKeysViaCli, keyTypes } from '../../../../helpers/keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/regression/browser/formatter-warning.e2e.ts b/tests/e2e/tests/web/regression/browser/formatter-warning.e2e.ts similarity index 89% rename from tests/e2e/tests/regression/browser/formatter-warning.e2e.ts rename to tests/e2e/tests/web/regression/browser/formatter-warning.e2e.ts index 6687c45f78..bf3093da2f 100644 --- a/tests/e2e/tests/regression/browser/formatter-warning.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/formatter-warning.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/full-screen.e2e.ts b/tests/e2e/tests/web/regression/browser/full-screen.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/browser/full-screen.e2e.ts rename to tests/e2e/tests/web/regression/browser/full-screen.e2e.ts index 1fcec6ebb9..f92a185890 100644 --- a/tests/e2e/tests/regression/browser/full-screen.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/full-screen.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/handle-dbsize-permissions.e2e.ts b/tests/e2e/tests/web/regression/browser/handle-dbsize-permissions.e2e.ts similarity index 89% rename from tests/e2e/tests/regression/browser/handle-dbsize-permissions.e2e.ts rename to tests/e2e/tests/web/regression/browser/handle-dbsize-permissions.e2e.ts index b942bc349e..f60bf6edc5 100644 --- a/tests/e2e/tests/regression/browser/handle-dbsize-permissions.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/handle-dbsize-permissions.e2e.ts @@ -1,14 +1,14 @@ import { t } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneNoPermissionsConfig -} from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +} from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/regression/browser/hash-field.e2e.ts b/tests/e2e/tests/web/regression/browser/hash-field.e2e.ts similarity index 78% rename from tests/e2e/tests/regression/browser/hash-field.e2e.ts rename to tests/e2e/tests/web/regression/browser/hash-field.e2e.ts index 4093620adb..e33ed7fa37 100644 --- a/tests/e2e/tests/regression/browser/hash-field.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/hash-field.e2e.ts @@ -1,11 +1,11 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { populateHashWithFields } from '../../../helpers/keys'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { populateHashWithFields } from '../../../../helpers/keys'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/key-messages.e2e.ts b/tests/e2e/tests/web/regression/browser/key-messages.e2e.ts similarity index 87% rename from tests/e2e/tests/regression/browser/key-messages.e2e.ts rename to tests/e2e/tests/web/regression/browser/key-messages.e2e.ts index 1db24b1059..f000bc28af 100644 --- a/tests/e2e/tests/regression/browser/key-messages.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/key-messages.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/browser/keys-all-databases.e2e.ts b/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts similarity index 90% rename from tests/e2e/tests/regression/browser/keys-all-databases.e2e.ts rename to tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts index 9ea292292d..da80a78075 100644 --- a/tests/e2e/tests/regression/browser/keys-all-databases.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts @@ -1,7 +1,7 @@ import { Selector, t } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; import { cloudDatabaseConfig, commonUrl, @@ -9,11 +9,11 @@ import { ossSentinelConfig, ossStandaloneBigConfig, redisEnterpriseClusterConfig -} from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { BrowserActions } from '../../../common-actions/browser-actions'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { BrowserActions } from '../../../../common-actions/browser-actions'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -77,7 +77,7 @@ test await verifyKeysAdded(); }); test - .meta({ env: env.web, rte: rte.sentinel }) + .meta({ rte: rte.sentinel }) .before(async() => { await databaseHelper.acceptLicenseTermsAndAddSentinelDatabaseApi(ossSentinelConfig); }) diff --git a/tests/e2e/tests/regression/browser/large-key-details-values.e2e.ts b/tests/e2e/tests/web/regression/browser/large-key-details-values.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/browser/large-key-details-values.e2e.ts rename to tests/e2e/tests/web/regression/browser/large-key-details-values.e2e.ts index 983f04686f..8d3614486e 100644 --- a/tests/e2e/tests/regression/browser/large-key-details-values.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/large-key-details-values.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/last-refresh.e2e.ts b/tests/e2e/tests/web/regression/browser/last-refresh.e2e.ts similarity index 81% rename from tests/e2e/tests/regression/browser/last-refresh.e2e.ts rename to tests/e2e/tests/web/regression/browser/last-refresh.e2e.ts index 0e90208400..61731b9187 100644 --- a/tests/e2e/tests/regression/browser/last-refresh.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/last-refresh.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/list-key.e2e.ts b/tests/e2e/tests/web/regression/browser/list-key.e2e.ts similarity index 78% rename from tests/e2e/tests/regression/browser/list-key.e2e.ts rename to tests/e2e/tests/web/regression/browser/list-key.e2e.ts index 0a2210cf39..2ea70f9b64 100644 --- a/tests/e2e/tests/regression/browser/list-key.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/list-key.e2e.ts @@ -1,11 +1,11 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { populateListWithElements } from '../../../helpers/keys'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { populateListWithElements } from '../../../../helpers/keys'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/onboarding.e2e.ts b/tests/e2e/tests/web/regression/browser/onboarding.e2e.ts similarity index 96% rename from tests/e2e/tests/regression/browser/onboarding.e2e.ts rename to tests/e2e/tests/web/regression/browser/onboarding.e2e.ts index c98ae75824..337754c95c 100644 --- a/tests/e2e/tests/regression/browser/onboarding.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/onboarding.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { commonUrl, ossStandaloneConfigEmpty -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { Common } from '../../../helpers/common'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; import { MemoryEfficiencyPage, SlowLogPage, @@ -11,9 +11,9 @@ import { PubSubPage, MyRedisDatabasePage, BrowserPage, TriggersAndFunctionsFunctionsPage -} from '../../../pageObjects'; -import { Telemetry } from '../../../helpers/telemetry'; -import { OnboardingCardsDialog } from '../../../pageObjects/dialogs'; +} from '../../../../pageObjects'; +import { Telemetry } from '../../../../helpers/telemetry'; +import { OnboardingCardsDialog } from '../../../../pageObjects/dialogs'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/browser/resize-columns.e2e.ts b/tests/e2e/tests/web/regression/browser/resize-columns.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/browser/resize-columns.e2e.ts rename to tests/e2e/tests/web/regression/browser/resize-columns.e2e.ts index 75df30840c..c5ff0a2b2b 100644 --- a/tests/e2e/tests/regression/browser/resize-columns.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/resize-columns.e2e.ts @@ -1,12 +1,12 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, BrowserPage -} from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +} from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/browser/scan-keys.e2e.ts b/tests/e2e/tests/web/regression/browser/scan-keys.e2e.ts similarity index 83% rename from tests/e2e/tests/regression/browser/scan-keys.e2e.ts rename to tests/e2e/tests/web/regression/browser/scan-keys.e2e.ts index 044c7e0728..647e1195f4 100644 --- a/tests/e2e/tests/regression/browser/scan-keys.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/scan-keys.e2e.ts @@ -1,7 +1,7 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, SettingsPage } from '../../../pageObjects'; -import { commonUrl } from '../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects'; +import { commonUrl } from '../../../../helpers/conf'; const myRedisDatabasePage = new MyRedisDatabasePage(); const settingsPage = new SettingsPage(); diff --git a/tests/e2e/tests/regression/browser/set-key.e2e.ts b/tests/e2e/tests/web/regression/browser/set-key.e2e.ts similarity index 78% rename from tests/e2e/tests/regression/browser/set-key.e2e.ts rename to tests/e2e/tests/web/regression/browser/set-key.e2e.ts index 09ac7fdc75..089d5ca6f5 100644 --- a/tests/e2e/tests/regression/browser/set-key.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/set-key.e2e.ts @@ -1,11 +1,11 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { populateSetWithMembers } from '../../../helpers/keys'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { populateSetWithMembers } from '../../../../helpers/keys'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/stream-key.e2e.ts b/tests/e2e/tests/web/regression/browser/stream-key.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/browser/stream-key.e2e.ts rename to tests/e2e/tests/web/regression/browser/stream-key.e2e.ts index b773ba9593..2261ae03a8 100644 --- a/tests/e2e/tests/regression/browser/stream-key.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/stream-key.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { rte } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/stream-pending-messages.e2e.ts b/tests/e2e/tests/web/regression/browser/stream-pending-messages.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/browser/stream-pending-messages.e2e.ts rename to tests/e2e/tests/web/regression/browser/stream-pending-messages.e2e.ts index 705625baf7..1b607180e2 100644 --- a/tests/e2e/tests/regression/browser/stream-pending-messages.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/stream-pending-messages.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/survey-link.e2e.ts b/tests/e2e/tests/web/regression/browser/survey-link.e2e.ts similarity index 84% rename from tests/e2e/tests/regression/browser/survey-link.e2e.ts rename to tests/e2e/tests/web/regression/browser/survey-link.e2e.ts index 863473972e..25ccdd89e7 100644 --- a/tests/e2e/tests/regression/browser/survey-link.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/survey-link.e2e.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { env, rte } from '../../../helpers/constants'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; // import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -15,8 +15,7 @@ const databaseAPIRequests = new DatabaseAPIRequests(); fixture `User Survey` .meta({ type: 'regression', - rte: rte.standalone, - env: env.web + rte: rte.standalone }) .page(commonUrl) .beforeEach(async() => { diff --git a/tests/e2e/tests/regression/browser/ttl-format.e2e.ts b/tests/e2e/tests/web/regression/browser/ttl-format.e2e.ts similarity index 89% rename from tests/e2e/tests/regression/browser/ttl-format.e2e.ts rename to tests/e2e/tests/web/regression/browser/ttl-format.e2e.ts index 58884586c8..ba39510384 100644 --- a/tests/e2e/tests/regression/browser/ttl-format.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/ttl-format.e2e.ts @@ -1,11 +1,11 @@ import { Selector } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { keyTypes } from '../../../helpers/keys'; -import { rte, COMMANDS_TO_CREATE_KEY, keyLength } from '../../../helpers/constants'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { keyTypes } from '../../../../helpers/keys'; +import { rte, COMMANDS_TO_CREATE_KEY, keyLength } from '../../../../helpers/constants'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/browser/upload-json-key.e2e.ts b/tests/e2e/tests/web/regression/browser/upload-json-key.e2e.ts similarity index 78% rename from tests/e2e/tests/regression/browser/upload-json-key.e2e.ts rename to tests/e2e/tests/web/regression/browser/upload-json-key.e2e.ts index 5cd1defe3a..fd64007c5e 100644 --- a/tests/e2e/tests/regression/browser/upload-json-key.e2e.ts +++ b/tests/e2e/tests/web/regression/browser/upload-json-key.e2e.ts @@ -1,16 +1,16 @@ import * as path from 'path'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); const databaseAPIRequests = new DatabaseAPIRequests(); -const filePath = path.join('..', '..', '..', 'test-data', 'upload-json', 'sample.json'); +const filePath = path.join('..', '..', '..', '..', 'test-data', 'upload-json', 'sample.json'); const jsonValues = ['Live JSON generator', '3.1', '"2014-06-25T00:00:00.000Z"', 'true']; const keyName = Common.generateWord(10); diff --git a/tests/e2e/tests/web/regression/cli/cli-command-helper.e2e.ts b/tests/e2e/tests/web/regression/cli/cli-command-helper.e2e.ts new file mode 100644 index 0000000000..218fc831b8 --- /dev/null +++ b/tests/e2e/tests/web/regression/cli/cli-command-helper.e2e.ts @@ -0,0 +1,270 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { Common } from '../../../../helpers/common'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { BrowserPage } from '../../../../pageObjects'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +let filteringGroup = ''; +let filteringGroups: string[] = []; +let commandToCheck = ''; +let commandsToCheck: string[] = []; +let commandArgumentsToCheck = ''; +let commandsArgumentsToCheck: string[] = []; +let externalPageLink = ''; +let externalPageLinks: string[] = []; + +fixture `CLI Command helper` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can open/close CLI separately from Command Helper', async t => { + // Open CLI + await t.click(browserPage.Cli.cliExpandButton); + // Verify that CLI is opened separately + await t.expect(browserPage.CommandHelper.commandHelperArea.visible).notOk('Command Helper is not closed'); + await t.expect(browserPage.Cli.cliCollapseButton.visible).ok('CLI is not opended'); + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Verify that user can close CLI separately + await t.click(browserPage.Cli.cliCollapseButton); + await t.expect(browserPage.CommandHelper.commandHelperArea.visible).ok('Command Helper is not displayed'); + await t.expect(browserPage.Cli.cliCollapseButton.visible).notOk('CLI is not closed'); + + // Verify that user can open/close Command Helper separately from CLI + await t.expect(browserPage.CommandHelper.commandHelperArea.visible).ok('Command Helper is not opened'); + await t.expect(browserPage.Cli.cliCollapseButton.visible).notOk('CLI is not closed'); + // Open CLI + await t.click(browserPage.Cli.cliExpandButton); + // Verify that Command Helper is closed separately + await t.click(browserPage.CommandHelper.closeCommandHelperButton); + await t.expect(browserPage.CommandHelper.commandHelperArea.visible).notOk('Command Helper is not closed'); + await t.expect(browserPage.Cli.cliCollapseButton.visible).ok('CLI is not opended'); +}); +test('Verify that user can see that Command Helper is minimized when he clicks the "minimize" button', async t => { + const helperColourBefore = await Common.getBackgroundColour(browserPage.CommandHelper.commandHelperBadge); + // Open Command Helper and minimize + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + await t.click(browserPage.CommandHelper.minimizeCommandHelperButton); + // Verify Command helper is minimized + const helperColourAfter = await Common.getBackgroundColour(browserPage.CommandHelper.commandHelperBadge); + await t.expect(helperColourAfter).notEql(helperColourBefore, 'Command helper badge colour is not changed'); + await t.expect(browserPage.Cli.minimizeCliButton.visible).eql(false, 'Command helper is not mimized'); +}); +test('Verify that user can see that Command Helper displays the previous information when he re-opens it', async t => { + filteringGroup = 'Search'; + commandToCheck = 'FT.EXPLAIN'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select one command from the list + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Minimize and re-open Command Helper + await t.click(browserPage.CommandHelper.minimizeCommandHelperButton); + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Verify Command helper information + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).contains(commandToCheck, 'Command Helper information not persists after reopening'); +}); +test('Verify that user can see in Command helper and click on new group "JSON", can choose it and see list of commands in the group', async t => { + filteringGroup = 'JSON'; + commandToCheck = 'JSON.SET'; + commandArgumentsToCheck = 'JSON.SET key path value [condition]'; + externalPageLink = 'https://redis.io/commands/json.set/'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select one command from the list + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Click on Read More link for selected command + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLink); + // await t.switchToParentWindow(); +}); +test('Verify that user can see in Command helper and click on new group "Search", can choose it and see list of commands in the group', async t => { + filteringGroup = 'Search'; + commandToCheck = 'FT.EXPLAIN'; + commandArgumentsToCheck = 'FT.EXPLAIN index query [dialect]'; + externalPageLink = 'https://redis.io/commands/ft.explain/'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select one command from the list + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Click on Read More link for selected command + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLink); + // await t.switchToParentWindow(); +}); +test('Verify that user can see HyperLogLog title in Command Helper for this command group', async t => { + filteringGroup = 'HyperLogLog'; + commandToCheck = 'PFCOUNT'; + commandArgumentsToCheck = 'PFCOUNT key [key ...]'; + externalPageLink = 'https://redis.io/commands/pfcount/'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select one command from the list + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Click on Read More link for selected command + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLink); + // // await t.expect(getPageUrl()).eql(externalPageLink, 'The opened page'); + // await t.switchToParentWindow(); +}); +test('Verify that user can see all separated groups for AI json file (model, tensor, inference, script)', async t => { + filteringGroups = ['Model', 'Script', 'Inference', 'Tensor']; + commandsToCheck = [ + 'AI.MODELDEL', + 'AI.SCRIPTSTORE', + 'AI.SCRIPTEXECUTE', + 'AI.TENSORSET' + ]; + commandsArgumentsToCheck = [ + 'AI.MODELDEL key', + 'AI.SCRIPTSTORE key CPU|GPU [TAG tag] ENTRY_POINTS entry_point_count entry_point [entry_point ...]', + 'AI.SCRIPTEXECUTE key function [KEYS key_count key [key ...]] [INPUTS input_count input [input ...]] [ARGS arg_count arg [arg ...]] [OUTPUTS output_count output [output ...]] [TIMEOUT timeout]', + 'AI.TENSORSET key FLOAT|DOUBLE|INT8|INT16|INT32|INT64|UINT8|UINT16|STRING|BOOL shape [shape ...] [BLOB blob] [VALUES value [VALUES value ...]]' + ]; + externalPageLinks = [ + 'https://redis.io/commands/ai.modeldel', + 'https://redis.io/commands/ai.scriptstore', + 'https://redis.io/commands/ai.scriptexecute', + 'https://redis.io/commands/ai.tensorset' + ]; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + let i = 0; + while (i < filteringGroups.length) { + // Select one group from the list + await browserPage.CommandHelper.selectFilterGroupType(filteringGroups[i]); + // Click on the group + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandsToCheck[i])); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandsArgumentsToCheck[i], 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Click on Read More link for selected command + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLinks[i]); + // // Close the window with external link to switch to the application window + // await t.closeWindow(); + i++; + } +}); +test('Verify that user can work with Gears group in Command Helper (RedisGears module)', async t => { + filteringGroup = 'Gears'; + commandToCheck = 'RG.GETEXECUTION'; + commandArgumentsToCheck = 'RG.GETEXECUTION id [SHARD|CLUSTER]'; + externalPageLink = 'https://redis.io/commands/rg.getexecution'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Verify that user can see Gears group in Command Helper (RedisGears module) + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + // Select one command from the Gears list + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandArgumentsToCheck, 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Verify that user can use Read More link for Gears group in Command Helper (RedisGears module) + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLink); + // // Close the window with external link to switch to the application window + // await t.closeWindow(); +}); +test('Verify that user can work with Bloom groups in Command Helper (RedisBloom module)', async t => { + filteringGroups = ['Bloom Filter', 'CMS', 'TDigest', 'TopK', 'Cuckoo Filter']; + commandsToCheck = [ + 'BF.MEXISTS', + 'CMS.QUERY', + 'TDIGEST.RESET', + 'TOPK.LIST', + 'CF.ADD' + ]; + commandsArgumentsToCheck = [ + 'BF.MEXISTS key item [item ...]', + 'CMS.QUERY key item [item ...]', + 'TDIGEST.RESET key', + 'TOPK.LIST key [withcount]', + 'CF.ADD key item' + ]; + externalPageLinks = [ + 'https://redis.io/commands/bf.mexists/', + 'https://redis.io/commands/cms.query/', + 'https://redis.io/commands/tdigest.reset/', + 'https://redis.io/commands/topk.list/', + 'https://redis.io/commands/cf.add/' + ]; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + let i = 0; + while (i < filteringGroup.length) { + // Verify that user can see Bloom, Cuckoo, CMS, TDigest, TopK groups in Command Helper (RedisBloom module) + await browserPage.CommandHelper.selectFilterGroupType(filteringGroups[i]); + // Click on the command + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandsToCheck[i])); + // Verify results of opened command + await t.expect(browserPage.CommandHelper.cliHelperTitleArgs.textContent).eql(commandsArgumentsToCheck[i], 'Selected command title not correct'); + // update after resolving testcafe Native Automation mode limitations + // // Verify that user can use Read More link for Bloom, Cuckoo, CMS, TDigest, TopK groups in Command Helper (RedisBloom module). + // await t.click(browserPage.CommandHelper.readMoreButton); + // // Check new opened window page with the correct URL + // await Common.checkURL(externalPageLinks[i]); + // // Close the window with external link to switch to the application window + // await t.closeWindow(); + i++; + } +}); +test('Verify that user can go back to list of commands for group in Command Helper', async t => { + filteringGroup = 'Search'; + commandToCheck = 'FT.EXPLAIN'; + const commandForSearch = 'EXPLAIN'; + + // Open Command Helper + await t.click(browserPage.CommandHelper.expandCommandHelperButton); + // Select one command from the list + await t.typeText(browserPage.CommandHelper.cliHelperSearch, commandForSearch); + await browserPage.CommandHelper.selectFilterGroupType(filteringGroup); + // Remember found commands + const commandsFilterCount = await browserPage.CommandHelper.cliHelperOutputTitles.count; + const filteredCommands: string[] = []; + for (let i = 0; i < commandsFilterCount; i++) { + filteredCommands.push(await browserPage.CommandHelper.cliHelperOutputTitles.nth(i).textContent); + } + // Select command + await t.click(browserPage.CommandHelper.cliHelperOutputTitles.withExactText(commandToCheck)); + // Click return button + await t.click(browserPage.CommandHelper.returnToList); + // Check that user returned to list with filter and search applied + await browserPage.CommandHelper.checkCommandsInCommandHelper(filteredCommands); + await t.expect(browserPage.CommandHelper.returnToList.exists).notOk('Return to list button still displayed'); +}); diff --git a/tests/e2e/tests/regression/cli/cli-logical-db.e2e.ts b/tests/e2e/tests/web/regression/cli/cli-logical-db.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/cli/cli-logical-db.e2e.ts rename to tests/e2e/tests/web/regression/cli/cli-logical-db.e2e.ts index d8f0a98d16..81e87a65be 100644 --- a/tests/e2e/tests/regression/cli/cli-logical-db.e2e.ts +++ b/tests/e2e/tests/web/regression/cli/cli-logical-db.e2e.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/cli/cli-promote-workbench.ts b/tests/e2e/tests/web/regression/cli/cli-promote-workbench.ts similarity index 88% rename from tests/e2e/tests/regression/cli/cli-promote-workbench.ts rename to tests/e2e/tests/web/regression/cli/cli-promote-workbench.ts index 72c50afb1b..78fbec7b48 100644 --- a/tests/e2e/tests/regression/cli/cli-promote-workbench.ts +++ b/tests/e2e/tests/web/regression/cli/cli-promote-workbench.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage, BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage, BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/cli/cli-re-cluster.e2e.ts b/tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts similarity index 90% rename from tests/e2e/tests/regression/cli/cli-re-cluster.e2e.ts rename to tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts index b202c35670..6a1ee92fc8 100644 --- a/tests/e2e/tests/regression/cli/cli-re-cluster.e2e.ts +++ b/tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts @@ -1,16 +1,16 @@ import { Selector, t } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; import { cloudDatabaseConfig, commonUrl, ossClusterConfig, ossSentinelConfig, redisEnterpriseClusterConfig -} from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -81,7 +81,7 @@ test await verifyCommandsInCli(); }); test - .meta({ env: env.web, rte: rte.sentinel }) + .meta({ rte: rte.sentinel }) .before(async() => { await databaseHelper.acceptLicenseTermsAndAddSentinelDatabaseApi(ossSentinelConfig); }) diff --git a/tests/e2e/tests/regression/cli/cli.e2e.ts b/tests/e2e/tests/web/regression/cli/cli.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/cli/cli.e2e.ts rename to tests/e2e/tests/web/regression/cli/cli.e2e.ts index 57931949e6..bfd538f7d9 100644 --- a/tests/e2e/tests/regression/cli/cli.e2e.ts +++ b/tests/e2e/tests/web/regression/cli/cli.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { Common } from '../../../helpers/common'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { Common } from '../../../../helpers/common'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/database-overview/database-info.e2e.ts b/tests/e2e/tests/web/regression/database-overview/database-info.e2e.ts similarity index 89% rename from tests/e2e/tests/regression/database-overview/database-info.e2e.ts rename to tests/e2e/tests/web/regression/database-overview/database-info.e2e.ts index e9184bad0b..3486406ad6 100644 --- a/tests/e2e/tests/regression/database-overview/database-info.e2e.ts +++ b/tests/e2e/tests/web/regression/database-overview/database-info.e2e.ts @@ -1,12 +1,12 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, WorkbenchPage, BrowserPage -} from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/database-overview/database-overview-keys.e2e.ts b/tests/e2e/tests/web/regression/database-overview/database-overview-keys.e2e.ts similarity index 90% rename from tests/e2e/tests/regression/database-overview/database-overview-keys.e2e.ts rename to tests/e2e/tests/web/regression/database-overview/database-overview-keys.e2e.ts index 728791f47d..88cf91cc27 100644 --- a/tests/e2e/tests/regression/database-overview/database-overview-keys.e2e.ts +++ b/tests/e2e/tests/web/regression/database-overview/database-overview-keys.e2e.ts @@ -1,15 +1,15 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, WorkbenchPage, BrowserPage -} from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { cloudDatabaseConfig, commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { BrowserActions } from '../../../common-actions/browser-actions'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { cloudDatabaseConfig, commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { BrowserActions } from '../../../../common-actions/browser-actions'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/database-overview/database-overview.e2e.ts b/tests/e2e/tests/web/regression/database-overview/database-overview.e2e.ts similarity index 83% rename from tests/e2e/tests/regression/database-overview/database-overview.e2e.ts rename to tests/e2e/tests/web/regression/database-overview/database-overview.e2e.ts index 8f6288107c..8741192414 100644 --- a/tests/e2e/tests/regression/database-overview/database-overview.e2e.ts +++ b/tests/e2e/tests/web/regression/database-overview/database-overview.e2e.ts @@ -1,13 +1,13 @@ -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, WorkbenchPage, BrowserPage -} from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/database-overview/overview.e2e.ts b/tests/e2e/tests/web/regression/database-overview/overview.e2e.ts similarity index 84% rename from tests/e2e/tests/regression/database-overview/overview.e2e.ts rename to tests/e2e/tests/web/regression/database-overview/overview.e2e.ts index 98458bd988..2d418f3c12 100644 --- a/tests/e2e/tests/regression/database-overview/overview.e2e.ts +++ b/tests/e2e/tests/web/regression/database-overview/overview.e2e.ts @@ -1,7 +1,7 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, cloudDatabaseConfig } from '../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, cloudDatabaseConfig } from '../../../../helpers/conf'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/web/regression/database/cloud-sso.e2e.ts b/tests/e2e/tests/web/regression/database/cloud-sso.e2e.ts new file mode 100644 index 0000000000..72aa950d2f --- /dev/null +++ b/tests/e2e/tests/web/regression/database/cloud-sso.e2e.ts @@ -0,0 +1,42 @@ +import * as path from 'path'; +import { MyRedisDatabasePage, WelcomePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../../helpers/insights'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const welcomePage = new WelcomePage(); + +const pathes = { + dockerConfig: path.join('.', 'test-data', 'features-configs', 'sso-docker-build.json') +}; + +fixture `Cloud SSO` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseAPIRequests.deleteAllDatabasesApi(); + await refreshFeaturesTestData(); + await databaseHelper.acceptLicenseTerms(); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteAllDatabasesApi(); + await refreshFeaturesTestData(); + }); +test('Verify that user can not see the import Cloud databases on the Welcome screen for docker build', async t => { + // Update remote config .json to config with buildType filter excluding current app build + await modifyFeaturesConfigJson(pathes.dockerConfig); + await updateControlNumber(48.2); + await t.expect(welcomePage.importCloudDbBtn.exists).notOk('Import Cloud database button displayed for docker build'); + + // Verify that user can not see the import Cloud databases on the Auto-discovery flow for docker build + await t.click(welcomePage.addDbAutoBtn); + // Verify that when SSO flag disabled - Use Cloud API Keys displayed not as dropdown + await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudAccount.exists).notOk('Use Cloud Account accordion displayed for docker build'); + await t.expect(myRedisDatabasePage.AddRedisDatabase.useCloudKeys.exists).notOk('Use Cloud Keys accordion displayed for docker build'); +}); diff --git a/tests/e2e/tests/regression/database/database-list-search.e2e.ts b/tests/e2e/tests/web/regression/database/database-list-search.e2e.ts similarity index 95% rename from tests/e2e/tests/regression/database/database-list-search.e2e.ts rename to tests/e2e/tests/web/regression/database/database-list-search.e2e.ts index a2b21a93cc..6f06a7bfa2 100644 --- a/tests/e2e/tests/regression/database/database-list-search.e2e.ts +++ b/tests/e2e/tests/web/regression/database/database-list-search.e2e.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config, ossSentinelConfig, ossClusterConfig } from '../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config, ossSentinelConfig, ossClusterConfig } from '../../../../helpers/conf'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/regression/database/database-sorting.e2e.ts b/tests/e2e/tests/web/regression/database/database-sorting.e2e.ts similarity index 94% rename from tests/e2e/tests/regression/database/database-sorting.e2e.ts rename to tests/e2e/tests/web/regression/database/database-sorting.e2e.ts index 11fe2e1d2d..5b24a09238 100644 --- a/tests/e2e/tests/regression/database/database-sorting.e2e.ts +++ b/tests/e2e/tests/web/regression/database/database-sorting.e2e.ts @@ -1,13 +1,13 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { MyRedisDatabasePage, BrowserPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { MyRedisDatabasePage, BrowserPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; import { commonUrl, ossStandaloneConfig, ossSentinelConfig, ossClusterConfig -} from '../../../helpers/conf'; +} from '../../../../helpers/conf'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/web/regression/database/edit-db.e2e.ts b/tests/e2e/tests/web/regression/database/edit-db.e2e.ts new file mode 100644 index 0000000000..ab496a8167 --- /dev/null +++ b/tests/e2e/tests/web/regression/database/edit-db.e2e.ts @@ -0,0 +1,46 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { + commonUrl, + ossStandaloneConfig +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const database = Object.assign({}, ossStandaloneConfig); +const previousDatabaseName = Common.generateWord(20); +const newDatabaseName = Common.generateWord(20); +database.databaseName = previousDatabaseName; + +fixture `List of Databases` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseAPIRequests.deleteAllDatabasesApi(); + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(database); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteAllDatabasesApi(); + }); +test('Verify that user can edit DB alias of Standalone DB', async t => { + await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); + // Edit alias of added database + await databaseHelper.clickOnEditDatabaseByName(database.databaseName); + + // Verify that timeout input is displayed for edit db window with default value when it wasn't specified + await t.expect(myRedisDatabasePage.AddRedisDatabase.timeoutInput.value).eql('30', 'Timeout is not defaulted to 30'); + + await t.click(myRedisDatabasePage.editAliasButton); + await t.typeText(myRedisDatabasePage.aliasInput, newDatabaseName, { replace: true }); + await t.click(myRedisDatabasePage.applyButton); + await t.click(myRedisDatabasePage.submitChangesButton); + // Verify that database has new alias + await t.expect(myRedisDatabasePage.dbNameList.withExactText(newDatabaseName).exists).ok('The database with new alias is in not the list', { timeout: 10000 }); + await t.expect(myRedisDatabasePage.dbNameList.withExactText(previousDatabaseName).exists).notOk('The database with previous alias is still in the list', { timeout: 10000 }); +}); diff --git a/tests/e2e/tests/web/regression/database/github.e2e.ts b/tests/e2e/tests/web/regression/database/github.e2e.ts new file mode 100644 index 0000000000..d32ad3ce98 --- /dev/null +++ b/tests/e2e/tests/web/regression/database/github.e2e.ts @@ -0,0 +1,40 @@ +// import {ClientFunction} from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +// const getPageUrl = ClientFunction(() => window.location.href); + +fixture `Github functionality` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + await databaseAPIRequests.addNewStandaloneDatabaseApi(ossStandaloneConfig); + // Reload Page + await myRedisDatabasePage.reloadPage(); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can work with Github link in the application', async t => { + // Verify that user can see the icon for GitHub reference at the bottom of the left side bar in the List of DBs + await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button not found'); + //Verify that user can see the icon for GitHub reference at the bottom of the left side bar on the Browser page + await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); + await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button not found'); + // Verify that user can see the icon for GitHub reference at the bottom of the left side bar on the Workbench page + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + await t.expect(myRedisDatabasePage.NavigationPanel.githubButton.visible).ok('Github button'); + // update after resolving testcafe Native Automation mode limitations + // // Verify that when user clicks on Github icon he redirects to the URL: https://github.com/RedisInsight/RedisInsight + // await t.click(myRedisDatabasePage.NavigationPanel.githubButton); + // await t.expect(getPageUrl()).contains('https://github.com/RedisInsight/RedisInsight', 'Link is not correct'); + // await t.switchToParentWindow(); +}); diff --git a/tests/e2e/tests/regression/database/logical-databases.e2e.ts b/tests/e2e/tests/web/regression/database/logical-databases.e2e.ts similarity index 82% rename from tests/e2e/tests/regression/database/logical-databases.e2e.ts rename to tests/e2e/tests/web/regression/database/logical-databases.e2e.ts index 5941b14f5c..597f802ffd 100644 --- a/tests/e2e/tests/regression/database/logical-databases.e2e.ts +++ b/tests/e2e/tests/web/regression/database/logical-databases.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/regression/database/redisstack.e2e.ts b/tests/e2e/tests/web/regression/database/redisstack.e2e.ts similarity index 87% rename from tests/e2e/tests/regression/database/redisstack.e2e.ts rename to tests/e2e/tests/web/regression/database/redisstack.e2e.ts index 91a00a4de2..bc540d950c 100644 --- a/tests/e2e/tests/regression/database/redisstack.e2e.ts +++ b/tests/e2e/tests/web/regression/database/redisstack.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/insights/feature-flag.e2e.ts b/tests/e2e/tests/web/regression/insights/feature-flag.e2e.ts similarity index 78% rename from tests/e2e/tests/regression/insights/feature-flag.e2e.ts rename to tests/e2e/tests/web/regression/insights/feature-flag.e2e.ts index eb0d6a088f..9c8886fdce 100644 --- a/tests/e2e/tests/regression/insights/feature-flag.e2e.ts +++ b/tests/e2e/tests/web/regression/insights/feature-flag.e2e.ts @@ -1,12 +1,12 @@ import * as path from 'path'; -import { BrowserPage, MyRedisDatabasePage, SettingsPage } from '../../../pageObjects'; -import { RecommendationIds, rte, env } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { deleteRowsFromTableInDB, getColumnValueFromTableInDB } from '../../../helpers/database-scripts'; -import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../helpers/insights'; -import { Common } from '../../../helpers/common'; +import { BrowserPage, MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects'; +import { RecommendationIds, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { getColumnValueFromTableInDB } from '../../../../helpers/database-scripts'; +import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../../helpers/insights'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); @@ -17,14 +17,11 @@ const databaseAPIRequests = new DatabaseAPIRequests(); const featuresConfigTable = 'features_config'; const redisVersionRecom = RecommendationIds.redisVersion; const pathes = { - defaultRemote: path.join('.', 'test-data', 'features-configs', 'insights-default-remote.json'), invalidConfig: path.join('.', 'test-data', 'features-configs', 'insights-invalid.json'), validConfig: path.join('.', 'test-data', 'features-configs', 'insights-valid.json'), analyticsConfig: path.join('.', 'test-data', 'features-configs', 'insights-analytics-filter-off.json'), buildTypeConfig: path.join('.', 'test-data', 'features-configs', 'insights-build-type-filter.json'), - flagOffConfig: path.join('.', 'test-data', 'features-configs', 'insights-flag-off.json'), - dockerConfig: path.join('.', 'test-data', 'features-configs', 'insights-docker-build.json'), - electronConfig: path.join('.', 'test-data', 'features-configs', 'insights-electron-build.json') + flagOffConfig: path.join('.', 'test-data', 'features-configs', 'insights-flag-off.json') }; fixture `Feature flag` @@ -125,25 +122,3 @@ test await t.expect(featureVersion).eql(versionFromConfig, 'Config highest version not applied'); await t.expect(browserPage.InsightsPanel.insightsBtn.exists).notOk('Insights panel displayed when filter excludes this buildType'); }); -test - .meta({ env: env.desktop }) - .before(async() => { - await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); - }) - .after(async() => { - await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); - // Update remote config .json to default - await modifyFeaturesConfigJson(pathes.defaultRemote); - // Clear features config table - await deleteRowsFromTableInDB(featuresConfigTable); - })('Verify that Insights panel can be displayed for Electron app according to filters', async t => { - // Update remote config .json to config with buildType filter excluding current app build - await modifyFeaturesConfigJson(pathes.dockerConfig); - await updateControlNumber(48.2); - await t.expect(browserPage.InsightsPanel.insightsBtn.exists).notOk('Insights panel displayed when filter excludes this buildType'); - - // Update remote config .json to config with buildType filter including current app build - await modifyFeaturesConfigJson(pathes.electronConfig); - await updateControlNumber(48.2); - await t.expect(browserPage.InsightsPanel.insightsBtn.exists).ok('Insights panel not displayed when filter includes this buildType'); - }); diff --git a/tests/e2e/tests/regression/insights/live-recommendations.e2e.ts b/tests/e2e/tests/web/regression/insights/live-recommendations.e2e.ts similarity index 96% rename from tests/e2e/tests/regression/insights/live-recommendations.e2e.ts rename to tests/e2e/tests/web/regression/insights/live-recommendations.e2e.ts index 9264eb4ce5..145e1893b2 100644 --- a/tests/e2e/tests/regression/insights/live-recommendations.e2e.ts +++ b/tests/e2e/tests/web/regression/insights/live-recommendations.e2e.ts @@ -1,14 +1,14 @@ import * as path from 'path'; -import { BrowserPage, MemoryEfficiencyPage, MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { RecommendationIds, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { Telemetry } from '../../../helpers/telemetry'; -import { RecommendationsActions } from '../../../common-actions/recommendations-actions'; -import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../helpers/insights'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { BrowserPage, MemoryEfficiencyPage, MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { RecommendationIds, rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { Telemetry } from '../../../../helpers/telemetry'; +import { RecommendationsActions } from '../../../../common-actions/recommendations-actions'; +import { modifyFeaturesConfigJson, refreshFeaturesTestData, updateControlNumber } from '../../../../helpers/insights'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); diff --git a/tests/e2e/tests/regression/monitor/monitor.e2e.ts b/tests/e2e/tests/web/regression/monitor/monitor.e2e.ts similarity index 95% rename from tests/e2e/tests/regression/monitor/monitor.e2e.ts rename to tests/e2e/tests/web/regression/monitor/monitor.e2e.ts index 4c28c2afd2..f5b5940704 100644 --- a/tests/e2e/tests/regression/monitor/monitor.e2e.ts +++ b/tests/e2e/tests/web/regression/monitor/monitor.e2e.ts @@ -1,20 +1,20 @@ import { Chance } from 'chance'; -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { MyRedisDatabasePage, SettingsPage, BrowserPage, WorkbenchPage -} from '../../../pageObjects'; +} from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig, ossStandaloneNoPermissionsConfig -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { WorkbenchActions } from '../../../common-actions/workbench-actions'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { WorkbenchActions } from '../../../../common-actions/workbench-actions'; const myRedisDatabasePage = new MyRedisDatabasePage(); const settingsPage = new SettingsPage(); diff --git a/tests/e2e/tests/regression/monitor/save-commands.e2e.ts b/tests/e2e/tests/web/regression/monitor/save-commands.e2e.ts similarity index 88% rename from tests/e2e/tests/regression/monitor/save-commands.e2e.ts rename to tests/e2e/tests/web/regression/monitor/save-commands.e2e.ts index b3e2b016a6..04ccc4a0db 100644 --- a/tests/e2e/tests/regression/monitor/save-commands.e2e.ts +++ b/tests/e2e/tests/web/regression/monitor/save-commands.e2e.ts @@ -1,10 +1,10 @@ import * as fs from 'fs'; import * as os from 'os'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/web/regression/pub-sub/debug-mode.e2e.ts b/tests/e2e/tests/web/regression/pub-sub/debug-mode.e2e.ts new file mode 100644 index 0000000000..0dd05a1e00 --- /dev/null +++ b/tests/e2e/tests/web/regression/pub-sub/debug-mode.e2e.ts @@ -0,0 +1,63 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, PubSubPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { verifyMessageDisplayingInPubSub } from '../../../../helpers/pub-sub'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const pubSubPage = new PubSubPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +fixture `PubSub debug mode` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + // Go to PubSub page and subscribe to channel + await t.click(myRedisDatabasePage.NavigationPanel.pubSubButton); + await t.click(pubSubPage.subscribeButton); + // Publish different messages + await pubSubPage.Cli.sendCommandInCli('10 publish channel first'); + await pubSubPage.Cli.sendCommandInCli('10 publish channel second'); + await pubSubPage.Cli.sendCommandInCli('10 publish channel third'); + }) + .afterEach(async() => { + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); + +test('Verify that when user navigating away and back to pubsub window the debug mode state will be reset to default auto-scroll', async t => { + // Scroll to the first messages + await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); + // Verify that new messages keep arriving in the background and user can always see up to date count of total messages received. + await pubSubPage.publishMessage('test', 'message sent in the background'); + await t.expect(pubSubPage.totalMessagesCount.textContent).contains('31', 'Total counter value is incorrect'); + // Verify that when user scroll away from the newest message the auto-scroll is stopped + await pubSubPage.Cli.sendCommandInCli('30 publish channel additionalMessages'); + await pubSubPage.publishMessage('test', 'new message with no scroll'); + await verifyMessageDisplayingInPubSub('new message with no scroll', false); + // Go to Browser Page + await t.click(myRedisDatabasePage.NavigationPanel.myRedisDBButton); + // Go to PubSub page + await t.click(myRedisDatabasePage.NavigationPanel.pubSubButton); + // Verify that the debug mode state is reset to default auto-scroll + await verifyMessageDisplayingInPubSub('new message with no scroll', true); +}); +test('Verify that when user scroll all the way to the newest available message (down), auto-scroll resumes automatically.', async t => { + // Scroll to the first messages + await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); + await pubSubPage.publishMessage('test', 'message to scroll'); + await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('message to scroll')); + await pubSubPage.Cli.sendCommandInCli('20 publish channel fourth'); + // Verify auto-scroll resumes automatically + await verifyMessageDisplayingInPubSub('fourth', true); +}); +test('Verify that user can get to the newest message in one click', async t => { + // Scroll to the first messages + await t.scrollIntoView(pubSubPage.pubSubPageContainer.find(pubSubPage.cssSelectorMessage).withText('first')); + await pubSubPage.publishMessage('test', 'new message'); + await t.click(pubSubPage.scrollDownButton); + // Verify the user scrolled to the newest message + await verifyMessageDisplayingInPubSub('new message', true); +}); diff --git a/tests/e2e/tests/regression/pub-sub/pub-sub-oss-cluster-7.ts b/tests/e2e/tests/web/regression/pub-sub/pub-sub-oss-cluster-7.ts similarity index 86% rename from tests/e2e/tests/regression/pub-sub/pub-sub-oss-cluster-7.ts rename to tests/e2e/tests/web/regression/pub-sub/pub-sub-oss-cluster-7.ts index 03ed9282ac..a26998c679 100644 --- a/tests/e2e/tests/regression/pub-sub/pub-sub-oss-cluster-7.ts +++ b/tests/e2e/tests/web/regression/pub-sub/pub-sub-oss-cluster-7.ts @@ -1,9 +1,9 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, PubSubPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig, ossClusterConfig } from '../../../helpers/conf'; -import { rte, env } from '../../../helpers/constants'; -import { verifyMessageDisplayingInPubSub } from '../../../helpers/pub-sub'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, PubSubPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig, ossClusterConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { verifyMessageDisplayingInPubSub } from '../../../../helpers/pub-sub'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const pubSubPage = new PubSubPage(); @@ -11,7 +11,7 @@ const databaseHelper = new DatabaseHelper(); const databaseAPIRequests = new DatabaseAPIRequests(); fixture `PubSub OSS Cluster 7 tests` - .meta({ env: env.web, type: 'regression' }) + .meta({ type: 'regression' }) .page(commonUrl); test diff --git a/tests/e2e/tests/web/regression/shortcuts/shortcuts.e2e.ts b/tests/e2e/tests/web/regression/shortcuts/shortcuts.e2e.ts new file mode 100644 index 0000000000..686b4c8474 --- /dev/null +++ b/tests/e2e/tests/web/regression/shortcuts/shortcuts.e2e.ts @@ -0,0 +1,64 @@ +// import { ClientFunction } from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl } from '../../../../helpers/conf'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); +// const getPageUrl = ClientFunction(() => window.location.href); + +fixture `Shortcuts` + .meta({ type: 'regression', rte: rte.none }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + }); +test('Verify that user can see a summary of Shortcuts by clicking "Keyboard Shortcuts" button in Help Center', async t => { + // const link = 'https://github.com/RedisInsight/RedisInsight/releases'; + + // Click on help center icon and verify panel + await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); + await t.expect(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterPanel.exists).ok('Help Center panel is not opened'); + // Click on Shortcuts option and verify panel + await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); + // Validate Title and sections of Shortcuts + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).ok('Shortcuts panel is not opened'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsTitle.exists).ok('shortcutsTitle is not opened'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsCLISection.exists).ok('shortcutsCLISection is not displayed'); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsWorkbenchSection.exists).ok('shortcutsWorkbenchSection is not displayed'); + // Verify that user can close the Shortcuts + await t.click(myRedisDatabasePage.ShortcutsPanel.shortcutsCloseButton); + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.exists).notOk('Shortcuts panel is not displayed'); + // update after resolving testcafe Native Automation mode limitations + // // Click on the Release Notes in Help Center + // await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); + // await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterReleaseNotesButton); + // // Verify redirected link opening Release Notes in Help Center + // await t.expect(getPageUrl()).eql(link, 'The Release Notes link not correct'); +}); +test('Verify that user can see description of the “up” shortcut in the Help Center > Keyboard Shortcuts > Workbench table', async t => { + const description = [ + 'Quick-access to command history', + 'Up Arrow' + ]; + const description2 = [ + 'Use Non-Redis Editor', + 'Shift+Space' + ]; + + // Open Shortcuts + await t.click(myRedisDatabasePage.NavigationPanel.helpCenterButton); + await t.click(myRedisDatabasePage.NavigationPanel.HelpCenter.helpCenterShortcutButton); + + // Verify that user can see the description of the “Shift+Space” keyboard shortcut in the Keyboard Shortcuts + for (const element of description2) { + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.textContent).contains(element, 'The user can not see description of the “Shift+Space” shortcut'); + } + + // Verify that user can see description of the “up” shortcut + for (const element of description) { + await t.expect(myRedisDatabasePage.ShortcutsPanel.shortcutsPanel.textContent).contains(element, 'The user can not see description of the “up” shortcut'); + } +}); diff --git a/tests/e2e/tests/regression/tree-view/tree-view.e2e.ts b/tests/e2e/tests/web/regression/tree-view/tree-view.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/tree-view/tree-view.e2e.ts rename to tests/e2e/tests/web/regression/tree-view/tree-view.e2e.ts index 1ed9c6a6d2..59628f00bc 100644 --- a/tests/e2e/tests/regression/tree-view/tree-view.e2e.ts +++ b/tests/e2e/tests/web/regression/tree-view/tree-view.e2e.ts @@ -1,12 +1,12 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, WorkbenchPage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, WorkbenchPage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneBigConfig, ossStandaloneRedisearch -} from '../../../helpers/conf'; -import { KeyTypesTexts, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +} from '../../../../helpers/conf'; +import { KeyTypesTexts, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/triggers-and-functions/libraries.e2e.ts b/tests/e2e/tests/web/regression/triggers-and-functions/libraries.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/triggers-and-functions/libraries.e2e.ts rename to tests/e2e/tests/web/regression/triggers-and-functions/libraries.e2e.ts index 47b516285e..e00bf7869e 100644 --- a/tests/e2e/tests/regression/triggers-and-functions/libraries.e2e.ts +++ b/tests/e2e/tests/web/regression/triggers-and-functions/libraries.e2e.ts @@ -1,20 +1,20 @@ import * as path from 'path'; -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { BrowserPage, TriggersAndFunctionsFunctionsPage, TriggersAndFunctionsLibrariesPage -} from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisGears } from '../../../helpers/conf'; -import { FunctionsSections, LibrariesSections, MonacoEditorInputs, rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { TriggersAndFunctionLibrary } from '../../../interfaces/triggers-and-functions'; -import { CommonElementsActions } from '../../../common-actions/common-elements-actions'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +} from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisGears } from '../../../../helpers/conf'; +import { FunctionsSections, LibrariesSections, MonacoEditorInputs, rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { TriggersAndFunctionLibrary } from '../../../../interfaces/triggers-and-functions'; +import { CommonElementsActions } from '../../../../common-actions/common-elements-actions'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; import { StreamKeyParameters -} from '../../../pageObjects/browser-page'; +} from '../../../../pageObjects/browser-page'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -28,8 +28,8 @@ const streamKeyName = Common.generateWord(5); const libNameFromFile = 'lib'; const filePathes = { - upload: path.join('..', '..', '..', 'test-data', 'triggers-and-functions', 'library.txt'), - invoke: path.join('..', '..', '..', 'test-data', 'triggers-and-functions', 'invoke_function.txt') + upload: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'library.txt'), + invoke: path.join('..', '..', '..', '..', 'test-data', 'triggers-and-functions', 'invoke_function.txt') }; const LIBRARIES_LIST = [ diff --git a/tests/e2e/tests/regression/workbench/autocomplete.e2e.ts b/tests/e2e/tests/web/regression/workbench/autocomplete.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/workbench/autocomplete.e2e.ts rename to tests/e2e/tests/web/regression/workbench/autocomplete.e2e.ts index 0b0c9e2b5d..2a1f478576 100644 --- a/tests/e2e/tests/regression/workbench/autocomplete.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/autocomplete.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/autoexecute-button.e2e.ts b/tests/e2e/tests/web/regression/workbench/autoexecute-button.e2e.ts similarity index 85% rename from tests/e2e/tests/regression/workbench/autoexecute-button.e2e.ts rename to tests/e2e/tests/web/regression/workbench/autoexecute-button.e2e.ts index 37db89292e..bd86db6486 100644 --- a/tests/e2e/tests/regression/workbench/autoexecute-button.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/autoexecute-button.e2e.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { env, rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); @@ -10,7 +10,7 @@ const databaseHelper = new DatabaseHelper(); const databaseAPIRequests = new DatabaseAPIRequests(); fixture `Workbench Auto-Execute button` - .meta({ type: 'regression', rte: rte.standalone, env: env.web }) + .meta({ type: 'regression', rte: rte.standalone }) .page(commonUrl) .beforeEach(async t => { await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); diff --git a/tests/e2e/tests/web/regression/workbench/command-results.e2e.ts b/tests/e2e/tests/web/regression/workbench/command-results.e2e.ts new file mode 100644 index 0000000000..ed13310cc7 --- /dev/null +++ b/tests/e2e/tests/web/regression/workbench/command-results.e2e.ts @@ -0,0 +1,135 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { WorkbenchActions } from '../../../../common-actions/workbench-actions'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const workBenchActions = new WorkbenchActions(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const indexName = Common.generateWord(5); +const commandsForIndex = [ + `FT.CREATE ${indexName} ON HASH PREFIX 1 product: SCHEMA price NUMERIC SORTABLE`, + 'HMSET product:1 price 20', + 'HMSET product:2 price 100' +]; + +fixture `Command results at Workbench` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + // Add index and data + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + await workbenchPage.sendCommandsArrayInWorkbench(commandsForIndex); + }) + .afterEach(async t => { + // Drop index and database + await t.switchToMainWindow(); + await workbenchPage.sendCommandInWorkbench(`FT.DROPINDEX ${indexName} DD`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + }); +test('Verify that user can switches between Table and Text for FT.INFO and see results corresponding to their views', async t => { + const infoCommand = `FT.INFO ${indexName}`; + + // Send FT.INFO and switch to Text view + await workbenchPage.sendCommandInWorkbench(infoCommand); + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The text view is not switched for command FT.INFO'); + // Switch to Table view and check result + await workbenchPage.selectViewTypeTable(); + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.INFO'); +}); +test('Verify that user can switches between Table and Text for FT.SEARCH and see results corresponding to their views', async t => { + const searchCommand = `FT.SEARCH ${indexName} *`; + + // Send FT.SEARCH and switch to Text view + await workbenchPage.sendCommandInWorkbench(searchCommand); + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The text view is not switched for command FT.SEARCH'); + // Switch to Table view and check result + await workbenchPage.selectViewTypeTable(); + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.SEARCH'); +}); +test('Verify that user can switches between Table and Text for FT.AGGREGATE and see results corresponding to their views', async t => { + const aggregateCommand = `FT.Aggregate ${indexName} * GROUPBY 0 REDUCE MAX 1 @price AS max_price`; + + // Send FT.AGGREGATE and switch to Text view + await workbenchPage.sendCommandInWorkbench(aggregateCommand); + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The text view is not switched for command FT.AGGREGATE'); + // Switch to Table view and check result + await workbenchPage.selectViewTypeTable(); + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryTableResult.exists).ok('The table view is not switched for command FT.AGGREGATE'); +}); +// Skipped due to issue https://redislabs.atlassian.net/browse/RI-3524 +test.skip('Verify that user can switches between views and see results according to this view in full mode in Workbench', async t => { + const command = 'CLIENT LIST'; + + // Send command and check table view is default in full mode + await workbenchPage.sendCommandInWorkbench(command); + await t.click(workbenchPage.fullScreenButton); + await t.switchToIframe(workbenchPage.iframe); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTableResult).visible).ok('The search results are displayed in Table view by default'); + // Select Text view from dropdown + await t.switchToMainWindow(); + await workbenchPage.selectViewTypeText(); + // Verify that search results are displayed in Text view + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).visible).ok('The result is displayed in Text view'); +}); +test('Big output in workbench is visible in virtualized table', async t => { + // Send commands + const command = 'graph.query t "UNWIND range(1,1000) AS x return x"'; + const bottomText = 'Query internal execution time'; + let numberOfScrolls = 0; + + // Send command in workbench with Text view type + await workbenchPage.sendCommandInWorkbench(command); + await workbenchPage.selectViewTypeText(); + + const containerOfCommand = await workbenchPage.getCardContainerByCommand(command); + const listItems = containerOfCommand.find(workbenchPage.cssRowInVirtualizedTable); + const lastExpectedItem = listItems.withText(bottomText); + + // Scroll down the virtualized list until the last row + while (!await lastExpectedItem.exists && numberOfScrolls < 100) { + const currentLastRenderedItemIndex = await listItems.count - 1; + const currentLastRenderedItemText = await listItems.nth(currentLastRenderedItemIndex).textContent; + const currentLastRenderedItem = listItems.withText(currentLastRenderedItemText); + + await t.scrollIntoView(currentLastRenderedItem); + numberOfScrolls++; + } + + // Verify that all commands scrolled + await t.expect(lastExpectedItem.visible).ok('Final execution time message not displayed'); +}); +test + .before(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneRedisearch); + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .after(async t => { + await t.switchToMainWindow(); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneRedisearch); + })('Verify that user can see the client List visualization available for all users', async t => { + const command = 'CLIENT LIST'; + // Send command in workbench to view client list + await workbenchPage.sendCommandInWorkbench(command); + await t.expect(workbenchPage.typeSelectedClientsList.exists).ok('client list view button is not visible'); + await workBenchActions.verifyClientListColumnsAreVisible(['id', 'addr', 'name', 'user']); + // verify table view row count match with text view after client list command + await workBenchActions.verifyClientListTableViewRowCount(); + }); +test('Verify that user can clear all results at once.', async t => { + await t.click(workbenchPage.clearResultsBtn); + await t.expect(workbenchPage.queryTextResult.exists).notOk('Clear all button does not remove commands'); +}); diff --git a/tests/e2e/tests/regression/workbench/context.e2e.ts b/tests/e2e/tests/web/regression/workbench/context.e2e.ts similarity index 91% rename from tests/e2e/tests/regression/workbench/context.e2e.ts rename to tests/e2e/tests/web/regression/workbench/context.e2e.ts index 595a1caf81..224070a4b9 100644 --- a/tests/e2e/tests/regression/workbench/context.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/context.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/cypher.e2e.ts b/tests/e2e/tests/web/regression/workbench/cypher.e2e.ts similarity index 95% rename from tests/e2e/tests/regression/workbench/cypher.e2e.ts rename to tests/e2e/tests/web/regression/workbench/cypher.e2e.ts index 21cd442382..e65ff793b2 100644 --- a/tests/e2e/tests/regression/workbench/cypher.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/cypher.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/default-scripts-area.e2e.ts b/tests/e2e/tests/web/regression/workbench/default-scripts-area.e2e.ts similarity index 96% rename from tests/e2e/tests/regression/workbench/default-scripts-area.e2e.ts rename to tests/e2e/tests/web/regression/workbench/default-scripts-area.e2e.ts index 2aa5da6dd6..c523cf3af4 100644 --- a/tests/e2e/tests/regression/workbench/default-scripts-area.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/default-scripts-area.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/editor-cleanup.e2e.ts b/tests/e2e/tests/web/regression/workbench/editor-cleanup.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/workbench/editor-cleanup.e2e.ts rename to tests/e2e/tests/web/regression/workbench/editor-cleanup.e2e.ts index 27c1256379..2052959b77 100644 --- a/tests/e2e/tests/regression/workbench/editor-cleanup.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/editor-cleanup.e2e.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage, SettingsPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/empty-command-history.e2e.ts b/tests/e2e/tests/web/regression/workbench/empty-command-history.e2e.ts similarity index 85% rename from tests/e2e/tests/regression/workbench/empty-command-history.e2e.ts rename to tests/e2e/tests/web/regression/workbench/empty-command-history.e2e.ts index 03c3ed6708..cecc4d1397 100644 --- a/tests/e2e/tests/regression/workbench/empty-command-history.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/empty-command-history.e2e.ts @@ -1,9 +1,9 @@ import { Selector } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/group-mode.e2e.ts b/tests/e2e/tests/web/regression/workbench/group-mode.e2e.ts similarity index 92% rename from tests/e2e/tests/regression/workbench/group-mode.e2e.ts rename to tests/e2e/tests/web/regression/workbench/group-mode.e2e.ts index 1b84868c44..a115c0a95a 100644 --- a/tests/e2e/tests/regression/workbench/group-mode.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/group-mode.e2e.ts @@ -1,9 +1,9 @@ import { Selector } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/history-of-results.e2e.ts b/tests/e2e/tests/web/regression/workbench/history-of-results.e2e.ts similarity index 91% rename from tests/e2e/tests/regression/workbench/history-of-results.e2e.ts rename to tests/e2e/tests/web/regression/workbench/history-of-results.e2e.ts index 3a63cda9a6..79b3e04501 100644 --- a/tests/e2e/tests/regression/workbench/history-of-results.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/history-of-results.e2e.ts @@ -1,10 +1,10 @@ -import { getRandomParagraph } from '../../../helpers/keys'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { getRandomParagraph } from '../../../../helpers/keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/import-tutorials.e2e.ts b/tests/e2e/tests/web/regression/workbench/import-tutorials.e2e.ts similarity index 97% rename from tests/e2e/tests/regression/workbench/import-tutorials.e2e.ts rename to tests/e2e/tests/web/regression/workbench/import-tutorials.e2e.ts index f84765f18d..d46d3c39d7 100644 --- a/tests/e2e/tests/regression/workbench/import-tutorials.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/import-tutorials.e2e.ts @@ -1,12 +1,12 @@ import * as path from 'path'; import { t } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../helpers/keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage, MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { deleteAllKeysFromDB, verifyKeysDisplayedInTheList } from '../../../../helpers/keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/raw-mode.e2e.ts b/tests/e2e/tests/web/regression/workbench/raw-mode.e2e.ts similarity index 93% rename from tests/e2e/tests/regression/workbench/raw-mode.e2e.ts rename to tests/e2e/tests/web/regression/workbench/raw-mode.e2e.ts index 5f7759d6f6..0b87cc4a19 100644 --- a/tests/e2e/tests/regression/workbench/raw-mode.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/raw-mode.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/web/regression/workbench/redis-stack-commands.e2e.ts b/tests/e2e/tests/web/regression/workbench/redis-stack-commands.e2e.ts new file mode 100644 index 0000000000..dbf082c922 --- /dev/null +++ b/tests/e2e/tests/web/regression/workbench/redis-stack-commands.e2e.ts @@ -0,0 +1,39 @@ +import { t } from 'testcafe'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const keyNameGraph = 'bikes_graph'; + +fixture `Redis Stack command in Workbench` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .afterEach(async() => { + // Drop key and database + await t.switchToMainWindow(); + await workbenchPage.sendCommandInWorkbench(`GRAPH.DELETE ${keyNameGraph}`); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test('Verify that user can switches between Chart and Text for TimeSeries command and see results corresponding to their views', async t => { + // Send TimeSeries command + await t.click(workbenchPage.redisStackTutorialsButton); + await t.click(workbenchPage.timeSeriesLink); + await t.click(workbenchPage.showSalesPerRegiomButton); + await t.click(workbenchPage.submitCommandButton); + // Check result is in chart view + await t.expect(workbenchPage.chartViewTypeOptionSelected.exists).ok('The chart view option is not selected by default'); + // Switch to Text view and check result + await workbenchPage.selectViewTypeText(); + await t.expect(workbenchPage.queryCardContainer.nth(0).find(workbenchPage.cssQueryTextResult).exists).ok('The result in text view is not displayed'); +}); diff --git a/tests/e2e/tests/web/regression/workbench/redisearch-module-not-available.e2e.ts b/tests/e2e/tests/web/regression/workbench/redisearch-module-not-available.e2e.ts new file mode 100644 index 0000000000..e524ed56f5 --- /dev/null +++ b/tests/e2e/tests/web/regression/workbench/redisearch-module-not-available.e2e.ts @@ -0,0 +1,52 @@ +import { ClientFunction } from 'testcafe'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneV5Config } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const workbenchPage = new WorkbenchPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); + +const commandForSend = 'FT._LIST'; +const getPageUrl = ClientFunction(() => window.location.href); + +fixture `Redisearch module not available` + .meta({ type: 'regression', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async t => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config); + await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton); + }) + .afterEach(async() => { + // Delete database + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneV5Config); + }); +// Skipped as outdated after implementing RI-4230 +test.skip('Verify that user can see the "Create your free Redis database with RediSearch on Redis Cloud" button and click on it in Workbench when module in not loaded', async t => { + const link = 'https://redis.com/try-free/?utm_source=redis&utm_medium=app&utm_campaign=redisinsight_redisearch'; + + // Send command with 'FT.' + await workbenchPage.sendCommandInWorkbench(commandForSend); + // Verify the button in the results + await t.expect(await workbenchPage.queryCardNoModuleButton.visible).ok('The "Create your free Redis database with RediSearch on Redis Cloud" button is not visible'); + // Click on the button in the results + await t.click(workbenchPage.queryCardNoModuleButton); + await t.expect(getPageUrl()).contains(link, 'The Try Redis Enterprise page is not opened'); + await t.switchToParentWindow(); +}); +// https://redislabs.atlassian.net/browse/RI-4230 +test('Verify that user can see options on what can be done to work with capabilities in Workbench for docker', async t => { + const commandJSON = 'JSON.ARRAPPEND key value'; + const commandFT = 'FT.LIST'; + await workbenchPage.sendCommandInWorkbench(commandJSON); + // Verify change screens when capability not available - 'JSON' + await t.expect(await workbenchPage.commandExecutionResult.withText('RedisJSON is not available for this database').visible) + .ok('Missing RedisJSON title is not visible'); + await workbenchPage.sendCommandInWorkbench(commandFT); + // Verify change screens when capability not available - 'Search' + await t.expect(await workbenchPage.commandExecutionResult.withText('RediSearch is not available for this database').visible) + .ok('Missing RedisSearch title is not visible'); +}); diff --git a/tests/e2e/tests/regression/workbench/scripting-area.e2e.ts b/tests/e2e/tests/web/regression/workbench/scripting-area.e2e.ts similarity index 95% rename from tests/e2e/tests/regression/workbench/scripting-area.e2e.ts rename to tests/e2e/tests/web/regression/workbench/scripting-area.e2e.ts index 1ef82d61a3..51bf59232f 100644 --- a/tests/e2e/tests/regression/workbench/scripting-area.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/scripting-area.e2e.ts @@ -1,10 +1,10 @@ import { Selector } from 'testcafe'; -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage, SettingsPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage, SettingsPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/workbench-non-auto-guides.e2e.ts b/tests/e2e/tests/web/regression/workbench/workbench-non-auto-guides.e2e.ts similarity index 94% rename from tests/e2e/tests/regression/workbench/workbench-non-auto-guides.e2e.ts rename to tests/e2e/tests/web/regression/workbench/workbench-non-auto-guides.e2e.ts index 39b4e1d047..447c61115f 100644 --- a/tests/e2e/tests/regression/workbench/workbench-non-auto-guides.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/workbench-non-auto-guides.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { WorkbenchPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { rte } from '../../../helpers/constants'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { Common } from '../../../helpers/common'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { WorkbenchPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { rte } from '../../../../helpers/constants'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { Common } from '../../../../helpers/common'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/regression/workbench/workbench-pipeline.e2e.ts b/tests/e2e/tests/web/regression/workbench/workbench-pipeline.e2e.ts similarity index 73% rename from tests/e2e/tests/regression/workbench/workbench-pipeline.e2e.ts rename to tests/e2e/tests/web/regression/workbench/workbench-pipeline.e2e.ts index c2d32159b7..4360fdd491 100644 --- a/tests/e2e/tests/regression/workbench/workbench-pipeline.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/workbench-pipeline.e2e.ts @@ -1,9 +1,9 @@ // import { ClientFunction } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, SettingsPage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneBigConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, SettingsPage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); @@ -29,25 +29,24 @@ fixture `Workbench Pipeline` // Delete database await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneBigConfig); }); -test - .meta({ env: env.web })('Verify that user can see the text in settings for pipeline with link', async t => { - const pipelineText = 'Sets the size of a command batch for the pipeline(opens in a new tab or window) mode in Workbench. 0 or 1 pipelines every command.'; +test('Verify that user can see the text in settings for pipeline with link', async t => { + const pipelineText = 'Sets the size of a command batch for the pipeline(opens in a new tab or window) mode in Workbench. 0 or 1 pipelines every command.'; - // Verify that user can enter only numbers >0 in "Commands in pipeline" input - await t.hover(settingsPage.commandsInPipelineValue); - await t.click(settingsPage.commandsInPipelineInput); - await t.typeText(settingsPage.commandsInPipelineInput, pipelineValues[0], { replace: true }); - // Verify that negative number converted to positive - await t.expect(settingsPage.commandsInPipelineInput.value).eql(pipelineValues[1], 'Value is incorrect'); + // Verify that user can enter only numbers >0 in "Commands in pipeline" input + await t.hover(settingsPage.commandsInPipelineValue); + await t.click(settingsPage.commandsInPipelineInput); + await t.typeText(settingsPage.commandsInPipelineInput, pipelineValues[0], { replace: true }); + // Verify that negative number converted to positive + await t.expect(settingsPage.commandsInPipelineInput.value).eql(pipelineValues[1], 'Value is incorrect'); - // Verify text in setting for pipeline - await t.expect(settingsPage.accordionWorkbenchSettings.textContent).contains(pipelineText, 'Text is incorrect'); - // update after resolving testcafe Native Automation mode limitations - // await t.click(settingsPage.pipelineLink); - // // Check new opened window page with the correct URL - // await t.expect(getPageUrl()).eql(externalPageLink, 'The opened page is incorrect'); - // await t.switchToParentWindow(); - }); + // Verify text in setting for pipeline + await t.expect(settingsPage.accordionWorkbenchSettings.textContent).contains(pipelineText, 'Text is incorrect'); + // update after resolving testcafe Native Automation mode limitations + // await t.click(settingsPage.pipelineLink); + // // Check new opened window page with the correct URL + // await t.expect(getPageUrl()).eql(externalPageLink, 'The opened page is incorrect'); + // await t.switchToParentWindow(); +}); test.skip('Verify that only chosen in pipeline number of commands is loading at the same time in Workbench', async t => { await settingsPage.changeCommandsInPipeline(pipelineValues[1]); // Go to Workbench page diff --git a/tests/e2e/tests/regression/workbench/workbench-re-cluster.e2e.ts b/tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts similarity index 89% rename from tests/e2e/tests/regression/workbench/workbench-re-cluster.e2e.ts rename to tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts index 0a52086460..aebe550dbd 100644 --- a/tests/e2e/tests/regression/workbench/workbench-re-cluster.e2e.ts +++ b/tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts @@ -1,9 +1,9 @@ import { t } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { cloudDatabaseConfig, commonUrl, ossClusterConfig, ossSentinelConfig, redisEnterpriseClusterConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { cloudDatabaseConfig, commonUrl, ossClusterConfig, ossSentinelConfig, redisEnterpriseClusterConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); @@ -72,7 +72,7 @@ test await verifyCommandsInWorkbench(); }); test - .meta({ env: env.web, rte: rte.sentinel }) + .meta({ rte: rte.sentinel }) .before(async() => { await databaseHelper.acceptLicenseTermsAndAddSentinelDatabaseApi(ossSentinelConfig); }) diff --git a/tests/e2e/tests/smoke/browser/add-keys.e2e.ts b/tests/e2e/tests/web/smoke/browser/add-keys.e2e.ts similarity index 91% rename from tests/e2e/tests/smoke/browser/add-keys.e2e.ts rename to tests/e2e/tests/web/smoke/browser/add-keys.e2e.ts index 504e3ceea4..27fa2e24e2 100644 --- a/tests/e2e/tests/smoke/browser/add-keys.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/add-keys.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/edit-key-name.e2e.ts b/tests/e2e/tests/web/smoke/browser/edit-key-name.e2e.ts similarity index 91% rename from tests/e2e/tests/smoke/browser/edit-key-name.e2e.ts rename to tests/e2e/tests/web/smoke/browser/edit-key-name.e2e.ts index 6d74a42337..f0f43a0be4 100644 --- a/tests/e2e/tests/smoke/browser/edit-key-name.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/edit-key-name.e2e.ts @@ -1,11 +1,11 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { Telemetry } from '../../../helpers/telemetry'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { Telemetry } from '../../../../helpers/telemetry'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const telemetry = new Telemetry(); diff --git a/tests/e2e/tests/smoke/browser/edit-key-value.e2e.ts b/tests/e2e/tests/web/smoke/browser/edit-key-value.e2e.ts similarity index 90% rename from tests/e2e/tests/smoke/browser/edit-key-value.e2e.ts rename to tests/e2e/tests/web/smoke/browser/edit-key-value.e2e.ts index 94dd84eac8..1cc62f1290 100644 --- a/tests/e2e/tests/smoke/browser/edit-key-value.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/edit-key-value.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/filtering.e2e.ts b/tests/e2e/tests/web/smoke/browser/filtering.e2e.ts similarity index 89% rename from tests/e2e/tests/smoke/browser/filtering.e2e.ts rename to tests/e2e/tests/web/smoke/browser/filtering.e2e.ts index 9cc0f2b84d..0494baec35 100644 --- a/tests/e2e/tests/smoke/browser/filtering.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/filtering.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/hash-field.e2e.ts b/tests/e2e/tests/web/smoke/browser/hash-field.e2e.ts similarity index 80% rename from tests/e2e/tests/smoke/browser/hash-field.e2e.ts rename to tests/e2e/tests/web/smoke/browser/hash-field.e2e.ts index 88f33d8540..65b3726ec5 100644 --- a/tests/e2e/tests/smoke/browser/hash-field.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/hash-field.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/json-key.e2e.ts b/tests/e2e/tests/web/smoke/browser/json-key.e2e.ts similarity index 84% rename from tests/e2e/tests/smoke/browser/json-key.e2e.ts rename to tests/e2e/tests/web/smoke/browser/json-key.e2e.ts index 3b6627785c..48e6bceccc 100644 --- a/tests/e2e/tests/smoke/browser/json-key.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/json-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/list-key.e2e.ts b/tests/e2e/tests/web/smoke/browser/list-key.e2e.ts similarity index 86% rename from tests/e2e/tests/smoke/browser/list-key.e2e.ts rename to tests/e2e/tests/web/smoke/browser/list-key.e2e.ts index 7a502e10cc..9dcf5e31ef 100644 --- a/tests/e2e/tests/smoke/browser/list-key.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/list-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/web/smoke/browser/list-of-keys-verifications.e2e.ts b/tests/e2e/tests/web/smoke/browser/list-of-keys-verifications.e2e.ts new file mode 100644 index 0000000000..86e3b47bd0 --- /dev/null +++ b/tests/e2e/tests/web/smoke/browser/list-of-keys-verifications.e2e.ts @@ -0,0 +1,73 @@ +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; + +const browserPage = new BrowserPage(); +const databaseHelper = new DatabaseHelper(); +const databaseAPIRequests = new DatabaseAPIRequests(); +const apiKeyRequests = new APIKeyRequests(); + +let keyName = Common.generateWord(10); +let keyNames: string[] = []; +const keyTTL = '2147476121'; + +fixture `List of keys verifications` + .meta({ type: 'smoke', rte: rte.standalone }) + .page(commonUrl) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig); + }) + .afterEach(async() => { + // Clear and delete database + await apiKeyRequests.deleteKeyByNameApi(keyName, ossStandaloneConfig.databaseName); + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + }); +test + .after(async() => { + // Clear and delete database + for(const name of keyNames) { + await apiKeyRequests.deleteKeyByNameApi(name, ossStandaloneConfig.databaseName); + } + await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig); + })('Verify that user can scroll List of Keys in DB', async t => { + keyNames = [ + `key-${Common.generateWord(10)}`, + `key-${Common.generateWord(10)}`, + `key-${Common.generateWord(10)}`, + `key-${Common.generateWord(10)}` + ]; + + await browserPage.addStringKey(keyNames[0]); + await browserPage.addHashKey(keyNames[1]); + await browserPage.addListKey(keyNames[2]); + await browserPage.addStringKey(keyNames[3]); + await t.click(browserPage.refreshKeysButton); + // Verify that user can see List of Keys in DB + await t.expect(browserPage.keyNameInTheList.exists).ok('The list of keys is not displayed'); + + // Scroll to the key element + await t.hover(browserPage.keyNameInTheList); + await t.expect(browserPage.keyNameInTheList.exists).ok('The list of keys is not displayed'); + }); +test('Verify that user can open key details', async t => { + keyName = Common.generateWord(10); + const keyValue = 'StringValue!'; + + // Add String key + await browserPage.addStringKey(keyName, keyTTL, keyValue); + const notification = browserPage.Toast.toastHeader.textContent; + await t.expect(notification).contains('Key has been added', 'The notification is not displayed'); + await t.click(browserPage.closeKeyButton); + // Search for the added key + await browserPage.searchByKeyName(keyName); + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).ok('The key is not in the list'); + // Open the key details + await t.click(browserPage.keyNameInTheList); + const keyNameFromDetails = await browserPage.keyNameFormDetails.textContent; + await t.expect(keyNameFromDetails).contains(keyName, 'The Key details is not opened'); +}); diff --git a/tests/e2e/tests/smoke/browser/set-key.e2e.ts b/tests/e2e/tests/web/smoke/browser/set-key.e2e.ts similarity index 77% rename from tests/e2e/tests/smoke/browser/set-key.e2e.ts rename to tests/e2e/tests/web/smoke/browser/set-key.e2e.ts index 0068f073f0..bf876aa149 100644 --- a/tests/e2e/tests/smoke/browser/set-key.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/set-key.e2e.ts @@ -1,10 +1,10 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/set-ttl-for-key.e2e.ts b/tests/e2e/tests/web/smoke/browser/set-ttl-for-key.e2e.ts similarity index 78% rename from tests/e2e/tests/smoke/browser/set-ttl-for-key.e2e.ts rename to tests/e2e/tests/web/smoke/browser/set-ttl-for-key.e2e.ts index 78a94f5a6e..1327cff3a4 100644 --- a/tests/e2e/tests/smoke/browser/set-ttl-for-key.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/set-ttl-for-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/verify-key-details.e2e.ts b/tests/e2e/tests/web/smoke/browser/verify-key-details.e2e.ts similarity index 93% rename from tests/e2e/tests/smoke/browser/verify-key-details.e2e.ts rename to tests/e2e/tests/web/smoke/browser/verify-key-details.e2e.ts index 50b86fc04f..4d61b55143 100644 --- a/tests/e2e/tests/smoke/browser/verify-key-details.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/verify-key-details.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/browser/verify-keys-refresh.e2e.ts b/tests/e2e/tests/web/smoke/browser/verify-keys-refresh.e2e.ts similarity index 56% rename from tests/e2e/tests/smoke/browser/verify-keys-refresh.e2e.ts rename to tests/e2e/tests/web/smoke/browser/verify-keys-refresh.e2e.ts index a773eff09d..1e96ae285b 100644 --- a/tests/e2e/tests/smoke/browser/verify-keys-refresh.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/verify-keys-refresh.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); @@ -12,7 +12,6 @@ const databaseAPIRequests = new DatabaseAPIRequests(); const apiKeyRequests = new APIKeyRequests(); let keyName = Common.generateWord(10); -let newKeyName = Common.generateWord(10); fixture `Keys refresh functionality` .meta({ type: 'smoke', rte: rte.standalone }) @@ -27,22 +26,23 @@ fixture `Keys refresh functionality` }); test('Verify that user can refresh Keys', async t => { keyName = Common.generateWord(10); - const keyTTL = '2147476121'; - newKeyName = Common.generateWord(10); + const newKeyName = 'KeyNameAfterEdit!testKey'; // Add hash key - await browserPage.addHashKey(keyName, keyTTL); + await browserPage.addHashKey(keyName); const notification = browserPage.Toast.toastHeader.textContent; - await t.expect(notification).contains('Key has been added', 'The notification not found'); + await t.expect(notification).contains('Key has been added', 'The notification is not displayed'); await t.click(browserPage.closeKeyButton); // Search for the added key await browserPage.searchByKeyName(keyName); - await t.expect(browserPage.keyNameInTheList.withExactText(keyName).exists).ok('The key is not displayed in the list', { timeout: 10000 }); - // Edit the key name + const isKeyIsDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsDisplayedInTheList).eql(true, 'The key is not in the list'); + // Edit the key name in details await t.click(browserPage.keyNameInTheList); await browserPage.editKeyName(newKeyName); - // Refresh Keys and check + // Refresh Keys await t.click(browserPage.refreshKeysButton); await browserPage.searchByKeyName(keyName); - await t.expect(browserPage.keyNameInTheList.withExactText(keyName).exists).notOk('The key is still in the list', { timeout: 10000 }); + const isKeyIsNotDisplayedInTheList = await browserPage.isKeyIsDisplayedInTheList(keyName); + await t.expect(isKeyIsNotDisplayedInTheList).eql(false, 'The key is still in the list'); }); diff --git a/tests/e2e/tests/smoke/browser/zset-key.e2e.ts b/tests/e2e/tests/web/smoke/browser/zset-key.e2e.ts similarity index 79% rename from tests/e2e/tests/smoke/browser/zset-key.e2e.ts rename to tests/e2e/tests/web/smoke/browser/zset-key.e2e.ts index a6cc8ab46b..3552eaeb1b 100644 --- a/tests/e2e/tests/smoke/browser/zset-key.e2e.ts +++ b/tests/e2e/tests/web/smoke/browser/zset-key.e2e.ts @@ -1,10 +1,10 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/cli/cli-command-helper.e2e.ts b/tests/e2e/tests/web/smoke/cli/cli-command-helper.e2e.ts similarity index 94% rename from tests/e2e/tests/smoke/cli/cli-command-helper.e2e.ts rename to tests/e2e/tests/web/smoke/cli/cli-command-helper.e2e.ts index 9750aee5c9..5bcbb25d25 100644 --- a/tests/e2e/tests/smoke/cli/cli-command-helper.e2e.ts +++ b/tests/e2e/tests/web/smoke/cli/cli-command-helper.e2e.ts @@ -1,8 +1,8 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { BrowserPage } from '../../../pageObjects'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { BrowserPage } from '../../../../pageObjects'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const browserPage = new BrowserPage(); const databaseHelper = new DatabaseHelper(); diff --git a/tests/e2e/tests/smoke/cli/cli.e2e.ts b/tests/e2e/tests/web/smoke/cli/cli.e2e.ts similarity index 58% rename from tests/e2e/tests/smoke/cli/cli.e2e.ts rename to tests/e2e/tests/web/smoke/cli/cli.e2e.ts index 14877e9469..a3e37b738c 100644 --- a/tests/e2e/tests/smoke/cli/cli.e2e.ts +++ b/tests/e2e/tests/web/smoke/cli/cli.e2e.ts @@ -1,10 +1,10 @@ -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, BrowserPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; -import { APIKeyRequests } from '../../../helpers/api/api-keys'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, BrowserPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; +import { APIKeyRequests } from '../../../../helpers/api/api-keys'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browserPage = new BrowserPage(); @@ -61,29 +61,28 @@ test('Verify that user can use blocking command', async t => { await t.expect(browserPage.Cli.cliArea.visible).notOk('CLI area should still displayed'); }); // update after resolving testcafe Native Automation mode limitations -test.skip - .meta({ env: env.web })('Verify that user can use unblocking command', async t => { - // Open CLI - await t.click(browserPage.Cli.cliExpandButton); - // Get clientId - await t.typeText(browserPage.Cli.cliCommandInput, 'client id'); - await t.pressKey('enter'); - const clientId = (await browserPage.Cli.cliOutputResponseSuccess.textContent).replace(/^\D+/g, ''); - // Type blocking command - await t.typeText(browserPage.Cli.cliCommandInput, 'blpop newKey 10000', { replace: true, paste: true }); - await t.pressKey('enter'); - // Verify that user input is blocked - await t.expect(browserPage.Cli.cliCommandInput.exists).notOk('Cli input is still shown'); - // Create new window to unblock the client - await t - .openWindow(commonUrl) - .maximizeWindow(); - await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); - // Open CLI - await t.click(browserPage.Cli.cliExpandButton); - // Unblock client - await t.typeText(browserPage.Cli.cliCommandInput, `client unblock ${clientId}`, { replace: true, paste: true }); - await t.pressKey('enter'); - await t.closeWindow(); - await t.expect(browserPage.Cli.cliCommandInput.exists).ok('Cli input is not shown, the client still blocked', { timeout: 10000 }); - }); +test.skip('Verify that user can use unblocking command', async t => { + // Open CLI + await t.click(browserPage.Cli.cliExpandButton); + // Get clientId + await t.typeText(browserPage.Cli.cliCommandInput, 'client id'); + await t.pressKey('enter'); + const clientId = (await browserPage.Cli.cliOutputResponseSuccess.textContent).replace(/^\D+/g, ''); + // Type blocking command + await t.typeText(browserPage.Cli.cliCommandInput, 'blpop newKey 10000', { replace: true, paste: true }); + await t.pressKey('enter'); + // Verify that user input is blocked + await t.expect(browserPage.Cli.cliCommandInput.exists).notOk('Cli input is still shown'); + // Create new window to unblock the client + await t + .openWindow(commonUrl) + .maximizeWindow(); + await myRedisDatabasePage.clickOnDBByName(ossStandaloneConfig.databaseName); + // Open CLI + await t.click(browserPage.Cli.cliExpandButton); + // Unblock client + await t.typeText(browserPage.Cli.cliCommandInput, `client unblock ${clientId}`, { replace: true, paste: true }); + await t.pressKey('enter'); + await t.closeWindow(); + await t.expect(browserPage.Cli.cliCommandInput.exists).ok('Cli input is not shown, the client still blocked', { timeout: 10000 }); +}); diff --git a/tests/e2e/tests/smoke/database/add-db-from-welcome-page.e2e.ts b/tests/e2e/tests/web/smoke/database/add-db-from-welcome-page.e2e.ts similarity index 60% rename from tests/e2e/tests/smoke/database/add-db-from-welcome-page.e2e.ts rename to tests/e2e/tests/web/smoke/database/add-db-from-welcome-page.e2e.ts index 781d08ecc5..1535f1338b 100644 --- a/tests/e2e/tests/smoke/database/add-db-from-welcome-page.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/add-db-from-welcome-page.e2e.ts @@ -1,9 +1,9 @@ import { ClientFunction } from 'testcafe'; -import { env, rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, BrowserPage, WelcomePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, BrowserPage, WelcomePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const browsePage = new BrowserPage(); @@ -37,21 +37,20 @@ test await t.expect(myRedisDatabasePage.dbNameList.withExactText(ossStandaloneConfig.databaseName).exists).ok('The database not added', { timeout: 10000 }); }); // update after resolving testcafe Native Automation mode limitations -test.skip - .meta({ env: env.web })('Verify that all the links are valid from Welcome page', async t => { - // Verify build from source link - await t.click(welcomePage.buildFromSource); - await t.expect(getPageUrl()).eql(sourcePage, 'Build from source link is not valid'); - await t.switchToParentWindow(); - // Verify build from docker link - await t.click(welcomePage.buildFromDocker); - await t.expect(getPageUrl()).eql(dockerPage, 'Build from docker page is not valid'); - await t.switchToParentWindow(); - // Verify build from homebrew link - await t.click(welcomePage.buildFromHomebrew); - await t.expect(getPageUrl()).eql(homebrewPage, 'Build from homebrew page is not valid'); - await t.switchToParentWindow(); - // Verify promo button link - await t.click(welcomePage.tryRedisCloudBtn); - await t.expect(getPageUrl()).eql(promoPage, 'Promotion link is not valid'); - }); +test.skip('Verify that all the links are valid from Welcome page', async t => { + // Verify build from source link + await t.click(welcomePage.buildFromSource); + await t.expect(getPageUrl()).eql(sourcePage, 'Build from source link is not valid'); + await t.switchToParentWindow(); + // Verify build from docker link + await t.click(welcomePage.buildFromDocker); + await t.expect(getPageUrl()).eql(dockerPage, 'Build from docker page is not valid'); + await t.switchToParentWindow(); + // Verify build from homebrew link + await t.click(welcomePage.buildFromHomebrew); + await t.expect(getPageUrl()).eql(homebrewPage, 'Build from homebrew page is not valid'); + await t.switchToParentWindow(); + // Verify promo button link + await t.click(welcomePage.tryRedisCloudBtn); + await t.expect(getPageUrl()).eql(promoPage, 'Promotion link is not valid'); +}); diff --git a/tests/e2e/tests/web/smoke/database/add-sentinel-db.e2e.ts b/tests/e2e/tests/web/smoke/database/add-sentinel-db.e2e.ts new file mode 100644 index 0000000000..dbc6acb058 --- /dev/null +++ b/tests/e2e/tests/web/smoke/database/add-sentinel-db.e2e.ts @@ -0,0 +1,23 @@ +import { DatabaseHelper } from '../../../../helpers/database'; +import { commonUrl, ossSentinelConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; + +const myRedisDatabasePage = new MyRedisDatabasePage(); +const databaseHelper = new DatabaseHelper(); + +fixture `Add DBs from Sentinel` + .page(commonUrl) + .meta({ type: 'smoke', rte: rte.standalone }) + .beforeEach(async() => { + await databaseHelper.acceptLicenseTerms(); + }) + .afterEach(async() => { + //Delete database + await myRedisDatabasePage.deleteDatabaseByName(ossSentinelConfig.masters[0].alias); + await myRedisDatabasePage.deleteDatabaseByName(ossSentinelConfig.masters[1].alias); + }); +test('Verify that user can add Sentinel DB', async t => { + await databaseHelper.discoverSentinelDatabase(ossSentinelConfig); + await t.expect(myRedisDatabasePage.hostPort.textContent).eql(`${ossSentinelConfig.sentinelHost}:${ossSentinelConfig.sentinelPort}`, 'The sentinel database is not in the list'); +}); diff --git a/tests/e2e/tests/smoke/database/add-standalone-db.e2e.ts b/tests/e2e/tests/web/smoke/database/add-standalone-db.e2e.ts similarity index 92% rename from tests/e2e/tests/smoke/database/add-standalone-db.e2e.ts rename to tests/e2e/tests/web/smoke/database/add-standalone-db.e2e.ts index 9a62a618a4..a4b8bd7f53 100644 --- a/tests/e2e/tests/smoke/database/add-standalone-db.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/add-standalone-db.e2e.ts @@ -1,14 +1,14 @@ import { t } from 'testcafe'; import { Chance } from 'chance'; -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { commonUrl, ossStandaloneConfig, ossClusterConfig -} from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; -import { BrowserPage, MyRedisDatabasePage } from '../../../pageObjects'; -import { Telemetry } from '../../../helpers/telemetry'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { BrowserPage, MyRedisDatabasePage } from '../../../../pageObjects'; +import { Telemetry } from '../../../../helpers/telemetry'; const browserPage = new BrowserPage(); const myRedisDatabasePage = new MyRedisDatabasePage(); @@ -80,7 +80,7 @@ test await t.expect(myRedisDatabasePage.AddRedisDatabase.timeoutInput.value).eql(connectionTimeout, 'Connection timeout is not customized'); }); test - .meta({ env: env.web, rte: rte.ossCluster }) + .meta({ rte: rte.ossCluster }) .after(async() => { await databaseHelper.deleteDatabase(ossClusterConfig.ossClusterDatabaseName); })('Verify that user can add OSS Cluster DB', async() => { diff --git a/tests/e2e/tests/smoke/database/autodiscover-db.e2e.ts b/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts similarity index 93% rename from tests/e2e/tests/smoke/database/autodiscover-db.e2e.ts rename to tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts index e805604c34..2c1d0e16a1 100644 --- a/tests/e2e/tests/smoke/database/autodiscover-db.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts @@ -1,12 +1,12 @@ import { t } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; +import { DatabaseHelper } from '../../../../helpers/database'; import { commonUrl, redisEnterpriseClusterConfig, cloudDatabaseConfig -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { AutoDiscoverREDatabases, MyRedisDatabasePage } from '../../../pageObjects'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { AutoDiscoverREDatabases, MyRedisDatabasePage } from '../../../../pageObjects'; const myRedisDatabasePage = new MyRedisDatabasePage(); const autoDiscoverREDatabases = new AutoDiscoverREDatabases(); diff --git a/tests/e2e/tests/smoke/database/connecting-to-the-db.e2e.ts b/tests/e2e/tests/web/smoke/database/connecting-to-the-db.e2e.ts similarity index 88% rename from tests/e2e/tests/smoke/database/connecting-to-the-db.e2e.ts rename to tests/e2e/tests/web/smoke/database/connecting-to-the-db.e2e.ts index 55531b20bf..e9dde2b771 100644 --- a/tests/e2e/tests/smoke/database/connecting-to-the-db.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/connecting-to-the-db.e2e.ts @@ -1,12 +1,12 @@ import { ClientFunction } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; import { commonUrl, ossClusterConfig, ossSentinelConfig -} from '../../../helpers/conf'; -import { env, rte } from '../../../helpers/constants'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; const myRedisDatabasePage = new MyRedisDatabasePage(); const databaseHelper = new DatabaseHelper(); @@ -20,7 +20,7 @@ fixture `Connecting to the databases verifications` await databaseHelper.acceptLicenseTerms(); }); test - .meta({ env: env.web, rte: rte.sentinel }) + .meta({ rte: rte.sentinel }) .after(async() => { // Delete database await myRedisDatabasePage.deleteDatabaseByName(ossSentinelConfig.masters[0].name); @@ -49,7 +49,7 @@ test } }); test - .meta({ env: env.web, rte: rte.ossCluster }) + .meta({ rte: rte.ossCluster }) .after(async() => { await databaseHelper.deleteDatabase(ossClusterConfig.ossClusterDatabaseName); })('Verify that user can connect to OSS Cluster DB', async t => { diff --git a/tests/e2e/tests/smoke/database/delete-the-db.e2e.ts b/tests/e2e/tests/web/smoke/database/delete-the-db.e2e.ts similarity index 79% rename from tests/e2e/tests/smoke/database/delete-the-db.e2e.ts rename to tests/e2e/tests/web/smoke/database/delete-the-db.e2e.ts index 87338bc436..b4acfeda37 100644 --- a/tests/e2e/tests/smoke/database/delete-the-db.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/delete-the-db.e2e.ts @@ -1,8 +1,8 @@ import { Chance } from 'chance'; -import { DatabaseHelper } from '../../../helpers/database'; -import { rte } from '../../../helpers/constants'; -import { MyRedisDatabasePage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { rte } from '../../../../helpers/constants'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; const chance = new Chance(); const myRedisDatabasePage = new MyRedisDatabasePage(); diff --git a/tests/e2e/tests/smoke/database/edit-db.e2e.ts b/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts similarity index 86% rename from tests/e2e/tests/smoke/database/edit-db.e2e.ts rename to tests/e2e/tests/web/smoke/database/edit-db.e2e.ts index 0664a76bb0..ac37c19698 100644 --- a/tests/e2e/tests/smoke/database/edit-db.e2e.ts +++ b/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts @@ -1,13 +1,13 @@ import { ClientFunction } from 'testcafe'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage } from '../../../pageObjects'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage } from '../../../../pageObjects'; import { commonUrl, ossStandaloneConfig, redisEnterpriseClusterConfig -} from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { UserAgreementDialog } from '../../../pageObjects/dialogs'; +} from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { UserAgreementDialog } from '../../../../pageObjects/dialogs'; const myRedisDatabasePage = new MyRedisDatabasePage(); const userAgreementDialog = new UserAgreementDialog(); diff --git a/tests/e2e/tests/smoke/workbench/json-workbench.e2e.ts b/tests/e2e/tests/web/smoke/workbench/json-workbench.e2e.ts similarity index 83% rename from tests/e2e/tests/smoke/workbench/json-workbench.e2e.ts rename to tests/e2e/tests/web/smoke/workbench/json-workbench.e2e.ts index 743ccb73c0..7f8ebdd65a 100644 --- a/tests/e2e/tests/smoke/workbench/json-workbench.e2e.ts +++ b/tests/e2e/tests/web/smoke/workbench/json-workbench.e2e.ts @@ -1,9 +1,9 @@ -import { rte } from '../../../helpers/constants'; -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneRedisearch } from '../../../helpers/conf'; -import { Common } from '../../../helpers/common'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneRedisearch } from '../../../../helpers/conf'; +import { Common } from '../../../../helpers/common'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/tests/smoke/workbench/scripting-area.e2e.ts b/tests/e2e/tests/web/smoke/workbench/scripting-area.e2e.ts similarity index 91% rename from tests/e2e/tests/smoke/workbench/scripting-area.e2e.ts rename to tests/e2e/tests/web/smoke/workbench/scripting-area.e2e.ts index 35abcb7f9d..64ce6479d0 100644 --- a/tests/e2e/tests/smoke/workbench/scripting-area.e2e.ts +++ b/tests/e2e/tests/web/smoke/workbench/scripting-area.e2e.ts @@ -1,8 +1,8 @@ -import { DatabaseHelper } from '../../../helpers/database'; -import { MyRedisDatabasePage, WorkbenchPage } from '../../../pageObjects'; -import { commonUrl, ossStandaloneConfig } from '../../../helpers/conf'; -import { rte } from '../../../helpers/constants'; -import { DatabaseAPIRequests } from '../../../helpers/api/api-database'; +import { DatabaseHelper } from '../../../../helpers/database'; +import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects'; +import { commonUrl, ossStandaloneConfig } from '../../../../helpers/conf'; +import { rte } from '../../../../helpers/constants'; +import { DatabaseAPIRequests } from '../../../../helpers/api/api-database'; const myRedisDatabasePage = new MyRedisDatabasePage(); const workbenchPage = new WorkbenchPage(); diff --git a/tests/e2e/web.runner.ts b/tests/e2e/web.runner.ts index d5f9c0ab5b..f82a61baab 100644 --- a/tests/e2e/web.runner.ts +++ b/tests/e2e/web.runner.ts @@ -10,11 +10,8 @@ import testcafe from 'testcafe'; configPath: 'tsconfig.testcafe.json', experimentalDecorators: true }}) - .src((process.env.TEST_FILES || 'tests/**/*.e2e.ts').split('\n')) + .src((process.env.TEST_FILES || 'tests/web/**/*.e2e.ts').split('\n')) .browsers(['chromium:headless --cache --allow-insecure-localhost --ignore-certificate-errors']) - .filter((_testName, _fixtureName, _fixturePath, testMeta): boolean => { - return testMeta.env !== 'desktop' - }) .screenshots({ path: 'report/screenshots/', takeOnFails: true,