Skip to content

Commit 74d59da

Browse files
committed
Merge branch 'refs/heads/main' into gh/actions/test
# Conflicts: # .github/workflows/pipeline-build-macos.yml # .github/workflows/tests.yml
2 parents cfa7e70 + f3dfb21 commit 74d59da

File tree

14 files changed

+425
-134
lines changed

14 files changed

+425
-134
lines changed

.github/workflows/tests-backend.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
runs-on: ubuntu-latest
2121
environment:
2222
name: staging
23-
url: ${{ env.DEFAULT_GITHUB_PAGES_URL }}/${{ github.run_id }}/${{ env.REPORT_NAME }}/report
23+
url: ${{ env.DEFAULT_GITHUB_PAGES_URL }}/${{ github.run_id }}/${{ env.REPORT_NAME }}
2424
steps:
2525
- uses: actions/checkout@v4
2626

.github/workflows/tests-frontend.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
name: Frontend tests
1515
environment:
1616
name: staging
17-
url: ${{ env.DEFAULT_GITHUB_PAGES_URL }}/${{ github.run_id }}/${{ env.REPORT_NAME }}/report
17+
url: ${{ env.DEFAULT_GITHUB_PAGES_URL }}/${{ github.run_id }}/${{ env.REPORT_NAME }}
1818
steps:
1919
- uses: actions/checkout@v4
2020

.github/workflows/tests-integration.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ jobs:
157157
runs-on: ubuntu-latest
158158
name: Final coverage
159159
needs: run-tests
160+
if: always()
160161
steps:
161162
- uses: actions/checkout@v4
162163

@@ -171,7 +172,7 @@ jobs:
171172
- name: Download coverage artifacts
172173
uses: actions/download-artifact@v4
173174
with:
174-
pattern: coverages-artifacts
175+
name: coverages-artifacts
175176
path: ./coverages
176177

177178
- name: Calculate coverage across all tests runs

tests/e2e/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"selenium-webdriver": "^4.25.0",
6666
"sqlite3": "^5.1.7",
6767
"supertest": "^7.0.0",
68-
"testcafe": "3.6.2",
68+
"testcafe": "3.7.0",
6969
"testcafe-browser-provider-electron": "0.0.21",
7070
"testcafe-reporter-html": "1.4.6",
7171
"testcafe-reporter-json": "2.2.0",

tests/e2e/tests/web/critical-path/memory-efficiency/recommendations.e2e.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
1212
import { RecommendationsActions } from '../../../../common-actions/recommendations-actions';
1313
import { Common } from '../../../../helpers/common';
1414
import { APIKeyRequests } from '../../../../helpers/api/api-keys';
15+
import { Telemetry } from '../../../../helpers';
1516

1617
const memoryEfficiencyPage = new MemoryEfficiencyPage();
1718
const myRedisDatabasePage = new MyRedisDatabasePage();
@@ -21,6 +22,16 @@ const workbenchPage = new WorkbenchPage();
2122
const databaseHelper = new DatabaseHelper();
2223
const databaseAPIRequests = new DatabaseAPIRequests();
2324
const apiKeyRequests = new APIKeyRequests();
25+
const telemetry = new Telemetry();
26+
27+
const logger = telemetry.createLogger();
28+
29+
const telemetryEvent = 'DATABASE_ANALYSIS_TIPS_COLLAPSED';
30+
const expectedProperties = [
31+
'databaseId',
32+
'provider',
33+
'recommendation'
34+
];
2435

