@@ -5,6 +5,7 @@ import { MessageSearchQuery } from '@sendbird/chat/message';
55
66import { MessageSearchProvider } from '../MessageSearchProvider' ;
77import useMessageSearch from '../hooks/useMessageSearch' ;
8+ import useScrollCallback from '../hooks/useScrollCallback' ;
89
910jest . mock ( '../../../../lib/Sendbird/context/hooks/useSendbird' , ( ) => ( {
1011 __esModule : true ,
@@ -46,6 +47,11 @@ jest.mock('../hooks/useSearchStringEffect', () => ({
4647} ) ) ;
4748
4849describe ( '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