Skip to content

Commit e189286

Browse files
authored
Merge pull request #2252 from RedisInsight/e2e/bugfix/fixes-for-desktop-tests
E2e/bugfix/fixes for desktop tests
2 parents 1a7dcad + edf4ee1 commit e189286

File tree

10 files changed

+162
-87
lines changed

10 files changed

+162
-87
lines changed

.circleci/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@ jobs:
345345
parallelism: << parameters.parallelism >>
346346
steps:
347347
- checkout
348+
- node/install:
349+
node-version: '18.15.0'
348350
- attach_workspace:
349351
at: .
350352
- run: sudo apt-get install net-tools
@@ -1179,6 +1181,12 @@ workflows:
11791181
- windows:
11801182
name: Build app - Windows (stage)
11811183
requires: *stageElectronBuildRequires
1184+
# e2e desktop tests on AppImage build
1185+
- e2e-app-image:
1186+
name: E2ETest (AppImage)
1187+
parallelism: 2
1188+
requires:
1189+
- Build app - Linux (stage)
11821190
# release to AWS (stage)
11831191
- release-aws-test:
11841192
name: Release AWS stage

.circleci/e2e/test.app-image.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ docker-compose -f tests/e2e/rte.docker-compose.yml up --force-recreate -d -V
1515
./tests/e2e/wait-for-redis.sh localhost 12000 && \
1616

1717
# run tests
18-
COMMON_URL=$(tail -n 1 apppath)/resources/app.asar/index.html \
18+
COMMON_URL=$(tail -n 1 apppath)/resources/app.asar/dist/renderer/index.html \
1919
ELECTRON_PATH=$(tail -n 1 apppath)/redisinsight \
2020
SOCKETS_CORS=true \
2121
yarn --cwd tests/e2e dotenv -e .desktop.env yarn --cwd tests/e2e test:desktop:ci

.circleci/e2e/test.exe.cmd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@echo off
22

3-
set COMMON_URL=%USERPROFILE%/AppData/Local/Programs/redisinsight/resources/app.asar/index.html
4-
set ELECTRON_PATH=%USERPROFILE%/AppData/Local/Programs/redisinsight/RedisInsight-preview.exe
3+
set COMMON_URL=%USERPROFILE%/AppData/Local/Programs/redisinsight/resources/app.asar/dist/renderer/index.html
4+
set ELECTRON_PATH=%USERPROFILE%/AppData/Local/Programs/redisinsight/RedisInsight-v2.exe
55
set OSS_STANDALONE_HOST=%E2E_CLOUD_DATABASE_HOST%
66
set OSS_STANDALONE_PORT=%E2E_CLOUD_DATABASE_PORT%
77
set OSS_STANDALONE_USERNAME=%E2E_CLOUD_DATABASE_USERNAME%

tests/e2e/.desktop.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
COMMON_URL=https://localhost:5031
2-
API_URL=https://localhost:5031/api
1+
COMMON_URL=https://localhost:5530
2+
API_URL=https://localhost:5530/api
33
OSS_SENTINEL_PASSWORD=password
44
APP_FOLDER_NAME=.redisinsight-v2-stage
55

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import * as request from 'supertest';
2+
import { Common } from '../common';
3+
import { Methods } from '../constants';
4+
5+
const endpoint = Common.getEndpoint();
6+
7+
/**
8+
* Send request using API
9+
* @param method http method
10+
* @param resourcePath URI path segment
11+
* @param statusCode Expected status code of the response
12+
* @param body Request body
13+
*/
14+
export async function sendRequest(
15+
method: string,
16+
resourcePath: string,
17+
statusCode: number,
18+
body?: Record<string, unknown>
19+
): Promise<any> {
20+
const windowId = Common.getWindowId();
21+
let requestEndpoint;
22+
23+
if (method === Methods.post) {
24+
(requestEndpoint = request(endpoint)
25+
.post(resourcePath)
26+
.send(body)
27+
.set('Accept', 'application/json'));
28+
}
29+
else if (method === Methods.get) {
30+
(requestEndpoint = request(endpoint)
31+
.get(resourcePath)
32+
.set('Accept', 'application/json'));
33+
}
34+
else if (method === Methods.delete) {
35+
(requestEndpoint = request(endpoint)
36+
.delete(resourcePath)
37+
.send(body)
38+
.set('Accept', 'application/json'));
39+
}
40+
41+
if (await windowId) {
42+
requestEndpoint.set('X-Window-Id', await windowId);
43+
}
44+
45+
return await requestEndpoint.expect(statusCode);
46+
}

tests/e2e/helpers/api/api-database.ts

