Skip to content

Commit 78fad15

Browse files
committed
Merge branch 'feature/RI-2409-change_database_index' into e2e/feature/RI-2409-change_database_index
2 parents 44276a3 + fded78d commit 78fad15

File tree

8 files changed

+70
-24
lines changed

8 files changed

+70
-24
lines changed

redisinsight/api/src/__mocks__/redis.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ export const mockRedisService = jest.fn(() => ({
6868
getClientInstance: jest.fn().mockResolvedValue({
6969
client: mockIORedisClient,
7070
}),
71-
setClientInstance: jest.fn(),
71+
setClientInstance: jest.fn().mockReturnValue({
72+
client: mockIORedisClient,
73+
}),
7274
isClientConnected: jest.fn().mockReturnValue(true),
7375
removeClientInstance: jest.fn(),
7476
removeClientInstances: jest.fn(),

redisinsight/api/src/modules/database/database-connection.service.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ export class DatabaseConnectionService {
7777

7878
client = await this.createClient(clientMetadata);
7979

80-
this.redisService.setClientInstance(clientMetadata, client);
81-
82-
return client;
80+
return this.redisService.setClientInstance(clientMetadata, client)?.client;
8381
}
8482

8583
/**

redisinsight/api/src/modules/redis/redis-connection.factory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ export class RedisConnectionFactory {
101101
const baseOptions = await this.getRedisOptions(clientMetadata, database, options);
102102
return {
103103
...baseOptions,
104-
sentinels: database.nodes,
104+
host: undefined,
105+
port: undefined,
106+
sentinels: database.nodes?.length ? database.nodes : [{ host: database.host, port: database.port }],
105107
name: sentinelMaster?.name,
106108
sentinelUsername: database.username,
107109
sentinelPassword: database.password,

redisinsight/api/src/modules/redis/redis-consumer.abstract.service.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ describe('RedisConsumerAbstractService', () => {
5454
redisService = await module.get<RedisService>(RedisService);
5555
consumerInstance = await module.get<BrowserToolService>(BrowserToolService);
5656
redisConnectionFactory = await module.get(RedisConnectionFactory);
57+
58+
redisService.setClientInstance.mockReturnValue(mockRedisClientInstance);
5759
});
5860

5961
describe('getRedisClient', () => {

redisinsight/api/src/modules/redis/redis-consumer.abstract.service.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,13 @@ export abstract class RedisConsumerAbstractService implements IRedisConsumer {
143143
instanceDto,
144144
connectionName,
145145
);
146-
this.redisService.setClientInstance(
146+
return this.redisService.setClientInstance(
147147
{
148148
...clientMetadata,
149149
context: clientMetadata.context || this.consumer,
150150
},
151151
client,
152-
);
153-
return client;
152+
)?.client;
154153
} catch (error) {
155154
throw catchRedisConnectionError(error, instanceDto);
156155
}

redisinsight/api/src/modules/redis/redis.service.spec.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,32 @@ describe('RedisService', () => {
121121

122122
const result = service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient);
123123

124-
expect(result).toEqual(1);
124+
expect(result.client).toEqual(mockIORedisClient);
125125
expect(service.clients.size).toEqual(1);
126126
});
127127

128-
it('should replace existing client and update last used time', async () => {
128+
it('should use existing client instead of replacing with new one', async () => {
129129
expect(service.clients.size).toEqual(0);
130130

131-
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient)).toEqual(1);
131+
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisClient).client)
132+
.toEqual(mockIORedisClient);
132133
expect(service.clients.size).toEqual(1);
133134

134-
const [justAddedClient] = [...service.clients.values()];
135+
let [justAddedClient] = [...service.clients.values()];
136+
justAddedClient = { ...justAddedClient };
135137

136138
// sleep
137139
await new Promise((res) => setTimeout(res, 100));
138140

139-
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisSentinel)).toEqual(0);
141+
expect(service.setClientInstance(mockRedisClientInstance1.clientMetadata, mockIORedisSentinel).client)
142+
.toEqual(mockIORedisClient);
140143
expect(service.clients.size).toEqual(1);
141144

142-
const [overwrittenClient] = [...service.clients.values()];
143-
expect(overwrittenClient.clientMetadata).toEqual(justAddedClient.clientMetadata);
144-
expect(overwrittenClient.id).toEqual(justAddedClient.id);
145-
expect(overwrittenClient.client).not.toEqual(justAddedClient.client);
146-
expect(overwrittenClient.lastTimeUsed).toBeGreaterThan(justAddedClient.lastTimeUsed);
145+
const [newClient] = [...service.clients.values()];
146+
expect(newClient.clientMetadata).toEqual(justAddedClient.clientMetadata);
147+
expect(newClient.id).toEqual(justAddedClient.id);
148+
expect(newClient.client).toEqual(justAddedClient.client);
149+
expect(newClient.lastTimeUsed).toBeGreaterThan(justAddedClient.lastTimeUsed);
147150
});
148151
});
149152

redisinsight/api/src/modules/redis/redis.service.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export class RedisService implements OnModuleDestroy {
6262
return found;
6363
}
6464

65-
public setClientInstance(clientMetadata: ClientMetadata, client): 0 | 1 {
65+
public setClientInstance(clientMetadata: ClientMetadata, client): IRedisClientInstance {
6666
const metadata = RedisService.prepareClientMetadata(clientMetadata);
6767

6868
const id = RedisService.generateId(metadata);
@@ -76,15 +76,18 @@ export class RedisService implements OnModuleDestroy {
7676
};
7777

7878
if (found) {
79+
if (this.isClientConnected(found.client)) {
80+
found.lastTimeUsed = Date.now();
81+
client.disconnect();
82+
return found;
83+
}
84+
7985
found.client.disconnect();
80-
this.clients.delete(id);
81-
this.clients.set(id, clientInstance);
82-
return 0; // todo: investigate why we need to distinguish between 1 | 0
8386
}
8487

8588
this.clients.set(id, clientInstance);
8689

87-
return 1;
90+
return clientInstance;
8891
}
8992

9093
public removeClientInstance(clientMetadata: ClientMetadata): number {

redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import { cloneDeep } from 'lodash'
22
import React from 'react'
33
import { instance, mock } from 'ts-mockito'
44
import { cleanup, mockedStore, render, screen, fireEvent } from 'uiSrc/utils/test-utils'
5-
import { checkDatabaseIndex, connectedInstanceInfoSelector } from 'uiSrc/slices/instances/instances'
5+
import {
6+
checkDatabaseIndex,
7+
connectedInstanceInfoSelector,
8+
connectedInstanceSelector
9+
} from 'uiSrc/slices/instances/instances'
10+
import { appContextDbIndex } from 'uiSrc/slices/app/context'
611

712
import InstanceHeader, { Props } from './InstanceHeader'
813

@@ -27,6 +32,18 @@ jest.mock('uiSrc/slices/instances/instances', () => ({
2732
...jest.requireActual('uiSrc/slices/instances/instances'),
2833
connectedInstanceInfoSelector: jest.fn().mockReturnValue({
2934
databases: 16,
35+
}),
36+
connectedInstanceSelector: jest.fn().mockReturnValue({
37+
username: 'username',
38+
id: 'instanceId',
39+
loading: false,
40+
})
41+
}))
42+
43+
jest.mock('uiSrc/slices/app/context', () => ({
44+
...jest.requireActual('uiSrc/slices/app/context'),
45+
appContextDbIndex: jest.fn().mockReturnValue({
46+
disabled: false,
3047
})
3148
}))
3249

@@ -77,4 +94,24 @@ describe('InstanceHeader', () => {
7794
]
7895
expect(store.getActions()).toEqual([...expectedActions])
7996
})
97+
98+
it('should be disabled db index button with loading state', () => {
99+
(connectedInstanceSelector as jest.Mock).mockReturnValueOnce({
100+
loading: true,
101+
})
102+
103+
render(<InstanceHeader {...instance(mockedProps)} />)
104+
105+
expect(screen.getByTestId('change-index-btn')).toBeDisabled()
106+
})
107+
108+
it('should be disabled db index button with disabled state', () => {
109+
(appContextDbIndex as jest.Mock).mockReturnValueOnce({
110+
disabled: true,
111+
})
112+
113+
render(<InstanceHeader {...instance(mockedProps)} />)
114+
115+
expect(screen.getByTestId('change-index-btn')).toBeDisabled()
116+
})
80117
})

0 commit comments

Comments
 (0)