Skip to content

Commit 7e82150

Browse files
committed
test: add tests for user.messages.deleted event
1 parent ca304f7 commit 7e82150

File tree

2 files changed

+522
-1
lines changed

2 files changed

+522
-1
lines changed

packages/stream_chat/test/src/client/channel_test.dart

Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)