Skip to content

Commit b560c8e

Browse files
committed
fix: add tests
1 parent 90ead6e commit b560c8e

File tree

2 files changed

+183
-27
lines changed

2 files changed

+183
-27
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
import type {TopicDataResponse, TopicMessage} from '../../../../../types/api/topic';
2+
import {prepareResponse} from '../getData';
3+
import {TOPIC_DATA_FETCH_LIMIT} from '../utils/constants';
4+
5+
describe('prepareResponse', () => {
6+
// Test case 1: Normal case with no removed messages
7+
test('should handle case with no removed messages', () => {
8+
const response: TopicDataResponse = {
9+
StartOffset: '100',
10+
EndOffset: '120',
11+
Messages: [{Offset: '100'}, {Offset: '101'}, {Offset: '102'}] as TopicMessage[],
12+
};
13+
14+
const result = prepareResponse(response, 100);
15+
16+
expect(result.start).toBe(100);
17+
expect(result.end).toBe(120);
18+
expect(result.messages.length).toBe(3);
19+
expect(result.messages[0]).toEqual({Offset: '100'});
20+
expect(result.messages[1]).toEqual({Offset: '101'});
21+
expect(result.messages[2]).toEqual({Offset: '102'});
22+
});
23+
24+
// Test case 2: Case with some removed messages
25+
test('should handle case with some removed messages', () => {
26+
const response: TopicDataResponse = {
27+
StartOffset: '105',
28+
EndOffset: '120',
29+
Messages: [{Offset: '105'}, {Offset: '106'}, {Offset: '107'}] as TopicMessage[],
30+
};
31+
32+
const result = prepareResponse(response, 100);
33+
34+
expect(result.start).toBe(105);
35+
expect(result.end).toBe(120);
36+
expect(result.messages.length).toBe(8); // 5 removed + 3 actual
37+
38+
// Check removed messages
39+
expect(result.messages[0]).toEqual({Offset: 'Offset 100 removed'});
40+
expect(result.messages[1]).toEqual({Offset: 'Offset 101 removed'});
41+
expect(result.messages[2]).toEqual({Offset: 'Offset 102 removed'});
42+
expect(result.messages[3]).toEqual({Offset: 'Offset 103 removed'});
43+
expect(result.messages[4]).toEqual({Offset: 'Offset 104 removed'});
44+
45+
// Check actual messages
46+
expect(result.messages[5]).toEqual({Offset: '105'});
47+
expect(result.messages[6]).toEqual({Offset: '106'});
48+
expect(result.messages[7]).toEqual({Offset: '107'});
49+
});
50+
51+
// Test case 3: Case with more removed messages than the limit
52+
test('should handle case with more removed messages than the limit', () => {
53+
const response: TopicDataResponse = {
54+
StartOffset: '150',
55+
EndOffset: '170',
56+
Messages: [{Offset: '150'}, {Offset: '151'}, {Offset: '152'}] as TopicMessage[],
57+
};
58+
59+
const result = prepareResponse(response, 100);
60+
61+
expect(result.start).toBe(150);
62+
expect(result.end).toBe(170);
63+
expect(result.messages.length).toBe(TOPIC_DATA_FETCH_LIMIT); // Limited by TOPIC_DATA_FETCH_LIMIT
64+
65+
// All messages should be "removed" placeholders since there are more than the limit
66+
for (let i = 0; i < TOPIC_DATA_FETCH_LIMIT; i++) {
67+
expect(result.messages[i]).toEqual({Offset: `Offset ${100 + i} removed`});
68+
}
69+
});
70+
71+
// Test case 4: Case with non-numeric offsets
72+
test('should handle case with non-numeric offsets', () => {
73+
const response: TopicDataResponse = {
74+
StartOffset: 'not-a-number',
75+
EndOffset: 'invalid',
76+
Messages: [{Offset: '100'}, {Offset: '101'}] as TopicMessage[],
77+
};
78+
79+
const result = prepareResponse(response, 100);
80+
81+
// safeParseNumber should return 0 for non-numeric values
82+
expect(result.start).toBe(0);
83+
expect(result.end).toBe(0);
84+
85+
// Since start (0) < offset (100), removedMessagesCount is negative
86+
// No removed messages should be added
87+
expect(result.messages.length).toBe(2);
88+
expect(result.messages[0]).toEqual({Offset: '100'});
89+
expect(result.messages[1]).toEqual({Offset: '101'});
90+
});
91+
92+
// Test case 5: Case with empty Messages array
93+
test('should handle case with empty Messages array', () => {
94+
const response: TopicDataResponse = {
95+
StartOffset: '100',
96+
EndOffset: '100',
97+
Messages: [],
98+
};
99+
100+
const result = prepareResponse(response, 100);
101+
102+
expect(result.start).toBe(100);
103+
expect(result.end).toBe(100);
104+
expect(result.messages.length).toBe(0);
105+
});
106+
107+
// Test case 6: Case with more messages than the limit
108+
test('should handle case with more messages than the limit', () => {
109+
// Create an array of 30 messages (more than TOPIC_DATA_FETCH_LIMIT)
110+
const messages: TopicMessage[] = [];
111+
for (let i = 0; i < TOPIC_DATA_FETCH_LIMIT + 1; i++) {
112+
messages.push({Offset: `${100 + i}`} as TopicMessage);
113+
}
114+
115+
const response: TopicDataResponse = {
116+
StartOffset: '100',
117+
EndOffset: '130',
118+
Messages: messages,
119+
};
120+
121+
const result = prepareResponse(response, 100);
122+
123+
expect(result.start).toBe(100);
124+
expect(result.end).toBe(130);
125+
126+
// Should be limited to TOPIC_DATA_FETCH_LIMIT
127+
expect(result.messages.length).toBe(TOPIC_DATA_FETCH_LIMIT);
128+
129+
// Check the first few messages
130+
expect(result.messages[0]).toEqual({Offset: '100'});
131+
expect(result.messages[1]).toEqual({Offset: '101'});
132+
expect(result.messages[2]).toEqual({Offset: '102'});
133+
});
134+
135+
// Test case 7: Case with both removed messages and actual messages within limit
136+
test('should handle case with both removed and actual messages within limit', () => {
137+
const response: TopicDataResponse = {
138+
StartOffset: '110',
139+
EndOffset: '130',
140+
Messages: Array.from({length: 15}, (_, i) => ({Offset: `${110 + i}`}) as TopicMessage),
141+
};
142+
143+
const result = prepareResponse(response, 100);
144+
145+
expect(result.start).toBe(110);
146+
expect(result.end).toBe(130);
147+
148+
// 10 removed + 10 actual = 20 (TOPIC_DATA_FETCH_LIMIT)
149+
expect(result.messages.length).toBe(TOPIC_DATA_FETCH_LIMIT);
150+
});
151+
});

