@@ -355,6 +355,8 @@ describe('Channel _handleChannelEvent', function () {
355355 expect ( channel . state . unreadCount ) . to . be . equal ( 30 ) ;
356356 } ) ;
357357
358+ it ( 'does not override the delivery information in the read status' , ( ) => { } ) ;
359+
358360 it ( 'message.truncate removes all messages if "truncated_at" is "now"' , function ( ) {
359361 const messages = [
360362 { created_at : '2021-01-01T00:01:00' } ,
@@ -652,6 +654,8 @@ describe('Channel _handleChannelEvent', function () {
652654 last_read_message_id : '6' ,
653655 user,
654656 unread_messages : initialCountUnread ,
657+ last_delivered_at : new Date ( 1000 ) . toISOString ( ) ,
658+ last_delivered_message_id : 'delivered-msg-id' ,
655659 } ;
656660 notificationMarkUnreadEvent = {
657661 type : 'notification.mark_unread' ,
@@ -690,6 +694,12 @@ describe('Channel _handleChannelEvent', function () {
690694 expect ( channel . state . read [ user . id ] . unread_messages ) . to . be . equal (
691695 event . unread_messages ,
692696 ) ;
697+ expect ( channel . state . read [ user . id ] . last_delivered_at ) . toBe (
698+ initialReadState . last_delivered_at ,
699+ ) ;
700+ expect ( channel . state . read [ user . id ] . last_delivered_message_id ) . toBe (
701+ initialReadState . last_delivered_message_id ,
702+ ) ;
693703 } ) ;
694704
695705 it ( 'should not update channel read state produced for another user or user is missing' , ( ) => {
@@ -718,6 +728,160 @@ describe('Channel _handleChannelEvent', function () {
718728 } ) ;
719729 } ) ;
720730
731+ describe ( 'message.read' , ( ) => {
732+ let initialCountUnread ;
733+ let initialReadState ;
734+ let messageReadEvent ;
735+
736+ beforeEach ( ( ) => {
737+ initialCountUnread = 100 ;
738+ initialReadState = {
739+ last_read : new Date ( 1500 ) . toISOString ( ) ,
740+ last_read_message_id : '6' ,
741+ user,
742+ unread_messages : initialCountUnread ,
743+ last_delivered_at : new Date ( 1000 ) . toISOString ( ) ,
744+ last_delivered_message_id : 'delivered-msg-id' ,
745+ } ;
746+ messageReadEvent = {
747+ type : 'message.read' ,
748+ created_at : new Date ( 2000 ) . toISOString ( ) ,
749+ cid : channel . cid ,
750+ channel_member_count : 100 ,
751+ channel_type : channel . type ,
752+ channel_id : channel . id ,
753+ user,
754+ last_read_message_id : '6b1006ad-7a6d-49d1-82d9-5ee5e8167e49' ,
755+ } ;
756+ } ) ;
757+
758+ it ( 'should update channel read state produced for current user' , ( ) => {
759+ channel . state . unreadCount = initialCountUnread ;
760+ channel . state . read [ user . id ] = initialReadState ;
761+ const event = messageReadEvent ;
762+
763+ channel . _handleChannelEvent ( event ) ;
764+
765+ expect ( channel . state . unreadCount ) . toBe ( 0 ) ;
766+ expect ( new Date ( channel . state . read [ user . id ] . last_read ) . getTime ( ) ) . toBe (
767+ new Date ( messageReadEvent . created_at ) . getTime ( ) ,
768+ ) ;
769+ expect ( channel . state . read [ user . id ] . last_read_message_id ) . toBe (
770+ event . last_read_message_id ,
771+ ) ;
772+ expect ( channel . state . read [ user . id ] . unread_messages ) . toBe ( 0 ) ;
773+ expect ( channel . state . read [ user . id ] . last_delivered_at ) . toBe (
774+ initialReadState . last_delivered_at ,
775+ ) ;
776+ expect ( channel . state . read [ user . id ] . last_delivered_message_id ) . toBe (
777+ initialReadState . last_delivered_message_id ,
778+ ) ;
779+ } ) ;
780+
781+ it ( 'should update channel read state produced for another user' , ( ) => {
782+ const anotherUser = { id : 'another-user' } ;
783+ channel . state . unreadCount = initialCountUnread ;
784+ channel . state . read [ anotherUser . id ] = initialReadState ;
785+ const event = { ...messageReadEvent , user : anotherUser } ;
786+
787+ channel . _handleChannelEvent ( event ) ;
788+
789+ expect ( channel . state . unreadCount ) . toBe ( initialCountUnread ) ;
790+ expect ( new Date ( channel . state . read [ anotherUser . id ] . last_read ) . getTime ( ) ) . toBe (
791+ new Date ( messageReadEvent . created_at ) . getTime ( ) ,
792+ ) ;
793+ expect ( channel . state . read [ anotherUser . id ] . last_read_message_id ) . toBe (
794+ event . last_read_message_id ,
795+ ) ;
796+ expect ( channel . state . read [ anotherUser . id ] . unread_messages ) . toBe ( 0 ) ;
797+ expect ( channel . state . read [ anotherUser . id ] . last_delivered_at ) . toBe (
798+ initialReadState . last_delivered_at ,
799+ ) ;
800+ expect ( channel . state . read [ anotherUser . id ] . last_delivered_message_id ) . toBe (
801+ initialReadState . last_delivered_message_id ,
802+ ) ;
803+ } ) ;
804+ } ) ;
805+
806+ describe ( 'message.delivered' , ( ) => {
807+ let initialCountUnread ;
808+ let initialReadState ;
809+ let messageDeliveredEvent ;
810+
811+ beforeEach ( ( ) => {
812+ initialCountUnread = 100 ;
813+ initialReadState = {
814+ last_read : new Date ( 1500 ) . toISOString ( ) ,
815+ last_read_message_id : '6' ,
816+ user,
817+ unread_messages : initialCountUnread ,
818+ last_delivered_at : new Date ( 1000 ) . toISOString ( ) ,
819+ last_delivered_message_id : 'delivered-msg-id' ,
820+ } ;
821+ messageDeliveredEvent = {
822+ type : 'message.delivered' ,
823+ created_at : new Date ( 2000 ) . toISOString ( ) ,
824+ cid : channel . cid ,
825+ channel_member_count : 100 ,
826+ channel_type : channel . type ,
827+ channel_id : channel . id ,
828+ user,
829+ last_delivered_message_id : 'fd403be5-9207-48db-8bd7-13bd65ffbea6' ,
830+ last_delivered_at : new Date ( 2000 ) . toISOString ( ) ,
831+ } ;
832+ } ) ;
833+
834+ it ( 'should update channel read state produced for current user' , ( ) => {
835+ channel . state . unreadCount = initialCountUnread ;
836+ channel . state . read [ user . id ] = initialReadState ;
837+
838+ channel . _handleChannelEvent ( messageDeliveredEvent ) ;
839+
840+ expect ( channel . state . unreadCount ) . toBe ( initialReadState . unread_messages ) ;
841+ expect ( new Date ( channel . state . read [ user . id ] . last_read ) . getTime ( ) ) . toBe (
842+ new Date ( initialReadState . last_read ) . getTime ( ) ,
843+ ) ;
844+ expect ( channel . state . read [ user . id ] . last_read_message_id ) . toBe (
845+ initialReadState . last_read_message_id ,
846+ ) ;
847+ expect ( channel . state . read [ user . id ] . unread_messages ) . toBe (
848+ initialReadState . unread_messages ,
849+ ) ;
850+ expect ( new Date ( channel . state . read [ user . id ] . last_delivered_at ) . getTime ( ) ) . toBe (
851+ new Date ( messageDeliveredEvent . last_delivered_at ) . getTime ( ) ,
852+ ) ;
853+ expect ( channel . state . read [ user . id ] . last_delivered_message_id ) . toBe (
854+ messageDeliveredEvent . last_delivered_message_id ,
855+ ) ;
856+ } ) ;
857+
858+ it ( 'should update channel read state produced for another user' , ( ) => {
859+ const anotherUser = { id : 'another-user' } ;
860+ channel . state . unreadCount = initialCountUnread ;
861+ channel . state . read [ anotherUser . id ] = initialReadState ;
862+ const event = { ...messageDeliveredEvent , user : anotherUser } ;
863+
864+ channel . _handleChannelEvent ( event ) ;
865+
866+ expect ( channel . state . unreadCount ) . toBe ( initialCountUnread ) ;
867+ expect ( new Date ( channel . state . read [ anotherUser . id ] . last_read ) . getTime ( ) ) . toBe (
868+ new Date ( initialReadState . last_read ) . getTime ( ) ,
869+ ) ;
870+ expect ( channel . state . read [ anotherUser . id ] . last_read_message_id ) . toBe (
871+ initialReadState . last_read_message_id ,
872+ ) ;
873+ expect ( channel . state . read [ anotherUser . id ] . unread_messages ) . toBe (
874+ initialReadState . unread_messages ,
875+ ) ;
876+ expect (
877+ new Date ( channel . state . read [ anotherUser . id ] . last_delivered_at ) . getTime ( ) ,
878+ ) . toBe ( new Date ( event . last_delivered_at ) . getTime ( ) ) ;
879+ expect ( channel . state . read [ anotherUser . id ] . last_delivered_message_id ) . toBe (
880+ event . last_delivered_message_id ,
881+ ) ;
882+ } ) ;
883+ } ) ;
884+
721885 it ( 'should include unread_messages for message events from another user' , ( ) => {
722886 channel . state . read [ 'id' ] = {
723887 unread_messages : 2 ,
0 commit comments