2536
// const externalPageLink = 'https://docs.redis.com/latest/ri/memory-optimizations/';
2637
let keyName = `recomKey-${Common.generateWord(10)}`;
@@ -46,6 +57,7 @@ fixture `Memory Efficiency Recommendations`
4657
await databaseAPIRequests.deleteStandaloneDatabaseApi(ossStandaloneConfig);
4758
});
4859
test
60+
.requestHooks(logger)
4961
.before(async t => {
5062
await databaseHelper.acceptLicenseTermsAndAddDatabaseApi(ossStandaloneBigConfig);
5163
// Go to Analysis Tools page
@@ -82,6 +94,10 @@ test
8294
// Verify that user can expand/collapse recommendation
8395
const expandedTextContaiterSize = await memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight;
8496
await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation));
97+
98+
//Verify telemetry event
99+
await telemetry.verifyEventHasProperties(telemetryEvent, expectedProperties, logger);
100+
85101
await t.expect(memoryEfficiencyPage.getRecommendationByName(luaScriptRecommendation).offsetHeight)
86102
.lt(expandedTextContaiterSize, 'Lua script recommendation not collapsed');
87103
await t.click(memoryEfficiencyPage.getRecommendationButtonByName(luaScriptRecommendation));

tests/e2e/tests/web/critical-path/pub-sub/subscribe-unsubscribe.e2e.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@ import { commonUrl, ossStandaloneConfig, ossStandaloneV5Config } from '../../../
44
import { rte } from '../../../../helpers/constants';
55
import { verifyMessageDisplayingInPubSub } from '../../../../helpers/pub-sub';
66
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
7+
import { Telemetry } from '../../../../helpers';
78

89
const myRedisDatabasePage = new MyRedisDatabasePage();
910
const pubSubPage = new PubSubPage();
1011
const workbenchPage = new WorkbenchPage();
1112
const databaseHelper = new DatabaseHelper();
1213
const databaseAPIRequests = new DatabaseAPIRequests();
1314
const browserPage = new BrowserPage();
15+
const telemetry = new Telemetry();
16+
17+
const logger = telemetry.createLogger();
18+
19+
const telemetryEvent = 'PUBSUB_MESSAGES_CLEARED';
20+
const expectedProperties = [
21+
'databaseId',
22+
'messages',
23+
'provider'
24+
];
1425

