@@ -213,6 +213,7 @@ describe('Channel count unread', function () {
213213
214214describe ( 'Channel _handleChannelEvent' , function ( ) {
215215 const user = { id : 'user' } ;
216+ const otherUser = { id : 'other-user' } ;
216217 let client ;
217218 let channel ;
218219
@@ -880,6 +881,90 @@ describe('Channel _handleChannelEvent', function () {
880881 event . last_delivered_message_id ,
881882 ) ;
882883 } ) ;
884+
885+ it ( 'prevents reporting delivery just reported' , ( ) => {
886+ // enable delivery events
887+ client . _addChannelConfig ( {
888+ cid : channel . cid ,
889+ config : { ...channel . getConfig ( ) , delivery_events : true } ,
890+ } ) ;
891+ channel . state . read [ user . id ] = initialReadState ;
892+
893+ channel . _handleChannelEvent ( {
894+ type : 'message.new' ,
895+ user : otherUser ,
896+ message : generateMsg ( {
897+ id : messageDeliveredEvent . last_delivered_message_id ,
898+ date : messageDeliveredEvent . last_delivered_at ,
899+ } ) ,
900+ } ) ;
901+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 1 ) ;
902+ expect (
903+ client . messageDeliveryReporter . deliveryReportCandidates . get ( channel . cid ) ,
904+ ) . toBe ( messageDeliveredEvent . last_delivered_message_id ) ;
905+
906+ channel . _handleChannelEvent ( messageDeliveredEvent ) ;
907+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 0 ) ;
908+ } ) ;
909+
910+ it ( 'keeps reporting delivery if having newer deliveries' , ( ) => {
911+ // enable delivery events
912+ client . _addChannelConfig ( {
913+ cid : channel . cid ,
914+ config : { ...channel . getConfig ( ) , delivery_events : true } ,
915+ } ) ;
916+ channel . state . read [ user . id ] = initialReadState ;
917+ const newerMessage = generateMsg ( {
918+ id : 'some-other-id' ,
919+ date : new Date ( 3000 ) . toISOString ( ) ,
920+ } ) ;
921+ channel . _handleChannelEvent ( {
922+ type : 'message.new' ,
923+ user : otherUser ,
924+ message : newerMessage ,
925+ } ) ;
926+
927+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 1 ) ;
928+ expect (
929+ client . messageDeliveryReporter . deliveryReportCandidates . get ( channel . cid ) ,
930+ ) . toBe ( newerMessage . id ) ;
931+
932+ // event refers to a message delivered 1000ms earlier than newerMessage - still want to report the newerMessage
933+ channel . _handleChannelEvent ( messageDeliveredEvent ) ;
934+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 1 ) ;
935+ expect (
936+ client . messageDeliveryReporter . deliveryReportCandidates . get ( channel . cid ) ,
937+ ) . toBe ( newerMessage . id ) ;
938+ } ) ;
939+
940+ it ( "does not sync the delivery buffer upon other user's delivery confirmation" , ( ) => {
941+ // enable delivery events
942+ client . _addChannelConfig ( {
943+ cid : channel . cid ,
944+ config : { ...channel . getConfig ( ) , delivery_events : true } ,
945+ } ) ;
946+ channel . state . read [ user . id ] = initialReadState ;
947+
948+ channel . _handleChannelEvent ( {
949+ type : 'message.new' ,
950+ user : otherUser ,
951+ message : generateMsg ( {
952+ id : messageDeliveredEvent . last_delivered_message_id ,
953+ date : messageDeliveredEvent . last_delivered_at ,
954+ } ) ,
955+ } ) ;
956+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 1 ) ;
957+ expect (
958+ client . messageDeliveryReporter . deliveryReportCandidates . get ( channel . cid ) ,
959+ ) . toBe ( messageDeliveredEvent . last_delivered_message_id ) ;
960+
961+ channel . _handleChannelEvent ( { ...messageDeliveredEvent , user : otherUser } ) ;
962+ expect ( client . messageDeliveryReporter . deliveryReportCandidates . size ) . toBe ( 1 ) ;
963+ // the originally planned message id is kept to be reported
964+ expect (
965+ client . messageDeliveryReporter . deliveryReportCandidates . get ( channel . cid ) ,
966+ ) . toBe ( messageDeliveredEvent . last_delivered_message_id ) ;
967+ } ) ;
883968 } ) ;
884969
885970 it ( 'should include unread_messages for message events from another user' , ( ) => {
0 commit comments