Lines changed: 66 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,58 @@
11
import { t } from 'testcafe';
22
import { Chance } from 'chance';
3-
import * as request from 'supertest';
43
import { asyncFilter, doAsyncStuff } from '../async-helper';
54
import { AddNewDatabaseParameters, OSSClusterParameters, databaseParameters, SentinelParameters, ClusterNodes } from '../../pageObjects/components/myRedisDatabase/add-redis-database';
6-
import { Common } from '../common';
5+
import { Methods } from '../constants';
6+
import { sendRequest } from './api-common';
77

88
const chance = new Chance();
9-
const endpoint = Common.getEndpoint();
109

1110
/**
1211
* Add a new Standalone database through api using host and port
1312
* @param databaseParameters The database parameters
1413
*/
1514
export async function addNewStandaloneDatabaseApi(databaseParameters: AddNewDatabaseParameters): Promise<void> {
1615
const uniqueId = chance.string({ length: 10 });
17-
const requestBody = {
18-
'name': databaseParameters.databaseName,
19-
'host': databaseParameters.host,
20-
'port': Number(databaseParameters.port),
21-
'username': databaseParameters.databaseUsername,
22-
'password': databaseParameters.databasePassword
23-
};
16+
const requestBody: {
17+
name?: string,
18+
host: string,
19+
port: number,
20+
username?: string,
21+
password?: string,
22+
tls?: boolean,
23+
verifyServerCert?: boolean,
24+
caCert?: {
25+
name: string,
26+
certificate?: string
27+
},
28+
clientCert?: {
29+
name: string,
30+
certificate?: string,
31+
key?: string
32+
}
33+
} = {
34+
'name': databaseParameters.databaseName,
35+
'host': databaseParameters.host,
36+
'port': Number(databaseParameters.port),
37+
'username': databaseParameters.databaseUsername,
38+
'password': databaseParameters.databasePassword
39+
};
2440

2541
if (databaseParameters.caCert) {
26-
requestBody['tls'] = true;
27-
requestBody['verifyServerCert'] = false;
28-
requestBody['caCert'] = {
42+
requestBody.tls = true;
43+
requestBody.verifyServerCert = false;
44+
requestBody.caCert = {
2945
'name': `ca}-${uniqueId}`,
3046
'certificate': databaseParameters.caCert.certificate
3147
};
32-
requestBody['clientCert'] = {
48+
requestBody.clientCert = {
3349
'name': `client}-${uniqueId}`,
3450
'certificate': databaseParameters.clientCert!.certificate,
3551
'key': databaseParameters.clientCert!.key
3652
};
3753
}
38-
39-
const response = await request(endpoint).post('/databases')
40-
.send(requestBody)
41-
.set('Accept', 'application/json');
42-
await t
43-
.expect(response.status).eql(201, `The creation of ${databaseParameters.databaseName} standalone database request failed: ${await response.body.message}`)
44-
.expect(await response.body.name).eql(databaseParameters.databaseName, `Database Name is not equal to ${databaseParameters.databaseName} in response`);
54+
const response = await sendRequest(Methods.post, '/databases', 201, requestBody);
55+
await t.expect(await response.body.name).eql(databaseParameters.databaseName, `Database Name is not equal to ${databaseParameters.databaseName} in response`);
4556
}
4657

4758
/**
@@ -50,7 +61,7 @@ export async function addNewStandaloneDatabaseApi(databaseParameters: AddNewData
5061
*/
5162
export async function addNewStandaloneDatabasesApi(databasesParameters: AddNewDatabaseParameters[]): Promise<void> {
5263
if (databasesParameters.length) {
53-
await databasesParameters.forEach(async parameter => {
64+
databasesParameters.forEach(async parameter => {
5465
await addNewStandaloneDatabaseApi(parameter);
5566
});
5667
}
@@ -61,15 +72,13 @@ export async function addNewStandaloneDatabasesApi(databasesParameters: AddNewDa
6172
* @param databaseParameters The database parameters
6273
*/
6374
export async function addNewOSSClusterDatabaseApi(databaseParameters: OSSClusterParameters): Promise<void> {
64-
const response = await request(endpoint).post('/databases')
65-
.send({
66-
'name': databaseParameters.ossClusterDatabaseName,
67-
'host': databaseParameters.ossClusterHost,
68-
'port': Number(databaseParameters.ossClusterPort) })
69-
.set('Accept', 'application/json');
70-
71-
await t.expect(await response.status).eql(201, 'The creation of new oss cluster database request failed')
72-
.expect(await response.body.name).eql(databaseParameters.ossClusterDatabaseName, `Database Name is not equal to ${databaseParameters.ossClusterDatabaseName} in response`);
75+
const requestBody = {
76+
'name': databaseParameters.ossClusterDatabaseName,
77+
'host': databaseParameters.ossClusterHost,
78+
'port': Number(databaseParameters.ossClusterPort)
79+
};
80+
const response = await sendRequest(Methods.post, '/databases', 201, requestBody);
81+
await t.expect(await response.body.name).eql(databaseParameters.ossClusterDatabaseName, `Database Name is not equal to ${databaseParameters.ossClusterDatabaseName} in response`);
7382
}
7483

7584
/**
@@ -82,24 +91,21 @@ export async function discoverSentinelDatabaseApi(databaseParameters: SentinelPa
8291
if (primaryGroupsNumber) {
8392
masters = databaseParameters.masters!.slice(0, primaryGroupsNumber);
8493
}
85-
const response = await request(endpoint).post('/redis-sentinel/databases')
86-
.send({
87-
'host': databaseParameters.sentinelHost,
88-
'port': Number(databaseParameters.sentinelPort),
89-
'password': databaseParameters.sentinelPassword,
90-
'masters': masters
91-
})
92-
.set('Accept', 'application/json');
94+
const requestBody = {
95+
'host': databaseParameters.sentinelHost,
96+
'port': Number(databaseParameters.sentinelPort),
97+
'password': databaseParameters.sentinelPassword,
98+
'masters': masters
99+
};
93100

94-
await t.expect(response.status).eql(201, 'Autodiscovery of Sentinel database request failed');
101+
await sendRequest(Methods.post, '/redis-sentinel/databases', 201, requestBody);
95102
}
96103

97104
/**
98105
* Get all databases through api
99106
*/
100107
export async function getAllDatabases(): Promise<string[]> {
101-
const response = await request(endpoint).get('/databases')
102-
.set('Accept', 'application/json').expect(200);
108+
const response = await sendRequest(Methods.get, '/databases', 200);
103109
return await response.body;
104110
}
105111

@@ -111,7 +117,7 @@ export async function getDatabaseIdByName(databaseName?: string): Promise<string
111117
if (!databaseName) {
112118
throw new Error('Error: Missing databaseName');
113119
}
114-
let databaseId: any;
120+
let databaseId;
115121
const allDataBases = await getAllDatabases();
116122
const response = await asyncFilter(allDataBases, async(item: databaseParameters) => {
117123
await doAsyncStuff();
@@ -153,10 +159,8 @@ export async function deleteAllDatabasesApi(): Promise<void> {
153159
databaseIds.push(dbData.id);
154160
}
155161
if (databaseIds.length > 0) {
156-
await request(endpoint).delete('/databases')
157-
.send({ 'ids': databaseIds })
158-
.set('Accept', 'application/json')
159-
.expect(200);
162+
const requestBody = { 'ids': databaseIds };
163+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
160164
}
161165
}
162166
}
@@ -168,11 +172,10 @@ export async function deleteAllDatabasesApi(): Promise<void> {
168172
export async function deleteStandaloneDatabaseApi(databaseParameters: AddNewDatabaseParameters): Promise<void> {
169173
const databaseId = await getDatabaseIdByName(databaseParameters.databaseName);
170174
if (databaseId) {
171-
await request(endpoint).delete('/databases')
172-
.send({ 'ids': [`${databaseId}`] })
173-
.set('Accept', 'application/json')
174-
.expect(200);
175-
} else {
175+
const requestBody = { 'ids': [`${databaseId}`] };
176+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
177+
}
178+
else {
176179
throw new Error('Error: Missing databaseId');
177180
}
178181
}
@@ -185,11 +188,10 @@ export async function deleteStandaloneDatabasesByNamesApi(databaseNames: string[
185188
databaseNames.forEach(async databaseName => {
186189
const databaseId = await getDatabaseIdByName(databaseName);
187190
if (databaseId) {
188-
await request(endpoint).delete('/databases')
189-
.send({ 'ids': [`${databaseId}`] })
190-
.set('Accept', 'application/json')
191-
.expect(200);
192-
} else {
191+
const requestBody = { 'ids': [`${databaseId}`] };
192+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
193+
}
194+
else {
193195
throw new Error('Error: Missing databaseId');
194196
}
195197
});
@@ -201,10 +203,8 @@ export async function deleteStandaloneDatabasesByNamesApi(databaseNames: string[
201203
*/
202204
export async function deleteOSSClusterDatabaseApi(databaseParameters: OSSClusterParameters): Promise<void> {
203205
const databaseId = await getDatabaseIdByName(databaseParameters.ossClusterDatabaseName);
204-
const response = await request(endpoint).delete('/databases')
205-
.send({ 'ids': [`${databaseId}`] }).set('Accept', 'application/json');
206-
207-
await t.expect(response.status).eql(200, 'Delete OSS cluster database request failed');
206+
const requestBody = { 'ids': [`${databaseId}`] };
207+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
208208
}
209209

210210
/**
@@ -214,9 +214,8 @@ export async function deleteOSSClusterDatabaseApi(databaseParameters: OSSCluster
214214
export async function deleteAllSentinelDatabasesApi(databaseParameters: SentinelParameters): Promise<void> {
215215
for (let i = 0; i < databaseParameters.name!.length; i++) {
216216
const databaseId = await getDatabaseIdByName(databaseParameters.name![i]);
217-
const response = await request(endpoint).delete('/databases')
218-
.send({ 'ids': [`${databaseId}`] }).set('Accept', 'application/json');
219-
await t.expect(response.status).eql(200, 'Delete Sentinel database request failed');
217+
const requestBody = { 'ids': [`${databaseId}`] };
218+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
220219
}
221220
}
222221

@@ -225,9 +224,8 @@ export async function deleteAllSentinelDatabasesApi(databaseParameters: Sentinel
225224
*/
226225
export async function deleteAllDatabasesByConnectionTypeApi(connectionType: string): Promise<void> {
227226
const databaseIds = await getDatabaseByConnectionType(connectionType);
228-
const response = await request(endpoint).delete('/databases')
229-
.send({ 'ids': [`${databaseIds}`] }).set('Accept', 'application/json');
230-
await t.expect(response.status).eql(200, 'Delete Sentinel database request failed');
227+
const requestBody = { 'ids': [`${databaseIds}`] };
228+
await sendRequest(Methods.delete, '/databases', 200, requestBody);
231229
}
232230

233231
/**
@@ -248,10 +246,7 @@ export async function deleteStandaloneDatabasesApi(databasesParameters: AddNewDa
248246
*/
249247
export async function getClusterNodesApi(databaseParameters: OSSClusterParameters): Promise<string[]> {
250248
const databaseId = await getDatabaseIdByName(databaseParameters.ossClusterDatabaseName);
251-
const response = await request(endpoint)
252-
.get(`/databases/${databaseId}/cluster-details`)
253-
.set('Accept', 'application/json')
254-
.expect(200);
249+
const response = await sendRequest(Methods.get, `/databases/${databaseId}/cluster-details`, 200);
255250
const nodes = await response.body.nodes;
256251
const nodeNames = await nodes.map((node: ClusterNodes) => (`${node.host }:${ node.port}`));
257252
return nodeNames;

tests/e2e/helpers/api/api-info.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
import { t } from 'testcafe';
2-
import * as request from 'supertest';
3-
import { Common } from '../common';
4-
5-
const endpoint = Common.getEndpoint();
1+
import { sendRequest } from './api-common';
2+
import { Methods } from '../constants';
63

74
/**
85
* Synchronize features
96
*/
107
export async function syncFeaturesApi(): Promise<void> {
11-
const response = await request(endpoint).post('/features/sync')
12-
.set('Accept', 'application/json');
13-
await t.expect(response.status).eql(200, `Synchronization request failed: ${await response.body.message}`);
8+
await sendRequest(Methods.post, '/features/sync', 200);
149
}

tests/e2e/helpers/common.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ import { apiUrl, commonUrl } from './conf';
77

88
const chance = new Chance();
99

10+
declare global {
11+
interface Window {
12+
windowId?: string
13+
}
14+
}
15+
16+
1017
const settingsApiUrl = `${commonUrl}/api/settings`;
1118
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // lgtm[js/disabling-certificate-validation]
1219
const mockedSettingsResponse = {
@@ -157,6 +164,13 @@ export class Common {
157164
return apiUrl;
158165
}
159166

167+
/**
168+
* Return windowId
169+
*/
170+
static getWindowId(): Promise<string> {
171+
return t.eval(() => window.windowId);
172+
}
173+
160174
/**
161175
* Check opened URL
162176
* @param expectedUrl Expected link that is compared with actual

tests/e2e/helpers/constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,9 @@ export enum RecommendationIds {
4747
avoidLogicalDatabases = 'avoidLogicalDatabases',
4848
searchJson = 'searchJSON',
4949
}
50+
51+
export enum Methods {
52+
post = 'post',
53+
get = 'get',
54+
delete = 'delete'
55+
}

0 commit comments

Comments
 (0)