Skip to content

Commit 8f8972e

Browse files
#RI-4796 - add tests in SSO module (#2527)
* #RI-4796 - add tests in SSO module
1 parent 85b4458 commit 8f8972e

22 files changed

+1143
-11
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
}));

redisinsight/api/src/__mocks__/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ export * from './cloud-user';
3232
export * from './cloud-common';
3333
export * from './session';
3434
export * from './cloud-session';
35+
export * from './cloud-job';
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+
});

redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.service.spec.ts

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,30 @@
11
import { Test, TestingModule } from '@nestjs/testing';
2+
import { BadRequestException } from '@nestjs/common';
23
import { CloudCapiKeyService } from 'src/modules/cloud/capi-key/cloud-capi-key.service';
34
import { CloudCapiKeyApiProvider } from 'src/modules/cloud/capi-key/cloud-capi-key.api.provider';
45
import { CloudCapiKeyRepository } from 'src/modules/cloud/capi-key/repository/cloud-capi-key.repository';
56
import {
67
mockCloudCapiKey, mockCloudCapiKeyAnalytics,
78
mockCloudSessionService, mockCloudUserApiService, mockRepository, mockServerService,
9+
mockSessionMetadata,
10+
mockCloudUser,
11+
mockUtm,
12+
MockType,
813
} from 'src/__mocks__';
914
import { CloudUserApiService } from 'src/modules/cloud/user/cloud-user.api.service';
1015
import { CloudSessionService } from 'src/modules/cloud/session/cloud-session.service';
1116
import { ServerService } from 'src/modules/server/server.service';
1217
import { CloudCapiKeyAnalytics } from 'src/modules/cloud/capi-key/cloud-capi-key.analytics';
18+
import { CloudApiBadRequestException } from 'src/modules/cloud/common/exceptions';
1319

1420
describe('CloudCapiKeyService', () => {
1521
let service: CloudCapiKeyService;
22+
let api: CloudCapiKeyApiProvider;
23+
let repository: CloudCapiKeyRepository;
24+
let cloudUserApiService: MockType<CloudUserApiService>;
25+
let cloudSessionService: CloudSessionService;
26+
let serverService: ServerService;
27+
let analytics: CloudCapiKeyAnalytics;
1628

1729
beforeEach(async () => {
1830
const module: TestingModule = await Test.createTestingModule({
@@ -45,13 +57,40 @@ describe('CloudCapiKeyService', () => {
4557
],
4658
}).compile();
4759

48-
service = module.get(CloudCapiKeyService);
60+
service = await module.get(CloudCapiKeyService);
61+
api = await module.get(CloudCapiKeyApiProvider);
62+
repository = await module.get(CloudCapiKeyRepository);
63+
cloudUserApiService = await module.get(CloudUserApiService);
64+
cloudSessionService = await module.get(CloudSessionService);
65+
serverService = await module.get(ServerService);
66+
analytics = await module.get(CloudCapiKeyAnalytics);
4967
});
5068

5169
describe('generateName', () => {
52-
it('successfully get cloud databases', async () => {
70+
it('successfully generate capi key name', async () => {
5371
expect(await service['generateName'](mockCloudCapiKey))
5472
.toEqual(mockCloudCapiKey.name);
5573
});
5674
});
75+
76+
describe('ensureCapiKeys', () => {
77+
it('Should return exist capi key', async () => {
78+
expect(await service['ensureCapiKeys'](mockSessionMetadata, mockUtm))
79+
.toEqual(mockCloudUser.capiKey);
80+
});
81+
it('Should throw CloudApiBadRequestException', async () => {
82+
cloudUserApiService.me.mockResolvedValue(null);
83+
CloudUserApiService.getCurrentAccount(null);
84+
await expect(service['ensureCapiKeys'](mockSessionMetadata, mockUtm))
85+
.rejects.toThrowError(CloudApiBadRequestException);
86+
});
87+
});
88+
89+
describe('handleCapiKeyUnauthorizedError', () => {
90+
it('should show BadRequestException error', async () => {
91+
const mockError = new BadRequestException('error');
92+
expect(await service.handleCapiKeyUnauthorizedError(mockError, mockSessionMetadata))
93+
.toEqual(new BadRequestException('error'));
94+
});
95+
});
5796
});

0 commit comments

Comments
 (0)