@@ -20,6 +20,7 @@ import dispatchChannelDeletedEvent from '../../../mock-builders/event/channelDel
2020import dispatchChannelHiddenEvent from '../../../mock-builders/event/channelHidden' ;
2121import dispatchChannelTruncatedEvent from '../../../mock-builders/event/channelTruncated' ;
2222import dispatchChannelUpdatedEvent from '../../../mock-builders/event/channelUpdated' ;
23+ import dispatchConnectionChangedEvent from '../../../mock-builders/event/connectionChanged' ;
2324import dispatchConnectionRecoveredEvent from '../../../mock-builders/event/connectionRecovered' ;
2425import dispatchMessageNewEvent from '../../../mock-builders/event/messageNew' ;
2526import dispatchNotificationAddedToChannelEvent from '../../../mock-builders/event/notificationAddedToChannel' ;
@@ -61,6 +62,11 @@ const ChannelListComponent = (props) => {
6162 ) ;
6263} ;
6364
65+ const RefreshingProbe = ( ) => {
66+ const { refreshing } = useChannelsContext ( ) ;
67+ return < Text testID = 'refreshing' > { `${ refreshing } ` } </ Text > ;
68+ } ;
69+
6470class DeferredPromise {
6571 constructor ( ) {
6672 this . promise = new Promise ( ( resolve , reject ) => {
@@ -670,6 +676,55 @@ describe('ChannelList', () => {
670676 } ) ;
671677 } ) ;
672678
679+ describe ( 'connection.changed' , ( ) => {
680+ it ( 'should keep background reconnection refreshes debounced and out of pull-to-refresh UI' , async ( ) => {
681+ useMockedApis ( chatClient , [ queryChannelsApi ( [ testChannel1 ] ) ] ) ;
682+ const deferredPromise = new DeferredPromise ( ) ;
683+ const dateNowSpy = jest . spyOn ( Date , 'now' ) ;
684+ dateNowSpy . mockReturnValueOnce ( 0 ) ;
685+ dateNowSpy . mockReturnValue ( 6000 ) ;
686+
687+ render (
688+ < Chat client = { chatClient } >
689+ < ChannelList { ...props } List = { RefreshingProbe } />
690+ </ Chat > ,
691+ ) ;
692+
693+ await waitFor ( ( ) => {
694+ expect ( screen . getByTestId ( 'refreshing' ) . children [ 0 ] ) . toBe ( 'false' ) ;
695+ } ) ;
696+
697+ const queryChannelsSpy = jest
698+ . spyOn ( chatClient , 'queryChannels' )
699+ . mockImplementation ( ( ) => deferredPromise . promise ) ;
700+
701+ await act ( async ( ) => {
702+ dispatchConnectionChangedEvent ( chatClient , false ) ;
703+ dispatchConnectionChangedEvent ( chatClient , true ) ;
704+ await Promise . resolve ( ) ;
705+ } ) ;
706+
707+ await waitFor ( ( ) => {
708+ expect ( queryChannelsSpy ) . toHaveBeenCalledTimes ( 1 ) ;
709+ } ) ;
710+
711+ await act ( async ( ) => {
712+ dispatchConnectionChangedEvent ( chatClient , true ) ;
713+ await Promise . resolve ( ) ;
714+ } ) ;
715+
716+ expect ( queryChannelsSpy ) . toHaveBeenCalledTimes ( 1 ) ;
717+ expect ( screen . getByTestId ( 'refreshing' ) . children [ 0 ] ) . toBe ( 'false' ) ;
718+
719+ await act ( async ( ) => {
720+ deferredPromise . resolve ( [ generateChannel ( { id : testChannel1 . channel . id } ) ] ) ;
721+ await deferredPromise . promise ;
722+ } ) ;
723+
724+ dateNowSpy . mockRestore ( ) ;
725+ } ) ;
726+ } ) ;
727+
673728 describe ( 'channel.truncated' , ( ) => {
674729 it ( 'should call the `onChannelTruncated` function prop, if provided' , async ( ) => {
675730 useMockedApis ( chatClient , [ queryChannelsApi ( [ testChannel1 ] ) ] ) ;
0 commit comments