src/containers/Tenant/Diagnostics/TopicData/getData.ts

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {isNil} from 'lodash';
22

33
import type {FetchData} from '../../../../components/PaginatedTable';
4-
import type {TopicDataRequest, TopicMessage} from '../../../../types/api/topic';
4+
import type {TopicDataRequest, TopicDataResponse, TopicMessage} from '../../../../types/api/topic';
55
import {safeParseNumber} from '../../../../utils/utils';
66

77
import {TOPIC_DATA_FETCH_LIMIT} from './utils/constants';
@@ -15,6 +15,35 @@ interface GetTopicDataProps {
1515
baseOffset?: number;
1616
}
1717

18+
export function prepareResponse(response: TopicDataResponse, offset: number) {
19+
const {StartOffset, EndOffset, Messages = []} = response;
20+
21+
const start = safeParseNumber(StartOffset);
22+
const end = safeParseNumber(EndOffset);
23+
24+
const removedMessagesCount = start - offset;
25+
26+
const result = [];
27+
for (let i = 0; i < Math.min(TOPIC_DATA_FETCH_LIMIT, removedMessagesCount); i++) {
28+
result.push({
29+
Offset: `Offset ${offset + i} removed`,
30+
});
31+
}
32+
for (
33+
let i = 0;
34+
i <
35+
Math.min(
36+
TOPIC_DATA_FETCH_LIMIT,
37+
TOPIC_DATA_FETCH_LIMIT - removedMessagesCount,
38+
Messages.length,
39+
);
40+
i++
41+
) {
42+
result.push(Messages[i]);
43+
}
44+
return {start, end, messages: result};
45+
}
46+
1847
export const generateTopicDataGetter = ({
1948
setStartOffset,
2049
setEndOffset,
@@ -42,31 +71,7 @@ export const generateTopicDataGetter = ({
4271

4372
const response = await window.api.viewer.getTopicData(queryParams);
4473

45-
const {StartOffset, EndOffset, Messages = []} = response;
46-
47-
const start = safeParseNumber(StartOffset);
48-
const end = safeParseNumber(EndOffset);
49-
50-
const removedMessagesCount = start - normalizedOffset;
51-
52-
const result = [];
53-
for (let i = 0; i < Math.min(TOPIC_DATA_FETCH_LIMIT, removedMessagesCount); i++) {
54-
result.push({
55-
Offset: `Offset ${normalizedOffset + i} removed`,
56-
});
57-
}
58-
for (
59-
let i = 0;
60-
i <
61-
Math.min(
62-
TOPIC_DATA_FETCH_LIMIT,
63-
TOPIC_DATA_FETCH_LIMIT - removedMessagesCount,
64-
Messages.length,
65-
);
66-
i++
67-
) {
68-
result.push(Messages[i]);
69-
}
74+
const {start, end, messages} = prepareResponse(response, normalizedOffset);
7075

7176
//need to update start and end offsets every time data is fetched to show fresh data in parent component
7277
setStartOffset(start);
@@ -75,7 +80,7 @@ export const generateTopicDataGetter = ({
7580
const quantity = end - baseOffset;
7681

7782
return {
78-
data: result,
83+
data: messages,
7984
total: quantity,
8085
found: quantity,
8186
};

0 commit comments

Comments
 (0)