Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions tests/e2e/common-actions/recommendations-actions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Selector, t} from 'testcafe';
import { Selector, t } from 'testcafe';

export class RecommendationsActions {
/**
Expand All @@ -12,33 +12,43 @@ export class RecommendationsActions {
/**
* Get vote selector by recommendation name
* @param recommendationName Name of recommendation
* @param option Option can be "very-useful/useful/not-useful"
* @param option Option can be "useful/not-useful"
*/
async getVoteSelectorByName(recommendationName: string, option: string): Promise<Selector> {
const recomSelector = await this.getRecommendationSelectorByName(recommendationName);

return recomSelector.find(`[data-testid=${option}-vote-btn]`);
return recomSelector.find(`[data-testid='${option}-vote-btn']`);
}

/**
* Vote for recommendation by name and option
* @param recommendationName Name of recommendation
* @param option Option can be "very-useful/useful/not-useful"
*/
* @param option Option can be "useful/not-useful"
*/
async voteForRecommendation(recommendationName: string, option: string): Promise<void> {
const voteSelector = await this.getVoteSelectorByName(recommendationName, option);

await t.click(voteSelector);
}

/**
* Verify that vote is disabled by recommendation name and option
* Verify that vote is selected by recommendation name and option
* @param recommendationName Name of recommendation
* @param option Option can be "very-useful/useful/not-useful"
*/
async verifyVoteDisabled(recommendationName: string, option: string): Promise<void> {
* @param option Option can be "useful/not-useful"
*/
async verifyVoteIsSelected(recommendationName: string, option: string): Promise<void> {
const voteSelector = await this.getVoteSelectorByName(recommendationName, option);

await t.expect(voteSelector.hasAttribute('disabled')).ok(`${option} vote button for ${recommendationName} recommendation is not disabled`);
await t.expect(voteSelector.getAttribute('class')).contains('selected', `${option} vote button for ${recommendationName} recommendation is not selected`);
}

/**
* Verify that vote popup is displayed by recommendation name and option
* @param recommendationName Name of recommendation
* @param option Option can be "useful/not-useful"
*/
async verifyVotePopUpIsDisplayed(recommendationName: string, option: string): Promise<void> {
const popoverSelector = Selector(`[data-testid='${recommendationName}-${option}-popover']`);
await t.expect(popoverSelector.visible).ok(`popover is displayed for ${recommendationName}`);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,21 +139,23 @@ test
}).after(async() => {
await deleteStandaloneDatabaseApi(ossStandaloneV5Config);
})('Verify that user can upvote recommendations', async t => {
await recommendationsActions.voteForRecommendation(redisVersionRecommendation, 'not-useful');
// Verify that user can rate recommendations with one of 3 existing types at the same time
await recommendationsActions.verifyVoteDisabled(redisVersionRecommendation, 'not-useful');
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 t.expect(memoryEfficiencyPage.recommendationsFeedbackBtn.visible).ok('popup did not appear after voting 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.verifyVoteDisabled(redisVersionRecommendation, 'not-useful');
await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, notUsefulVoteOption);

await t.click(memoryEfficiencyPage.newReportBtn);
await recommendationsActions.voteForRecommendation(redisVersionRecommendation, 'useful');
await recommendationsActions.verifyVoteDisabled(redisVersionRecommendation, 'useful');
await recommendationsActions.voteForRecommendation(redisVersionRecommendation, usefulVoteOption);
await recommendationsActions.verifyVoteIsSelected(redisVersionRecommendation, usefulVoteOption);
});
test
.before(async t => {
Expand Down
22 changes: 15 additions & 7 deletions tests/e2e/tests/regression/insights/live-recommendations.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const keyName = `recomKey-${Common.generateWord(10)}`;
const logger = telemetry.createLogger();
const telemetryEvent = 'INSIGHTS_RECOMMENDATION_VOTED';
const expectedProperties = [
'buildType',
'databaseId',
'name',
'provider',
Expand Down Expand Up @@ -95,25 +96,32 @@ test
await acceptLicenseTermsAndAddDatabaseApi(ossStandaloneV5Config, ossStandaloneV5Config.databaseName);
}).after(async() => {
await deleteStandaloneDatabaseApi(ossStandaloneV5Config);
})('Verify that user can upvote recommendations', async t => {
})('Verify that user can upvote recommendations', async() => {
const notUsefulVoteOption = 'not useful';
const usefulVoteOption = 'useful';
await browserPage.InsightsPanel.toggleInsightsPanel(true);
await recommendationsActions.voteForRecommendation(redisVersionRecom, 'not-useful');
// Verify that user can rate recommendations with one of 3 existing types at the same time
await recommendationsActions.verifyVoteDisabled(redisVersionRecom, 'not-useful');
await recommendationsActions.voteForRecommendation(redisVersionRecom, notUsefulVoteOption);
// Verify that user can rate recommendations with one of 2 existing types at the same time
await recommendationsActions.verifyVoteIsSelected(redisVersionRecom, notUsefulVoteOption);

// 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');
await recommendationsActions.verifyVotePopUpIsDisplayed(redisVersionRecom, notUsefulVoteOption);

// Verify that the INSIGHTS_RECOMMENDATIONS_VOTED event sent with Database ID, Recommendation_name, Vote type parameters when user voted for recommendation
await telemetry.verifyEventHasProperties(telemetryEvent, expectedProperties, logger);
await telemetry.verifyEventPropertyValue(telemetryEvent, 'name', 'updateDatabase', logger);
await telemetry.verifyEventPropertyValue(telemetryEvent, 'vote', 'not useful', logger);
await telemetry.verifyEventPropertyValue(telemetryEvent, 'vote', notUsefulVoteOption, logger);

// Verify that user can see previous votes when reload the page
await browserPage.reloadPage();
await browserPage.InsightsPanel.toggleInsightsPanel(true);
await browserPage.InsightsPanel.toggleRecommendation(redisVersionRecom, true);
await recommendationsActions.verifyVoteDisabled(redisVersionRecom, 'not-useful');
await recommendationsActions.verifyVoteIsSelected(redisVersionRecom, notUsefulVoteOption);

// Verify that user can change previous votes
await recommendationsActions.voteForRecommendation(redisVersionRecom, usefulVoteOption);
// Verify that user can rate recommendations with one of 2 existing types at the same time
await recommendationsActions.verifyVoteIsSelected(redisVersionRecom, usefulVoteOption);
});
test('Verify that user can hide recommendations and checkbox value is saved', async t => {
const commandToGetRecommendation = 'FT.INFO';
Expand Down