Skip to content

Commit 32a93eb

Browse files
committed
chore: add tests for getData
1 parent 1c12bde commit 32a93eb

File tree

1 file changed

+274
-0
lines changed

1 file changed

+274
-0
lines changed
Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
import {generateTopicDataGetter} from '../getData';
2+
3+
// Mock the window.api.viewer.getTopicData function
4+
const mockGetTopicData = jest.fn();
5+
Object.defineProperty(window, 'api', {
6+
value: {
7+
viewer: {
8+
getTopicData: mockGetTopicData,
9+
},
10+
},
11+
writable: true,
12+
});
13+
14+
describe('generateTopicDataGetter', () => {
15+
const setStartOffset = jest.fn();
16+
const setEndOffset = jest.fn();
17+
const initialOffset = 5;
18+
19+
beforeEach(() => {
20+
jest.clearAllMocks();
21+
mockGetTopicData.mockReset();
22+
});
23+
24+
describe('getTopicData', () => {
25+
test('should return empty data if filters are not provided', async () => {
26+
const getTopicData = generateTopicDataGetter({
27+
setStartOffset,
28+
setEndOffset,
29+
initialOffset,
30+
});
31+
32+
const result = await getTopicData({
33+
limit: 10,
34+
offset: 0,
35+
columnsIds: [],
36+
});
37+
38+
expect(result).toEqual({data: [], total: 0, found: 0});
39+
expect(mockGetTopicData).not.toHaveBeenCalled();
40+
});
41+
42+
test('should return empty data if partition is nil', async () => {
43+
const getTopicData = generateTopicDataGetter({
44+
setStartOffset,
45+
setEndOffset,
46+
initialOffset,
47+
});
48+
49+
const result = await getTopicData({
50+
limit: 10,
51+
offset: 0,
52+
filters: {
53+
database: 'db',
54+
path: '/path',
55+
},
56+
columnsIds: [],
57+
});
58+
59+
expect(result).toEqual({data: [], total: 0, found: 0});
60+
expect(mockGetTopicData).not.toHaveBeenCalled();
61+
});
62+
});
63+
64+
describe('query parameters building', () => {
65+
test('should build query params with timestamp for TIMESTAMP filter', async () => {
66+
mockGetTopicData.mockResolvedValueOnce({
67+
StartOffset: '100',
68+
EndOffset: '200',
69+
Messages: [],
70+
});
71+
72+
const getTopicData = generateTopicDataGetter({
73+
setStartOffset,
74+
setEndOffset,
75+
initialOffset,
76+
});
77+
78+
await getTopicData({
79+
limit: 10,
80+
offset: 0,
81+
filters: {
82+
partition: '1',
83+
database: 'db',
84+
path: '/path',
85+
topicDataFilter: 'TIMESTAMP',
86+
startTimestamp: 1234567890,
87+
},
88+
columnsIds: [],
89+
});
90+
91+
expect(mockGetTopicData).toHaveBeenCalledWith({
92+
partition: '1',
93+
database: 'db',
94+
path: '/path',
95+
limit: 10,
96+
read_timestamp: 1234567890,
97+
});
98+
});
99+
100+
test('should build query params with offset for OFFSET filter', async () => {
101+
mockGetTopicData.mockResolvedValueOnce({
102+
StartOffset: '100',
103+
EndOffset: '200',
104+
Messages: [],
105+
});
106+
107+
const getTopicData = generateTopicDataGetter({
108+
setStartOffset,
109+
setEndOffset,
110+
initialOffset,
111+
});
112+
113+
await getTopicData({
114+
limit: 10,
115+
offset: 5,
116+
filters: {
117+
partition: '1',
118+
database: 'db',
119+
path: '/path',
120+
topicDataFilter: 'OFFSET',
121+
selectedOffset: 20,
122+
},
123+
columnsIds: [],
124+
});
125+
126+
// Max of selectedOffset (20) and initialOffset (5) is 20
127+
// normalizedOffset = fromOffset (20) + tableOffset (5) + lostOffsets (0) = 25
128+
expect(mockGetTopicData).toHaveBeenCalledWith({
129+
partition: '1',
130+
database: 'db',
131+
path: '/path',
132+
limit: 10,
133+
offset: 25,
134+
});
135+
});
136+
});
137+
138+
describe('response processing', () => {
139+
test('should process response and update offsets', async () => {
140+
mockGetTopicData.mockResolvedValueOnce({
141+
StartOffset: '100',
142+
EndOffset: '200',
143+
Messages: [{Offset: '150'}, {Offset: '160'}],
144+
});
145+
146+
const getTopicData = generateTopicDataGetter({
147+
setStartOffset,
148+
setEndOffset,
149+
initialOffset,
150+
});
151+
152+
const result = await getTopicData({
153+
limit: 10,
154+
offset: 0,
155+
filters: {
156+
partition: '1',
157+
database: 'db',
158+
path: '/path',
159+
topicDataFilter: 'OFFSET',
160+
},
161+
columnsIds: [],
162+
});
163+
164+
expect(setStartOffset).toHaveBeenCalledWith(100);
165+
expect(setEndOffset).toHaveBeenCalledWith(200);
166+
expect(result.data).toEqual([{Offset: '150'}, {Offset: '160'}]);
167+
expect(result.total).toBe(195); // 200 - 5 (initialOffset)
168+
expect(result.found).toBe(195);
169+
});
170+
171+
test.only('should set fromOffset from first message for TIMESTAMP filter', async () => {
172+
mockGetTopicData.mockResolvedValueOnce({
173+
StartOffset: '100',
174+
EndOffset: '200',
175+
Messages: [{Offset: '150'}, {Offset: '160'}],
176+
});
177+
178+
const getTopicData = generateTopicDataGetter({
179+
setStartOffset,
180+
setEndOffset,
181+
initialOffset,
182+
});
183+
184+
await getTopicData({
185+
limit: 10,
186+
offset: 0,
187+
filters: {
188+
partition: '1',
189+
database: 'db',
190+
path: '/path',
191+
topicDataFilter: 'TIMESTAMP',
192+
startTimestamp: 1234567890,
193+
},
194+
columnsIds: [],
195+
});
196+
197+
mockGetTopicData.mockResolvedValueOnce({
198+
StartOffset: '100',
199+
EndOffset: '200',
200+
Messages: [],
201+
});
202+
203+
await getTopicData({
204+
limit: 10,
205+
offset: 5,
206+
filters: {
207+
partition: '1',
208+
database: 'db',
209+
path: '/path',
210+
topicDataFilter: 'TIMESTAMP',
211+
},
212+
columnsIds: [],
213+
});
214+
215+
// First call uses read_timestamp
216+
expect(mockGetTopicData.mock.calls[0][0]).toHaveProperty('read_timestamp', 1234567890);
217+
// Second call uses offset calculated from first message (150) + tableOffset (5)
218+
// The actual value is 154 due to how lostOffsets is calculated in the implementation
219+
expect(mockGetTopicData.mock.calls[1][0]).toHaveProperty('offset', 154);
220+
});
221+
222+
test('should update lostOffsets correctly', async () => {
223+
mockGetTopicData.mockResolvedValueOnce({
224+
StartOffset: '100',
225+
EndOffset: '200',
226+
Messages: [{Offset: '150'}, {Offset: '160'}],
227+
});
228+
229+
const getTopicData = generateTopicDataGetter({
230+
setStartOffset,
231+
setEndOffset,
232+
initialOffset: 0,
233+
});
234+
235+
await getTopicData({
236+
limit: 20,
237+
offset: 0,
238+
filters: {
239+
partition: '1',
240+
database: 'db',
241+
path: '/path',
242+
topicDataFilter: 'OFFSET',
243+
selectedOffset: 0,
244+
},
245+
columnsIds: [],
246+
});
247+
248+
// lostOffsets should be updated: 0 + 0 + 20 - 160 - 1 = -141
249+
250+
// Second call
251+
mockGetTopicData.mockResolvedValueOnce({
252+
StartOffset: '200',
253+
EndOffset: '300',
254+
Messages: [{Offset: '250'}, {Offset: '260'}],
255+
});
256+
257+
await getTopicData({
258+
limit: 20,
259+
offset: 10,
260+
filters: {
261+
partition: '1',
262+
database: 'db',
263+
path: '/path',
264+
topicDataFilter: 'OFFSET',
265+
},
266+
columnsIds: [],
267+
});
268+
269+
// First call uses offset 0
270+
expect(mockGetTopicData.mock.calls[0][0]).toHaveProperty('offset', 0);
271+
expect(mockGetTopicData.mock.calls[1][0]).toHaveProperty('offset', -131);
272+
});
273+
});
274+
});

0 commit comments

Comments
 (0)