Skip to content

Commit dc48275

Browse files
committed
[CLNP-6010] Add more unit tests for existing message search custom hook (#1278)
#### Before <img width="705" alt="Screenshot 2024-12-06 at 6 23 24 PM" src="https://github.com/user-attachments/assets/8269506e-b347-4091-a3d7-254aabb063d9"> #### After <img width="703" alt="Screenshot 2024-12-06 at 6 36 19 PM" src="https://github.com/user-attachments/assets/4480241a-4bfd-4096-a13f-27f7c6ac76ba">
1 parent 6f0e194 commit dc48275

File tree

5 files changed

+893
-0
lines changed

5 files changed

+893
-0
lines changed

src/modules/MessageSearch/context/__test__/MessageSearchProvider.spec.tsx

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { MessageSearchQuery } from '@sendbird/chat/message';
55

66
import { MessageSearchProvider } from '../MessageSearchProvider';
77
import useMessageSearch from '../hooks/useMessageSearch';
8+
import useScrollCallback from '../hooks/useScrollCallback';
89

910
jest.mock('../../../../lib/Sendbird/context/hooks/useSendbird', () => ({
1011
__esModule: true,
@@ -46,6 +47,11 @@ jest.mock('../hooks/useSearchStringEffect', () => ({
4647
}));
4748

4849
describe('MessageSearchProvider', () => {
50+
beforeEach(() => {
51+
jest.clearAllMocks();
52+
(useScrollCallback as jest.Mock).mockClear();
53+
});
54+
4955
const initialState = {
5056
allMessages: [],
5157
loading: false,
@@ -290,4 +296,102 @@ describe('MessageSearchProvider', () => {
290296
});
291297
});
292298
});
299+
300+
it('handles onResultClick callback correctly', async () => {
301+
const onResultClick = jest.fn();
302+
const wrapper = ({ children }) => (
303+
<MessageSearchProvider
304+
channelUrl="test-channel"
305+
onResultClick={onResultClick}
306+
>
307+
{children}
308+
</MessageSearchProvider>
309+
);
310+
311+
const { result } = renderHook(() => useMessageSearch(), { wrapper });
312+
313+
expect(result.current.state.onResultClick).toBe(onResultClick);
314+
});
315+
316+
it('uses provided messageSearchQuery prop correctly', async () => {
317+
const customQuery = {
318+
limit: 20,
319+
reverse: true,
320+
exactMatch: false,
321+
};
322+
323+
const wrapper = ({ children }) => (
324+
<MessageSearchProvider
325+
channelUrl="test-channel"
326+
messageSearchQuery={customQuery}
327+
>
328+
{children}
329+
</MessageSearchProvider>
330+
);
331+
332+
const { result } = renderHook(() => useMessageSearch(), { wrapper });
333+
334+
expect(result.current.state.messageSearchQuery).toEqual(customQuery);
335+
});
336+
337+
it('executes onResultClick callback when clicking a search result', async () => {
338+
const onResultClick = jest.fn();
339+
const mockMessage = { messageId: 1 };
340+
341+
const wrapper = ({ children }) => (
342+
<MessageSearchProvider
343+
channelUrl="test-channel"
344+
onResultClick={onResultClick}
345+
>
346+
{children}
347+
</MessageSearchProvider>
348+
);
349+
350+
const { result } = renderHook(() => useMessageSearch(), { wrapper });
351+
352+
await act(async () => {
353+
expect(result.current.state.onResultClick).toBe(onResultClick);
354+
result.current.state.onResultClick(mockMessage);
355+
await waitFor(() => {
356+
expect(onResultClick).toHaveBeenCalledWith(mockMessage);
357+
});
358+
});
359+
});
360+
361+
it('does not trigger scroll callback when hasMoreResult is false', async () => {
362+
const wrapper = ({ children }) => (
363+
<MessageSearchProvider channelUrl="test-channel">
364+
{children}
365+
</MessageSearchProvider>
366+
);
367+
368+
const { result } = renderHook(() => useMessageSearch(), { wrapper });
369+
370+
await act(async () => {
371+
const mockQuery = { channelUrl: 'test-channel', hasNext: false };
372+
result.current.actions.startGettingSearchedMessages(mockQuery as any);
373+
result.current.actions.getSearchedMessages([{ messageId: 1 }] as any, mockQuery as any);
374+
375+
await waitFor(() => {
376+
expect(result.current.state.hasMoreResult).toBe(false);
377+
});
378+
});
379+
380+
await act(async () => {
381+
const mockEvent = {
382+
target: {
383+
scrollTop: 100,
384+
scrollHeight: 100,
385+
clientHeight: 50,
386+
},
387+
};
388+
389+
const prevLoading = result.current.state.loading;
390+
result.current.state.handleOnScroll(mockEvent);
391+
392+
await waitFor(() => {
393+
expect(result.current.state.loading).toBe(prevLoading);
394+
});
395+
});
396+
});
293397
});

0 commit comments

Comments
 (0)