Skip to content

Commit 8f32a59

Browse files
author
arthosofteq
authored
Merge pull request #547 from RedisInsight/feature/RI-1348-profiler-log-file
add unit tests
2 parents 60c496d + bd57be3 commit 8f32a59

File tree

12 files changed

+392
-135
lines changed

12 files changed

+392
-135
lines changed

redisinsight/api/config/test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@ export default {
33
env: 'test',
44
requestTimeout: 1000,
55
},
6+
profiler: {
7+
logFileIdleThreshold: parseInt(process.env.PROFILER_LOG_FILE_IDLE_THRESHOLD, 10) || 1000 * 3, // 3sec
8+
},
69
};

redisinsight/api/src/__mocks__/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from './redis-info';
88
export * from './app-settings';
99
export * from './autodiscovery-tools';
1010
export * from './analytics';
11+
export * from './profiler';

redisinsight/api/src/__mocks__/monitor.ts

Lines changed: 0 additions & 45 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { ILogsEmitter } from 'src/modules/profiler/interfaces/logs-emitter.interface';
2+
import { ProfilerClient } from 'src/modules/profiler/models/profiler.client';
3+
import { RedisObserver } from 'src/modules/profiler/models/redis.observer';
4+
import { IShardObserver } from 'src/modules/profiler/interfaces/shard-observer.interface';
5+
import { LogFile } from 'src/modules/profiler/models/log-file';
6+
import { ProfilerAnalyticsService } from 'src/modules/profiler/profiler-analytics.service';
7+
import { MockType } from 'src/__mocks__/common';
8+
import { TelemetryEvents } from 'src/constants';
9+
import * as MockedSocket from 'socket.io-mock';
10+
import { IMonitorData } from 'src/modules/profiler/interfaces/monitor-data.interface';
11+
12+
export const mockMonitorDataItemEmitted = {
13+
time: '14239988881.12341',
14+
source: '127.0.0.1',
15+
database: 0,
16+
args: ['set', 'foo', 'bar'],
17+
};
18+
19+
export const mockMonitorDataItem: IMonitorData = {
20+
...mockMonitorDataItemEmitted,
21+
shardOptions: null,
22+
};
23+
24+
export const mockSocket = new MockedSocket();
25+
mockSocket['emit'] = jest.fn();
26+
//
27+
// export const mockProfilerClient: MockType<ProfilerClient> = {
28+
// id: uuidv4(),
29+
// handleOnData: jest.fn(),
30+
// handleOnDisconnect: jest.fn(),
31+
// addLogsEmitter: jest.fn(),
32+
// flushLogs: jest.fn(),
33+
// destroy: jest.fn(),
34+
// };
35+
36+
export const mockRedisObserver: Partial<RedisObserver> = {
37+
// status: RedisObserverStatus.Wait,
38+
init: jest.fn(),
39+
subscribe: jest.fn(),
40+
unsubscribe: jest.fn(),
41+
getProfilerClientsSize: jest.fn(),
42+
clear: jest.fn(),
43+
removeShardsListeners: jest.fn(),
44+
};
45+
46+
export const mockRedisShardObserver: IShardObserver = {
47+
addListener: jest.fn(),
48+
eventNames: jest.fn(),
49+
getMaxListeners: jest.fn(),
50+
listenerCount: jest.fn(),
51+
listeners: jest.fn(),
52+
prependListener: jest.fn(),
53+
prependOnceListener: jest.fn(),
54+
removeAllListeners: jest.fn(),
55+
removeListener: jest.fn(),
56+
rawListeners: jest.fn(),
57+
setMaxListeners: jest.fn(),
58+
on: jest.fn(),
59+
emit: jest.fn(),
60+
off: jest.fn(),
61+
once: jest.fn(),
62+
disconnect: jest.fn(),
63+
};
64+
65+
export const mockProfilerAnalyticsEvents = new Map();
66+
mockProfilerAnalyticsEvents.set(TelemetryEvents.ProfilerLogDownloaded, jest.fn());
67+
mockProfilerAnalyticsEvents.set(TelemetryEvents.ProfilerLogDeleted, jest.fn());
68+
69+
export const mockProfilerAnalyticsService: MockType<ProfilerAnalyticsService> = {
70+
sendLogDeleted: jest.fn(),
71+
sendLogDownloaded: jest.fn(),
72+
getEventsEmitters: jest.fn().mockImplementation(() => mockProfilerAnalyticsEvents),
73+
};
74+
75+
export const mockLogEmitter: ILogsEmitter = {
76+
id: 'test',
77+
emit: jest.fn(),
78+
addProfilerClient: jest.fn(),
79+
removeProfilerClient: jest.fn(),
80+
flushLogs: jest.fn(),
81+
};
82+
83+
export const mockWriteStream = {
84+
write: jest.fn(),
85+
};
86+
export const testLogFileId = 'test-log-file-id';
87+
export const mockLogFile: LogFile = new LogFile('instanceid', testLogFileId, mockProfilerAnalyticsEvents);
88+
mockLogFile['getWriteStream'] = jest.fn();
89+
mockLogFile['addProfilerClient'] = jest.fn();
90+
mockLogFile['removeProfilerClient'] = jest.fn();
91+
mockLogFile['destroy'] = jest.fn();
92+
93+
export const mockProfilerClientId = 'profiler-client-id';
94+
export const mockProfilerClient: ProfilerClient = new ProfilerClient(mockProfilerClientId, mockSocket);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { mockSocket } from 'src/__mocks__';
2+
import { ClientLogsEmitter } from 'src/modules/profiler/emitters/client.logs-emitter';
3+
import { ProfilerServerEvents } from 'src/modules/profiler/constants';
4+
import * as MockedSocket from 'socket.io-mock';
5+
6+
describe('ClientLogsEmitter', () => {
7+
let emitter: ClientLogsEmitter;
8+
9+
beforeEach(() => {
10+
emitter = new ClientLogsEmitter(mockSocket);
11+
});
12+
13+
it('Initialization', () => {
14+
emitter = new ClientLogsEmitter(mockSocket);
15+
expect(emitter.id).toEqual(mockSocket.id);
16+
expect(emitter['client']).toEqual(mockSocket);
17+
});
18+
19+
it('Emit', async () => {
20+
const client = new MockedSocket();
21+
client['emit'] = jest.fn();
22+
23+
const items = [1, 2, 3];
24+
25+
emitter = new ClientLogsEmitter(client);
26+
await emitter.emit(items);
27+
expect(emitter['client'].emit).toHaveBeenCalledWith(ProfilerServerEvents.Data, items);
28+
});
29+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import {
2+
mockLogFile,
3+
mockMonitorDataItem,
4+
mockProfilerClient,
5+
mockWriteStream,
6+
} from 'src/__mocks__';
7+
import { FileLogsEmitter } from 'src/modules/profiler/emitters/file.logs-emitter';
8+
9+
describe('FileLogsEmitter', () => {
10+
let emitter: FileLogsEmitter;
11+
12+
beforeEach(() => {
13+
emitter = new FileLogsEmitter(mockLogFile);
14+
});
15+
16+
it('initialization', () => {
17+
expect(emitter.id).toEqual(mockLogFile.id);
18+
expect(emitter['logFile']).toEqual(mockLogFile);
19+
});
20+
21+
it('emit', async () => {
22+
const items = [mockMonitorDataItem, mockMonitorDataItem];
23+
24+
emitter['logFile']['getWriteStream'] = jest.fn().mockReturnValue(undefined);
25+
await emitter.emit(items);
26+
expect(mockWriteStream.write).not.toHaveBeenCalled();
27+
28+
emitter['logFile']['getWriteStream'] = jest.fn().mockReturnValue(mockWriteStream);
29+
await emitter.emit(items);
30+
expect(emitter['logFile'].getWriteStream).toHaveBeenCalled();
31+
expect(mockWriteStream.write).toHaveBeenCalled();
32+
});
33+
34+
it('emit', async () => {
35+
const items = [mockMonitorDataItem, mockMonitorDataItem];
36+
await emitter.emit(items);
37+
expect(emitter['logFile'].getWriteStream).toHaveBeenCalled();
38+
expect(mockWriteStream.write).toHaveBeenCalled();
39+
});
40+
41+
it('addProfilerClient', () => {
42+
emitter.addProfilerClient(mockProfilerClient.id);
43+
expect(emitter['logFile'].addProfilerClient).toHaveBeenCalledWith(mockProfilerClient.id);
44+
});
45+
46+
it('removeProfilerClient', () => {
47+
emitter.removeProfilerClient(mockProfilerClient.id);
48+
expect(emitter['logFile'].removeProfilerClient).toHaveBeenCalledWith(mockProfilerClient.id);
49+
});
50+
51+
it('flushLogs', () => {
52+
emitter.flushLogs();
53+
expect(emitter['logFile'].destroy).toHaveBeenCalled();
54+
});
55+
});

redisinsight/api/src/modules/profiler/emitters/file.logs-emitter.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ILogsEmitter } from 'src/modules/profiler/interfaces/logs-emitter.interface';
22
import { LogFile } from 'src/modules/profiler/models/log-file';
33

4-
class FileLogsEmitter implements ILogsEmitter {
4+
export class FileLogsEmitter implements ILogsEmitter {
55
public readonly id: string;
66

77
private readonly logFile: LogFile;
@@ -43,4 +43,3 @@ class FileLogsEmitter implements ILogsEmitter {
4343
return this.logFile.destroy();
4444
}
4545
}
46-
export default FileLogsEmitter;

0 commit comments

Comments
 (0)