Skip to content

Commit 19b0488

Browse files
Merge branch 'main' into feature/RI-4723-open_RI_from_SM
2 parents fe12ba6 + 736ef03 commit 19b0488

37 files changed

+1384
-16
lines changed

redisinsight/api/src/__mocks__/cloud-capi-key.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { CloudCapiAuthDto } from 'src/modules/cloud/common/dto';
22
import { CloudCapiKey, ICloudApiCapiAccessKey, ICloudApiCapiKey } from 'src/modules/cloud/capi-key/model';
3+
import { CloudCapiKeyEntity } from 'src/modules/cloud/capi-key/entity/cloud-capi-key.entity';
4+
import { EncryptionStrategy } from 'src/modules/encryption/models';
35
import { mockServer } from 'src/__mocks__/server';
46

57
export const mockCloudCapiAuthDto: CloudCapiAuthDto = {
@@ -31,6 +33,16 @@ export const mockCloudCapiKey = Object.assign(new CloudCapiKey(), {
3133
lastUsed: new Date(),
3234
});
3335

36+
export const mockCapiKeyEncrypted = 'cloudCapiKey.capiKey_ENCRYPTED';
37+
export const mockCapiSecretEncrypted = 'cloudCapiKey.capiSecret_ENCRYPTED';
38+
39+
export const mockCloudCapiKeyEntity = Object.assign(new CloudCapiKeyEntity(), {
40+
...mockCloudCapiKey,
41+
capiKey: mockCapiKeyEncrypted,
42+
capiSecret: mockCapiSecretEncrypted,
43+
encryption: EncryptionStrategy.KEYTAR,
44+
});
45+
3446
export const mockCloudCapiKeyApiProvider = jest.fn(() => ({
3547
enableCapi: jest.fn().mockResolvedValue(mockCloudApiCapiAccessKey.accessKey),
3648
createCapiKey: jest.fn().mockResolvedValue(mockCloudApiCapiKey),

redisinsight/api/src/__mocks__/cloud-common.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@ export const mockCapiUnauthorizedError = {
44
status: 401,
55
},
66
};
7+
8+
export const mockUtm = {
9+
source: 'redisinsight',
10+
medium: 'app',
11+
campaign: 'workbench',
12+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { CloudJobStatus, CloudJobStep } from 'src/modules/cloud/job/models/cloud-job-info';
2+
import { CloudJobName } from 'src/modules/cloud/job/constants';
3+
import { CloudJobRunMode } from 'src/modules/cloud/job/models';
4+
import { CloudJob } from 'src/modules/cloud/job/jobs';
5+
import { mockSessionMetadata } from 'src/__mocks__/common';
6+
7+
export const mockCreateDatabaseCloudJobDataDto = {
8+
name: CloudJobName.CreateFreeDatabase,
9+
runMode: CloudJobRunMode.Async,
10+
data: { planId: 123 },
11+
};
12+
13+
export const mockCloudJobInfo = {
14+
id: 'job-id',
15+
name: CloudJobName.CreateFreeDatabase,
16+
status: CloudJobStatus.Running,
17+
step: CloudJobStep.Database,
18+
};
19+
20+
export abstract class MockCloudJob extends CloudJob {
21+
constructor() {
22+
super({
23+
abortController: new AbortController(),
24+
sessionMetadata: mockSessionMetadata,
25+
});
26+
}
27+
}
28+
29+
MockCloudJob['getWriteStream'] = jest.fn();
30+
MockCloudJob['addProfilerClient'] = jest.fn();
31+
MockCloudJob['removeProfilerClient'] = jest.fn();
32+
MockCloudJob['setAlias'] = jest.fn();
33+
MockCloudJob['destroy'] = jest.fn();
34+
MockCloudJob['getState'] = jest.fn().mockReturnValue(mockCloudJobInfo);
35+
36+
export const mockCloudJobProvider = jest.fn(() => ({
37+
addJob: jest.fn().mockResolvedValue(mockCloudJobInfo),
38+
get: jest.fn().mockResolvedValue(MockCloudJob),
39+
findUserJobs: jest.fn().mockResolvedValue([MockCloudJob]),
40+
}));

redisinsight/api/src/__mocks__/cloud-task.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ export const mockCloudTaskInit: ICloudCapiTask = {
66
status: 'initialized',
77
timestamp: '2023-07-01T00:00:00.000Z',
88
};
9+
10+
export const mockCloudTaskCapiProvider = jest.fn(() => ({
11+
getTask: jest.fn().mockResolvedValue(mockCloudTaskInit),
12+
}));

redisinsight/api/src/__mocks__/cloud-user.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { ICloudApiCredentials } from 'src/modules/cloud/common/models';
1111
import config from 'src/utils/config';
1212
import { classToPlain } from 'class-transformer';
13-
import { mockCloudApiCapiAccessKey, mockCloudCapiAuthDto } from 'src/__mocks__/cloud-capi-key';
13+
import { mockCloudApiCapiAccessKey, mockCloudCapiAuthDto, mockCloudCapiKey } from 'src/__mocks__/cloud-capi-key';
1414

1515
const serverConfig = config.get('server');
1616

@@ -103,7 +103,7 @@ export const mockCloudUser = Object.assign(new CloudUser(), {
103103
name: mockCloudApiUser.name,
104104
currentAccountId: +mockCloudApiUser.current_account_id,
105105
accounts: [mockCloudUserAccount],
106-
capiKey: mockCloudCapiAuthDto.capiKey,
106+
capiKey: mockCloudCapiKey,
107107
});
108108

109109
export const mockCloudUserSafe = classToPlain(mockCloudUser); // omits all data in the "security" group
@@ -125,4 +125,7 @@ export const mockCloudUserRepository = jest.fn(() => ({
125125

126126
export const mockCloudUserApiService = jest.fn(() => ({
127127
getCapiKeys: jest.fn().mockResolvedValue(mockCloudCapiAuthDto),
128+
me: jest.fn().mockResolvedValue(mockCloudUser),
129+
setCurrentAccount: jest.fn(),
130+
updateUser: jest.fn(),
128131
}));
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
export const mockRedisClientList = 'id=29 addr=172.17.0.1:60702 laddr=172.17.0.4:6379 fd=20 '
2+
+ 'name=redisinsight-common-f9d59780 age=319 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 '
3+
+ 'qbuf-free=40928 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default resp=2 redir=-1\n'
4+
+ 'id=31 addr=172.17.0.1:63984 laddr=172.17.0.4:6379 fd=22 name=redisinsight-cli-bc36ecf0 age=15 '
5+
+ 'idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 '
6+
+ 'tot-mem=20512 events=r cmd=client user=default redir=-1\n';
7+
8+
export const mockRedisClientListResult = [
9+
{
10+
addr: '172.17.0.1:60702',
11+
age: '319',
12+
'argv-mem': '10',
13+
cmd: 'client',
14+
db: '0',
15+
events: 'r',
16+
fd: '20',
17+
flags: 'N',
18+
id: '29',
19+
idle: '0',
20+
laddr: '172.17.0.4:6379',
21+
multi: '-1',
22+
name: 'redisinsight-common-f9d59780',
23+
obl: '0',
24+
oll: '0',
25+
omem: '0',
26+
psub: '0',
27+
qbuf: '26',
28+
'qbuf-free': '40928',
29+
redir: '-1',
30+
sub: '0',
31+
'tot-mem': '61466',
32+
user: 'default',
33+
resp: '2',
34+
},
35+
{
36+
addr: '172.17.0.1:63984',
37+
age: '15',
38+
'argv-mem': '0',
39+
cmd: 'client',
40+
db: '0',
41+
events: 'r',
42+
fd: '22',
43+
flags: 'N',
44+
id: '31',
45+
idle: '15',
46+
laddr: '172.17.0.4:6379',
47+
multi: '-1',
48+
name: 'redisinsight-cli-bc36ecf0',
49+
obl: '0',
50+
oll: '0',
51+
omem: '0',
52+
psub: '0',
53+
qbuf: '0',
54+
'qbuf-free': '0',
55+
redir: '-1',
56+
sub: '0',
57+
'tot-mem': '20512',
58+
user: 'default',
59+
},
60+
];

redisinsight/api/src/__mocks__/databases.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
} from 'src/__mocks__/ssh';
1818
import { CloudDatabaseDetailsEntity } from 'src/modules/cloud/database/entities/cloud-database-details.entity';
1919
import { mockCloudDatabaseDetails, mockCloudDatabaseDetailsEntity } from 'src/__mocks__/cloud-database';
20+
import { mockRedisClientListResult } from 'src/__mocks__/database-info';
2021

2122
export const mockDatabaseId = 'a77b23c1-7816-4ea4-b61f-d37795a0f805-db-id';
2223

@@ -188,7 +189,7 @@ export const mockDatabaseOverview: DatabaseOverview = {
188189
};
189190

190191
export const mockRedisServerInfoDto = {
191-
redis_version: '6.0.5',
192+
redis_version: '7.0.5',
192193
redis_mode: 'standalone',
193194
os: 'Linux 4.15.0-1087-gcp x86_64',
194195
arch_bits: '64',
@@ -239,6 +240,7 @@ export const mockDatabaseInfoProvider = jest.fn(() => ({
239240
determineSentinelMasterGroups: jest.fn().mockReturnValue([mockSentinelMasterDto]),
240241
determineClusterNodes: jest.fn().mockResolvedValue(mockClusterNodes),
241242
getRedisGeneralInfo: jest.fn().mockResolvedValueOnce(mockRedisGeneralInfo),
243+
getClientListInfo: jest.fn().mockReturnValue(mockRedisClientListResult),
242244
}));
243245

244246
export const mockDatabaseOverviewProvider = jest.fn(() => ({
@@ -259,4 +261,5 @@ export const mockDatabaseAnalytics = jest.fn(() => ({
259261
sendInstanceAddFailedEvent: jest.fn(),
260262
sendInstanceEditedEvent: jest.fn(),
261263
sendInstanceDeletedEvent: jest.fn(),
264+
sendDatabaseConnectedClientListEvent: jest.fn(),
262265
}));

redisinsight/api/src/__mocks__/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ export * from './cloud-user';
3232
export * from './cloud-common';
3333
export * from './session';
3434
export * from './cloud-session';
35+
export * from './database-info';
36+
export * from './cloud-job';

redisinsight/api/src/constants/telemetry-events.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export enum TelemetryEvents {
55
AnalyticsPermission = 'ANALYTICS_PERMISSION',
66
SettingsScanThresholdChanged = 'SETTINGS_KEYS_TO_SCAN_CHANGED',
77
SettingsWorkbenchPipelineChanged = 'SETTINGS_WORKBENCH_PIPELINE_CHANGED',
8+
DatabaseConnectedClientList = 'DATABASE_CONNECTED_CLIENT_LIST',
89

910
// Events for redis instances
1011
RedisInstanceAdded = 'CONFIG_DATABASES_DATABASE_ADDED',
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { InternalServerErrorException } from '@nestjs/common';
3+
import { EventEmitter2 } from '@nestjs/event-emitter';
4+
import { TelemetryEvents } from 'src/constants';
5+
import { CloudCapiKeyAnalytics } from 'src/modules/cloud/capi-key/cloud-capi-key.analytics';
6+
7+
describe('CloudCapiKeyAnalytics', () => {
8+
let service: CloudCapiKeyAnalytics;
9+
let sendEventSpy;
10+
let sendFailedEventMethod;
11+
const httpException = new InternalServerErrorException();
12+
13+
beforeEach(async () => {
14+
jest.clearAllMocks();
15+
16+
const module: TestingModule = await Test.createTestingModule({
17+
providers: [
18+
EventEmitter2,
19+
CloudCapiKeyAnalytics,
20+
],
21+
}).compile();
22+
23+
service = await module.get(CloudCapiKeyAnalytics);
24+
sendEventSpy = jest.spyOn<CloudCapiKeyAnalytics, any>(service, 'sendEvent');
25+
sendFailedEventMethod = jest.spyOn<CloudCapiKeyAnalytics, any>(
26+
service,
27+
'sendFailedEvent',
28+
);
29+
});
30+
31+
describe('sendCloudAccountKeyGenerated', () => {
32+
it('should emit succeed event with manifest "yes"', () => {
33+
service.sendCloudAccountKeyGenerated();
34+
35+
expect(sendEventSpy).toHaveBeenNthCalledWith(
36+
1,
37+
TelemetryEvents.CloudAccountKeyGenerated,
38+
);
39+
});
40+
});
41+
42+
describe('sendCloudAccountKeyGenerationFailed', () => {
43+
it('should emit 1 event with "Error" cause', () => {
44+
service.sendCloudAccountKeyGenerationFailed(httpException);
45+
46+
expect(sendFailedEventMethod).toHaveBeenNthCalledWith(
47+
1,
48+
TelemetryEvents.CloudAccountKeyGenerationFailed,
49+
httpException,
50+
);
51+
});
52+
});
53+
});

0 commit comments

Comments
 (0)