@@ -3474,6 +3474,166 @@ void main() {
34743474 },
34753475 );
34763476
3477+ group (
3478+ EventType .messageUpdated,
3479+ () {
3480+ const channelId = 'test-channel-id' ;
3481+ const channelType = 'test-channel-type' ;
3482+ late Channel channel;
3483+
3484+ setUp (() {
3485+ final channelState = _generateChannelState (
3486+ channelId,
3487+ channelType,
3488+ mockChannelConfig: true ,
3489+ ownCapabilities: const [ChannelCapability .readEvents],
3490+ );
3491+
3492+ channel = Channel .fromState (client, channelState);
3493+ });
3494+
3495+ tearDown (() => channel.dispose ());
3496+
3497+ Event createUpdateMessageEvent (Message message) {
3498+ return Event (
3499+ cid: channel.cid,
3500+ type: EventType .messageUpdated,
3501+ message: message,
3502+ );
3503+ }
3504+
3505+ test (
3506+ "should update 'channel.state.pinnedMessages' and should add message to pinned messages only once if updatedMessage.pinned is true" ,
3507+ () async {
3508+ const messageId = 'test-message-id' ;
3509+ final message = Message (
3510+ id: messageId,
3511+ user: client.state.currentUser,
3512+ pinned: true ,
3513+ );
3514+
3515+ final newMessageEvent = createUpdateMessageEvent (message);
3516+ client.addEvent (newMessageEvent);
3517+
3518+ // Wait for the event to get processed
3519+ await Future .delayed (Duration .zero);
3520+
3521+ expect (channel.state? .pinnedMessages.length, equals (1 ));
3522+ expect (channel.state? .pinnedMessages.first.id, equals (messageId));
3523+ },
3524+ );
3525+
3526+ test (
3527+ 'should update pinned message itself if updatedMessage.pinned is true and message is already pinned' ,
3528+ () async {
3529+ const messageId = 'test-message-id' ;
3530+ const oldText = 'Old text' ;
3531+ const newText = 'New text' ;
3532+ final message = Message (
3533+ id: messageId,
3534+ user: client.state.currentUser,
3535+ text: oldText,
3536+ pinned: true ,
3537+ );
3538+
3539+ final firstUpdateEvent = createUpdateMessageEvent (message);
3540+ client.addEvent (firstUpdateEvent);
3541+
3542+ // Wait for the first event to get processed
3543+ await Future .delayed (Duration .zero);
3544+
3545+ expect (channel.state? .pinnedMessages.length, equals (1 ));
3546+ expect (channel.state? .pinnedMessages.first.id, equals (messageId));
3547+ expect (channel.state? .pinnedMessages.first.text, equals (oldText));
3548+
3549+ final updatedMessage = message.copyWith (text: newText);
3550+ final secondUpdateEvent = createUpdateMessageEvent (updatedMessage);
3551+ client.addEvent (secondUpdateEvent);
3552+
3553+ // Wait for the second event to get processed
3554+ await Future .delayed (Duration .zero);
3555+
3556+ expect (channel.state? .pinnedMessages.length, equals (1 ));
3557+ expect (channel.state? .pinnedMessages.first.id, equals (messageId));
3558+ expect (channel.state? .pinnedMessages.first.text, equals (newText));
3559+ },
3560+ );
3561+
3562+ test (
3563+ "should update 'channel.state.pinnedMessages' and should add message to pinned messages "
3564+ 'and not unpin previous pinned message if updatedMessage.pinned is true and there is already another pinned message' ,
3565+ () async {
3566+ const firstMessageId = 'first-test-message-id' ;
3567+ const secondMessageId = 'second-test-message-id' ;
3568+ final firstMessage = Message (
3569+ id: firstMessageId,
3570+ user: client.state.currentUser,
3571+ pinned: true ,
3572+ );
3573+ final secondMessage = firstMessage.copyWith (id: secondMessageId);
3574+
3575+ final firstUpdateEvent = createUpdateMessageEvent (firstMessage);
3576+ client.addEvent (firstUpdateEvent);
3577+
3578+ // Wait for the first event to get processed
3579+ await Future .delayed (Duration .zero);
3580+
3581+ expect (channel.state? .pinnedMessages.length, equals (1 ));
3582+ expect (
3583+ channel.state? .pinnedMessages.first.id,
3584+ equals (firstMessageId),
3585+ );
3586+
3587+ final secondUpdateEvent = createUpdateMessageEvent (secondMessage);
3588+ client.addEvent (secondUpdateEvent);
3589+
3590+ // Wait for the second event to get processed
3591+ await Future .delayed (Duration .zero);
3592+
3593+ expect (channel.state? .pinnedMessages.length, equals (2 ));
3594+ expect (
3595+ channel.state? .pinnedMessages.first.id,
3596+ equals (firstMessageId),
3597+ );
3598+ expect (
3599+ channel.state? .pinnedMessages[1 ].id,
3600+ equals (secondMessageId),
3601+ );
3602+ },
3603+ );
3604+
3605+ test (
3606+ "should update 'channel.state.pinnedMessages' and should remove message from pinned messages if updatedMessage.pinned is false" ,
3607+ () async {
3608+ const messageId = 'test-message-id' ;
3609+ final pinnedMessage = Message (
3610+ id: messageId,
3611+ user: client.state.currentUser,
3612+ pinned: true ,
3613+ );
3614+
3615+ final pinEvent = createUpdateMessageEvent (pinnedMessage);
3616+ client.addEvent (pinEvent);
3617+
3618+ // Wait for the pin event to get processed
3619+ await Future .delayed (Duration .zero);
3620+
3621+ expect (channel.state? .pinnedMessages.length, equals (1 ));
3622+ expect (channel.state? .pinnedMessages.first.id, equals (messageId));
3623+
3624+ final unpinnedMessage = pinnedMessage.copyWith (pinned: false );
3625+ final unpinEvent = createUpdateMessageEvent (unpinnedMessage);
3626+ client.addEvent (unpinEvent);
3627+
3628+ // Wait for the unpin event to get processed
3629+ await Future .delayed (Duration .zero);
3630+
3631+ expect (channel.state? .pinnedMessages, isEmpty);
3632+ },
3633+ );
3634+ },
3635+ );
3636+
34773637 group ('Member Events' , () {
34783638 const channelId = 'test-channel-id' ;
34793639 const channelType = 'test-channel-type' ;
0 commit comments