diff --git a/tests/e2e/common-actions/memory-efficiency-actions.ts b/tests/e2e/common-actions/memory-efficiency-actions.ts new file mode 100644 index 0000000000..edb67920ee --- /dev/null +++ b/tests/e2e/common-actions/memory-efficiency-actions.ts @@ -0,0 +1,36 @@ +import {t} from 'testcafe'; +import { MemoryEfficiencyPage } from '../pageObjects'; + +const memoryEfficiencyPage = new MemoryEfficiencyPage(); +export class MemoryEfficiencyActions { + /* + vote for very useful and verify others are disabled + */ + async voteForVeryUsefulAndVerifyDisabled(): Promise { + await t.click(memoryEfficiencyPage.veryUsefulVoteBtn); + await this.verifyVoteDisabled(); + } + /* + vote for useful and verify others are disabled + */ + async voteForUsefulAndVerifyDisabled(): Promise { + await t.click(memoryEfficiencyPage.usefulVoteBtn); + await this.verifyVoteDisabled(); + } + /* + vote for not useful and verify others are disabled + */ + async voteForNotUsefulAndVerifyDisabled(): Promise { + await t.click(memoryEfficiencyPage.notUsefulVoteBtn); + await this.verifyVoteDisabled(); + } + async verifyVoteDisabled(): Promise{ + // Verify that user can rate recommendations with one of 3 existing types at the same time + await t.expect(memoryEfficiencyPage.veryUsefulVoteBtn + .hasAttribute('disabled')).ok('very useful vote button is not disabled'); + await t.expect(memoryEfficiencyPage.usefulVoteBtn + .hasAttribute('disabled')).ok('useful vote button is not disabled'); + await t.expect(memoryEfficiencyPage.notUsefulVoteBtn + .hasAttribute('disabled')).ok('not useful vote button is not disabled'); + } +} diff --git a/tests/e2e/pageObjects/memory-efficiency-page.ts b/tests/e2e/pageObjects/memory-efficiency-page.ts index 376172ca8c..6a70527dbf 100644 --- a/tests/e2e/pageObjects/memory-efficiency-page.ts +++ b/tests/e2e/pageObjects/memory-efficiency-page.ts @@ -1,4 +1,4 @@ -import { Selector } from 'testcafe'; +import {Selector} from 'testcafe'; export class MemoryEfficiencyPage { //------------------------------------------------------------------------------------------- @@ -64,4 +64,8 @@ export class MemoryEfficiencyPage { avoidLogicalDbAccordion = Selector('[data-testid=avoidLogicalDatabases-accordion]'); convertHashToZipAccordion = Selector('[data-testid=convertHashtableToZiplist-accordion]'); compressHashAccordion = Selector('[data-testid=compressHashFieldNames-accordion]'); + veryUsefulVoteBtn = Selector('[data-testid=very-useful-vote-btn]').nth(0); + usefulVoteBtn = Selector('[data-testid=useful-vote-btn]').nth(0); + notUsefulVoteBtn = Selector('[data-testid=not-useful-vote-btn]').nth(0); + recommendationsFeedbackBtn = Selector('[data-testid=recommendation-feedback-btn]'); } diff --git a/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts b/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts index 9ea4f2c7cd..4b010ed580 100644 --- a/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts +++ b/tests/e2e/tests/critical-path/memory-efficiency/recommendations.e2e.ts @@ -4,6 +4,7 @@ import { acceptLicenseTermsAndAddDatabaseApi, deleteCustomDatabase } from '../.. import { commonUrl, ossStandaloneBigConfig, ossStandaloneConfig } from '../../../helpers/conf'; import { deleteStandaloneDatabaseApi } from '../../../helpers/api/api-database'; import { CliActions } from '../../../common-actions/cli-actions'; +import { MemoryEfficiencyActions } from '../../../common-actions/memory-efficiency-actions'; import { Common } from '../../../helpers/common'; const memoryEfficiencyPage = new MemoryEfficiencyPage(); @@ -13,6 +14,7 @@ const common = new Common(); const browserPage = new BrowserPage(); const cliPage = new CliPage(); const addRedisDatabasePage = new AddRedisDatabasePage(); +const memoryEfficiencyActions = new MemoryEfficiencyActions(); const externalPageLink = 'https://docs.redis.com/latest/ri/memory-optimizations/'; let keyName = `recomKey-${common.generateWord(10)}`; @@ -119,3 +121,27 @@ test await t.expect(memoryEfficiencyPage.avoidLogicalDbAccordion.exists).ok('Avoid using logical databases recommendation not displayed'); await t.expect(memoryEfficiencyPage.codeChangesLabel.exists).ok('Avoid using logical databases recommendation not have Code Changes label'); }); +test + .before(async t => { + await acceptLicenseTermsAndAddDatabaseApi(ossStandaloneConfig, ossStandaloneConfig.databaseName); + // Go to Analysis Tools page and create new report and open recommendations + await t.click(myRedisDatabasePage.analysisPageButton); + await t.click(memoryEfficiencyPage.newReportBtn); + await t.click(memoryEfficiencyPage.recommendationsTab); + }).after(async() => { + await deleteStandaloneDatabaseApi(ossStandaloneConfig); + })('Verify that user can upvote recommendations', async t => { + await memoryEfficiencyActions.voteForVeryUsefulAndVerifyDisabled(); + // Verify that user can see previous votes when reload the page + await common.reloadPage(); + await t.click(memoryEfficiencyPage.recommendationsTab); + await memoryEfficiencyActions.verifyVoteDisabled(); + + await t.click(memoryEfficiencyPage.newReportBtn); + await memoryEfficiencyActions.voteForUsefulAndVerifyDisabled(); + + await t.click(memoryEfficiencyPage.newReportBtn); + await memoryEfficiencyActions.voteForNotUsefulAndVerifyDisabled(); + // Verify that user can see the popup with link when he votes for “Not useful” + await t.expect(memoryEfficiencyPage.recommendationsFeedbackBtn.visible).ok('popup did not appear after voting for not useful'); + });