Skip to content

Commit f65efb1

Browse files
committed
updates for api methods to run desktop tests
1 parent 1a7dcad commit f65efb1

File tree

9 files changed

+165
-93
lines changed

9 files changed

+165
-93
lines changed

.circleci/config.yml

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ aliases:
167167

168168
orbs:
169169
win: circleci/[email protected]
170-
node: circleci/node@5.0.2
170+
node: circleci/node@5.1.0
171171
aws: circleci/[email protected]
172172

173173
executors:
@@ -1009,16 +1009,33 @@ workflows:
10091009
only:
10101010
- /^e2e/feature.*/
10111011
- /^e2e/bugfix.*/
1012-
- docker:
1013-
name: Build docker image
1012+
# - docker:
1013+
# name: Build docker image
1014+
# requires:
1015+
# - Start E2E Tests
1016+
# - e2e-tests:
1017+
# name: E2ETest
1018+
# build: docker
1019+
# parallelism: 4
1020+
# requires:
1021+
# - Build docker image
1022+
- setup-sign-certificates:
1023+
name: Setup sign certificates (stage)
1024+
- setup-build:
1025+
name: Setup build (stage)
10141026
requires:
1015-
- Start E2E Tests
1016-
- e2e-tests:
1017-
name: E2ETest
1018-
build: docker
1019-
parallelism: 4
1027+
- Setup sign certificates (stage)
1028+
- linux:
1029+
name: Build app - Linux (stage)
10201030
requires:
1021-
- Build docker image
1031+
- Setup build (stage)
1032+
# e2e desktop tests on AppImage build
1033+
- e2e-app-image:
1034+
name: E2ETest (AppImage) - Nightly
1035+
parallelism: 2
1036+
report: true
1037+
requires:
1038+
- Build app - Linux (stage)
10221039
# Workflow for feature, bugfix, main branches
10231040
feature-main-branch:
10241041
jobs:

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

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', 201);
149
}

0 commit comments

Comments
 (0)