1526
fixture `Subscribe/Unsubscribe from a channel`
1627
.meta({ rte: rte.standalone, type: 'critical_path' })
@@ -145,13 +156,17 @@ test('Verify that the Message field input is preserved until user Publish a mess
145156
// Verify that the Channel field input is preserved until user modify it (publishing a message does not clear the field)
146157
await t.expect(pubSubPage.channelNameInput.value).eql('testChannel', 'Channel input is empty', { timeout: 10000 });
147158
});
148-
test('Verify that user can clear all the messages from the pubsub window', async t => {
159+
test.requestHooks(logger)('Verify that user can clear all the messages from the pubsub window', async t => {
149160
await pubSubPage.subsribeToChannelAndPublishMessage('testChannel', 'message');
150161
await pubSubPage.publishMessage('testChannel2', 'second m');
151162
// Verify the tooltip text 'Clear Messages' appears on hover the clear button
152163
await t.hover(pubSubPage.clearPubSubButton);
153164
await t.expect(pubSubPage.clearButtonTooltip.textContent).contains('Clear Messages', 'Clear Messages tooltip not displayed');
154165
await t.click(pubSubPage.clearPubSubButton);
166+
167+
//Verify telemetry event
168+
await telemetry.verifyEventHasProperties(telemetryEvent, expectedProperties, logger);
169+
155170
// Verify that the clear of the messages does not affect the subscription state
156171
await t.expect(pubSubPage.subscribeStatus.textContent).eql('You are subscribed', 'User is not subscribed', { timeout: 10000 });
157172
// Verify that the Messages counter is reset after clear messages

tests/e2e/tests/web/critical-path/rdi/add-rdi-instance.e2e.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { RdiInstancePage } from '../../../../pageObjects/rdi-instance-page';
77
import { commonUrl } from '../../../../helpers/conf';
88
import { RdiPopoverOptions, RedisOverviewPage } from '../../../../helpers/constants';
99
import { MyRedisDatabasePage } from '../../../../pageObjects';
10-
import { Common, DatabaseHelper } from '../../../../helpers';
10+
import { Common, DatabaseHelper, Telemetry } from '../../../../helpers';
1111
import { RdiApiRequests } from '../../../../helpers/api/api-rdi';
1212
import { goBackHistory } from '../../../../helpers/utils';
1313

@@ -18,6 +18,22 @@ const myRedisDatabasePage = new MyRedisDatabasePage();
1818
const databaseHelper = new DatabaseHelper();
1919
const rdiApiRequests = new RdiApiRequests();
2020

21+
const telemetry = new Telemetry();
22+
23+
const logger = telemetry.createLogger();
24+
25+
const telemetryEvents = ['RDI_INSTANCE_LIST_SEARCHED','RDI_START_OPTION_SELECTED'];
26+
27+
const instanceExpectedProperties = [
28+
'instancesFullCount',
29+
'instancesSearchedCount'
30+
];
31+
32+
const pipelineExpectedProperties = [
33+
'id',
34+
'option'
35+
];
36+
2137
const rdiInstance: RdiInstance = {
2238
alias: 'Alias',
2339
url: 'https://11.111.111.111',
@@ -104,19 +120,24 @@ test('Verify that user can add and remove RDI', async() => {
104120

105121
await t.expect(rdiInstancesListPage.emptyRdiList.textContent).contains('Redis Data Integration', 'The instance is not removed');
106122
});
107-
test
123+
test.requestHooks(logger)
108124
.after(async() => {
109125
await rdiInstancesListPage.deleteAllInstance();
110126
})('Verify that user can search by RDI', async() => {
111127
await rdiInstancesListPage.addRdi(rdiInstance);
112128
await rdiInstancesListPage.addRdi(rdiInstance2);
113129
await t.typeText(rdiInstancesListPage.searchInput, rdiInstance2.alias);
130+
131+
//Verify telemetry event
132+
await telemetry.verifyEventHasProperties(telemetryEvents[0], instanceExpectedProperties, logger);
133+
114134
const addedRdiInstance = await rdiInstancesListPage.getRdiInstanceValuesByIndex(0);
115135
await t.expect(addedRdiInstance.alias).eql(rdiInstance2.alias, 'correct item is displayed');
116136

117137
await t.expect(await rdiInstancesListPage.rdiInstanceRow.count).eql(1, 'search works incorrectly');
118138
});
119-
test('Verify that sorting on the list of rdi saved when rdi opened', async t => {
139+
test.requestHooks(logger)
140+
('Verify that sorting on the list of rdi saved when rdi opened', async t => {
120141
// Sort by Connection Type
121142
await rdiInstancesListPage.addRdi(rdiInstance);
122143
await rdiInstancesListPage.addRdi(rdiInstance3);
@@ -128,6 +149,10 @@ test('Verify that sorting on the list of rdi saved when rdi opened', async t =>
128149
await rdiInstancesListPage.compareInstances(actualDatabaseList, sortedByAlias);
129150
await rdiInstancesListPage.clickRdiByName(rdiInstance.alias);
130151
await rdiInstancePage.selectStartPipelineOption(RdiPopoverOptions.Pipeline);
152+
153+
//verify telemetry event
154+
await telemetry.verifyEventHasProperties(telemetryEvents[1], pipelineExpectedProperties, logger);
155+
131156
await t.click(rdiInstancePage.RdiHeader.breadcrumbsLink);
132157
actualDatabaseList = await rdiInstancesListPage.getAllRdiNames();
133158
await rdiInstancesListPage.compareInstances(actualDatabaseList, sortedByAlias);

tests/e2e/tests/web/critical-path/settings/settings.e2e.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@ import { MyRedisDatabasePage, SettingsPage } from '../../../../pageObjects';
22
import { rte } from '../../../../helpers/constants';
33
import { DatabaseHelper } from '../../../../helpers/database';
44
import { commonUrl } from '../../../../helpers/conf';
5+
import { Common, Telemetry } from '../../../../helpers';
56

67
const myRedisDatabasePage = new MyRedisDatabasePage();
78
const settingsPage = new SettingsPage();
89
const databaseHelper = new DatabaseHelper();
10+
const telemetry = new Telemetry();
11+
12+
const logger = telemetry.createLogger();
13+
14+
const telemetryEvent = 'SETTINGS_WORKBENCH_EDITOR_CLEAR_CHANGED';
15+
16+
const expectedProperties = [
17+
'currentValue',
18+
'newValue'
19+
];
920

1021
const explicitErrorHandler = (): void => {
1122
window.addEventListener('error', e => {
@@ -52,5 +63,19 @@ test('Verify that user can turn on/off Analytics in Settings in the application'
5263
await myRedisDatabasePage.reloadPage();
5364
await t.click(settingsPage.accordionPrivacySettings);
5465
await t.expect(await settingsPage.getAnalyticsSwitcherValue()).eql(value, 'Analytics was switched properly');
66+
// Verify that telemetry is turned off
67+
if(value === false){
68+
await t.click(settingsPage.accordionWorkbenchSettings);
69+
//turn on and turn off option
70+
await t.click(settingsPage.switchEditorCleanupOption);
71+
await t.click(settingsPage.switchEditorCleanupOption);
72+
73+
try {
74+
await telemetry.verifyEventHasProperties(telemetryEvent, expectedProperties, logger);
75+
await t.expect(true).eql(false, 'telemetry is sent when analytics is disabled');
76+
} catch (error) {
77+
await t.expect(true).eql(true, 'telemetry is not sent when analytics is disabled');
78+
}
79+
}
5580
}
5681
});

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,29 @@ import { rte } from '../../../../helpers/constants';
33
import { DatabaseHelper } from '../../../../helpers/database';
44
import { commonUrl, ossStandaloneBigConfig } from '../../../../helpers/conf';
55
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
6+
import { Telemetry } from '../../../../helpers';
67

78
const slowLogPage = new SlowLogPage();
89
const myRedisDatabasePage = new MyRedisDatabasePage();
910
const browserPage = new BrowserPage();
1011
const overviewPage = new ClusterDetailsPage();
1112
const databaseHelper = new DatabaseHelper();
1213
const databaseAPIRequests = new DatabaseAPIRequests();
14+
const telemetry = new Telemetry();
15+
16+
const logger = telemetry.createLogger();
17+
18+
const telemetryEvents = ['SLOWLOG_CLEARED','SLOWLOG_LOADED'];
19+
const clearExpectedProperties = [
20+
'databaseId',
21+
'provider'
22+
];
23+
24+
const loadExpectedProperties = [
25+
'databaseId',
26+
'numberOfCommands',
27+
'provider'
28+
];
1329

1430
const slowerThanParameter = 1;
1531
let maxCommandLength = 50;
@@ -108,7 +124,8 @@ test('Verify that user can set slowlog-log-slower-than value in milliseconds and
108124
await t.expect(parseFloat(microsecondsDuration.replace(' ', '')) / 1000).eql(parseFloat(millisecondsDuration));
109125
await t.expect(parseFloat(microsecondsDuration.replace(' ', ''))).eql(parseFloat(millisecondsDuration) * 1000);
110126
});
111-
test('Verify that user can reset settings to default on Slow Log page', async t => {
127+
test.requestHooks(logger)
128+
('Verify that user can reset settings to default on Slow Log page', async t => {
112129
// Set slowlog-max-len=0
113130
command = 'info';
114131
await slowLogPage.changeSlowerThanParameter(slowerThanParameter, slowLogPage.slowLogConfigureMicroSecondsUnit);
@@ -117,12 +134,20 @@ test('Verify that user can reset settings to default on Slow Log page', async t
117134
await t.expect(slowLogPage.slowLogCommandValue.withExactText(command).exists).ok('Logged command not found');
118135
await t.click(slowLogPage.slowLogClearButton);
119136
await t.click(slowLogPage.slowLogConfirmClearButton);
137+
138+
//Verify telemetry event
139+
await telemetry.verifyEventHasProperties(telemetryEvents[0], clearExpectedProperties, logger);
140+
120141
// Verify that user can clear Slow Log
121142
await t.expect(slowLogPage.slowLogEmptyResult.exists).ok('Slow log is not cleared');
122143

123144
// Set slower than parameter and max length
124145
await slowLogPage.changeSlowerThanParameter(slowerThanParameter, slowLogPage.slowLogConfigureMicroSecondsUnit);
125146
await slowLogPage.changeMaxLengthParameter(maxCommandLength);
147+
148+
//Verify telemetry event
149+
await telemetry.verifyEventHasProperties(telemetryEvents[1], loadExpectedProperties, logger);
150+
126151
// Reset settings to default
127152
await slowLogPage.resetToDefaultConfig();
128153
// Compare configuration after re-setting

tests/e2e/tests/web/critical-path/workbench/default-scripts-area.e2e.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,28 @@ const telemetry = new Telemetry();
1818
let indexName = chance.word({ length: 5 });
1919
let keyName = chance.word({ length: 5 });
2020
const logger = telemetry.createLogger();
21-
const telemetryEvent = 'EXPLORE_PANEL_TUTORIAL_OPENED';
21+
const tutorialTelemetryEvent = 'EXPLORE_PANEL_TUTORIAL_OPENED';
22+
const workbenchTelemetryEvents = ['WORKBENCH_COMMAND_SUBMITTED','WORKBENCH_MODE_CHANGED']
2223
const telemetryPath = 'static/tutorials/ds/hashes.md';
23-
const expectedProperties = [
24+
const tutorialExpectedProperties = [
2425
'databaseId',
2526
'path'
2627
];
28+
const workbenchExpectedProperties = [
29+
'command',
30+
'databaseId',
31+
'multiple',
32+
'pipeline',
33+
'provider',
34+
'rawMode',
35+
'results'
36+
];
37+
const rawModeExpectedProperties = [
38+
'changedFromMode',
39+
'changedToMode',
40+
'databaseId',
41+
'provider',
42+
];
2743

2844
fixture `Default scripts area at Workbench`
2945
.meta({ type: 'critical_path', rte: rte.standalone })
@@ -53,20 +69,24 @@ test
5369
`FT.INFO "${indexName}"`;
5470
// Send commands
5571
await workbenchPage.sendCommandInWorkbench(commandsForSend.join('\n'));
72+
await telemetry.verifyEventHasProperties(workbenchTelemetryEvents[0], workbenchExpectedProperties, logger);
5673
// Run automatically added "FT._LIST" and "FT.INFO {index}" scripts
5774
await workbenchPage.NavigationHeader.togglePanel(true);
5875
const tutorials = await workbenchPage.InsightsPanel.setActiveTab(ExploreTabs.Tutorials);
5976
await t.click(tutorials.dataStructureAccordionTutorialButton);
6077
await t.click(tutorials.internalLinkWorkingWithHashes);
6178

6279
// Verify that telemetry event 'WORKBENCH_ENABLEMENT_AREA_GUIDE_OPENED' sent and has all expected properties
63-
await telemetry.verifyEventHasProperties(telemetryEvent, expectedProperties, logger);
64-
await telemetry.verifyEventPropertyValue(telemetryEvent, 'path', telemetryPath, logger);
80+
await telemetry.verifyEventHasProperties(tutorialTelemetryEvent, tutorialExpectedProperties, logger);
81+
await telemetry.verifyEventPropertyValue(tutorialTelemetryEvent, 'path', telemetryPath, logger);
6582

6683
await workbenchPage.sendCommandInWorkbench(addedScript);
6784

6885
// Check the FT._LIST result
6986
await t.expect(workbenchPage.queryTextResult.textContent).contains(indexName, 'The result of the FT._LIST command not found');
87+
// Verify telemetry event
88+
await t.click(workbenchPage.rawModeBtn);
89+
await telemetry.verifyEventHasProperties(workbenchTelemetryEvents[1], rawModeExpectedProperties, logger);
7090
// Check the FT.INFO result
7191
await t.switchToIframe(workbenchPage.iframe);
7292
await t.expect(workbenchPage.queryColumns.textContent).contains('name', 'The result of the FT.INFO command not found');

0 commit comments

Comments
 (0)