@@ -5195,6 +5195,280 @@ void main() {
51955195 );
51965196 });
51975197 });
5198+
5199+ group ('User messages deleted event' , () {
5200+ const channelId = 'test-channel-id' ;
5201+ const channelType = 'test-channel-type' ;
5202+ late Channel channel;
5203+
5204+ setUp (() {
5205+ final channelState = _generateChannelState (channelId, channelType);
5206+ channel = Channel .fromState (client, channelState);
5207+ });
5208+
5209+ tearDown (() {
5210+ channel.dispose ();
5211+ });
5212+
5213+ test (
5214+ 'should soft delete all messages from user when hardDelete is false' ,
5215+ () async {
5216+ // Setup: Add messages from different users
5217+ final user1 = User (id: 'user-1' , name: 'User 1' );
5218+ final user2 = User (id: 'user-2' , name: 'User 2' );
5219+
5220+ final message1 = Message (
5221+ id: 'msg-1' ,
5222+ text: 'Message from user 1' ,
5223+ user: user1,
5224+ );
5225+ final message2 = Message (
5226+ id: 'msg-2' ,
5227+ text: 'Another message from user 1' ,
5228+ user: user1,
5229+ );
5230+ final message3 = Message (
5231+ id: 'msg-3' ,
5232+ text: 'Message from user 2' ,
5233+ user: user2,
5234+ );
5235+
5236+ channel.state? .updateMessage (message1);
5237+ channel.state? .updateMessage (message2);
5238+ channel.state? .updateMessage (message3);
5239+
5240+ // Verify initial state
5241+ expect (channel.state? .messages.length, equals (3 ));
5242+ expect (
5243+ channel.state? .messages.where ((m) => m.user? .id == 'user-1' ).length,
5244+ equals (2 ),
5245+ );
5246+ expect (
5247+ channel.state? .messages.where ((m) => m.user? .id == 'user-2' ).length,
5248+ equals (1 ),
5249+ );
5250+
5251+ // Create user.messages.deleted event (soft delete)
5252+ final deletedAt = DateTime .now ();
5253+ final userMessagesDeletedEvent = Event (
5254+ cid: channel.cid,
5255+ type: EventType .userMessagesDeleted,
5256+ user: user1,
5257+ hardDelete: false ,
5258+ createdAt: deletedAt,
5259+ );
5260+
5261+ // Dispatch event
5262+ client.addEvent (userMessagesDeletedEvent);
5263+
5264+ // Wait for the event to be processed
5265+ await Future .delayed (Duration .zero);
5266+
5267+ // Verify user1's messages are soft deleted
5268+ expect (channel.state? .messages.length, equals (3 ));
5269+ final deletedMessages = channel.state? .messages
5270+ .where ((m) => m.user? .id == 'user-1' )
5271+ .toList ();
5272+ expect (deletedMessages? .length, equals (2 ));
5273+ for (final message in deletedMessages! ) {
5274+ expect (message.type, equals (MessageType .deleted));
5275+ expect (message.deletedAt, isNotNull);
5276+ expect (message.state.isDeleted, isTrue);
5277+ }
5278+
5279+ // Verify user2's message is unaffected
5280+ final user2Message =
5281+ channel.state? .messages.firstWhere ((m) => m.id == 'msg-3' );
5282+ expect (user2Message? .type, isNot (MessageType .deleted));
5283+ expect (user2Message? .deletedAt, isNull);
5284+ },
5285+ );
5286+
5287+ test (
5288+ 'should hard delete all messages from user when hardDelete is true' ,
5289+ () async {
5290+ // Setup: Add messages from different users
5291+ final user1 = User (id: 'user-1' , name: 'User 1' );
5292+ final user2 = User (id: 'user-2' , name: 'User 2' );
5293+
5294+ final message1 = Message (
5295+ id: 'msg-1' ,
5296+ text: 'Message from user 1' ,
5297+ user: user1,
5298+ );
5299+ final message2 = Message (
5300+ id: 'msg-2' ,
5301+ text: 'Another message from user 1' ,
5302+ user: user1,
5303+ );
5304+ final message3 = Message (
5305+ id: 'msg-3' ,
5306+ text: 'Message from user 2' ,
5307+ user: user2,
5308+ );
5309+
5310+ channel.state? .updateMessage (message1);
5311+ channel.state? .updateMessage (message2);
5312+ channel.state? .updateMessage (message3);
5313+
5314+ // Verify initial state
5315+ expect (channel.state? .messages.length, equals (3 ));
5316+
5317+ // Create user.messages.deleted event (hard delete)
5318+ final userMessagesDeletedEvent = Event (
5319+ cid: channel.cid,
5320+ type: EventType .userMessagesDeleted,
5321+ user: user1,
5322+ hardDelete: true ,
5323+ );
5324+
5325+ // Dispatch event
5326+ client.addEvent (userMessagesDeletedEvent);
5327+
5328+ // Wait for the event to be processed
5329+ await Future .delayed (Duration .zero);
5330+
5331+ // Verify user1's messages are removed
5332+ expect (channel.state? .messages.length, equals (1 ));
5333+ expect (
5334+ channel.state? .messages.any ((m) => m.user? .id == 'user-1' ),
5335+ isFalse,
5336+ );
5337+
5338+ // Verify user2's message still exists
5339+ final user2Message =
5340+ channel.state? .messages.firstWhere ((m) => m.id == 'msg-3' );
5341+ expect (user2Message, isNotNull);
5342+ expect (user2Message? .user? .id, equals ('user-2' ));
5343+ },
5344+ );
5345+
5346+ test (
5347+ 'should handle thread messages from user' ,
5348+ () async {
5349+ // Setup: Add parent and thread messages
5350+ final user1 = User (id: 'user-1' , name: 'User 1' );
5351+ final user2 = User (id: 'user-2' , name: 'User 2' );
5352+
5353+ final parentMessage = Message (
5354+ id: 'parent-msg' ,
5355+ text: 'Parent message' ,
5356+ user: user2,
5357+ );
5358+ final threadMessage1 = Message (
5359+ id: 'thread-msg-1' ,
5360+ text: 'Thread message from user 1' ,
5361+ user: user1,
5362+ parentId: 'parent-msg' ,
5363+ );
5364+ final threadMessage2 = Message (
5365+ id: 'thread-msg-2' ,
5366+ text: 'Another thread message from user 1' ,
5367+ user: user1,
5368+ parentId: 'parent-msg' ,
5369+ );
5370+
5371+ channel.state? .updateMessage (parentMessage);
5372+ channel.state? .updateThreadInfo ('parent-msg' , [
5373+ threadMessage1,
5374+ threadMessage2,
5375+ ]);
5376+
5377+ // Verify initial state
5378+ expect (channel.state? .messages.length, equals (1 ));
5379+ expect (channel.state? .threads['parent-msg' ]? .length, equals (2 ));
5380+
5381+ // Create user.messages.deleted event (soft delete)
5382+ final userMessagesDeletedEvent = Event (
5383+ cid: channel.cid,
5384+ type: EventType .userMessagesDeleted,
5385+ user: user1,
5386+ hardDelete: false ,
5387+ );
5388+
5389+ // Dispatch event
5390+ client.addEvent (userMessagesDeletedEvent);
5391+
5392+ // Wait for the event to be processed
5393+ await Future .delayed (Duration .zero);
5394+
5395+ // Verify thread messages are soft deleted
5396+ final threadMessages = channel.state? .threads['parent-msg' ];
5397+ expect (threadMessages? .length, equals (2 ));
5398+ for (final message in threadMessages! ) {
5399+ expect (message.type, equals (MessageType .deleted));
5400+ expect (message.state.isDeleted, isTrue);
5401+ }
5402+
5403+ // Verify parent message is unaffected
5404+ final parent = channel.state? .messages.first;
5405+ expect (parent? .type, isNot (MessageType .deleted));
5406+ },
5407+ );
5408+
5409+ test (
5410+ 'should do nothing when user is null' ,
5411+ () async {
5412+ // Setup: Add messages
5413+ final user1 = User (id: 'user-1' , name: 'User 1' );
5414+ final message1 = Message (
5415+ id: 'msg-1' ,
5416+ text: 'Message from user 1' ,
5417+ user: user1,
5418+ );
5419+
5420+ channel.state? .updateMessage (message1);
5421+
5422+ // Verify initial state
5423+ expect (channel.state? .messages.length, equals (1 ));
5424+
5425+ // Create user.messages.deleted event without user
5426+ final userMessagesDeletedEvent = Event (
5427+ cid: channel.cid,
5428+ type: EventType .userMessagesDeleted,
5429+ hardDelete: false ,
5430+ );
5431+
5432+ // Dispatch event
5433+ client.addEvent (userMessagesDeletedEvent);
5434+
5435+ // Wait for the event to be processed
5436+ await Future .delayed (Duration .zero);
5437+
5438+ // Verify messages are unaffected
5439+ expect (channel.state? .messages.length, equals (1 ));
5440+ expect (
5441+ channel.state? .messages.first.type,
5442+ isNot (MessageType .deleted),
5443+ );
5444+ },
5445+ );
5446+
5447+ test (
5448+ 'should handle empty message list' ,
5449+ () async {
5450+ // Setup: Empty channel
5451+ expect (channel.state? .messages.length, equals (0 ));
5452+
5453+ // Create user.messages.deleted event
5454+ final userMessagesDeletedEvent = Event (
5455+ cid: channel.cid,
5456+ type: EventType .userMessagesDeleted,
5457+ user: User (id: 'user-1' ),
5458+ hardDelete: false ,
5459+ );
5460+
5461+ // Dispatch event - should not throw
5462+ client.addEvent (userMessagesDeletedEvent);
5463+
5464+ // Wait for the event to be processed
5465+ await Future .delayed (Duration .zero);
5466+
5467+ // Verify state is still empty
5468+ expect (channel.state? .messages.length, equals (0 ));
5469+ },
5470+ );
5471+ });
51985472 });
51995473
52005474 group ('ChannelCapabilityCheck' , () {
0 commit comments