Improve realtime chat delivery and notification events
Deploy To Ghaymah / deploy (push) Has been cancelled

This commit is contained in:
boutmoun123
2026-06-07 14:57:36 +03:00
parent 22550055d3
commit c93296ba9d
11 changed files with 462 additions and 38 deletions
+61
View File
@@ -24,6 +24,9 @@ describe('ChatService realtime message broadcasting', () => {
createMessage: jest.fn(),
updateConversationAfterNewMessage: jest.fn().mockResolvedValue(conversation),
findMessageById: jest.fn(),
markMessageSeen: jest.fn().mockResolvedValue(undefined),
clearConversationUnreadForUser: jest.fn().mockResolvedValue(undefined),
markMessageDelivered: jest.fn().mockResolvedValue(undefined),
};
notificationsService = {
createMessageNotification: jest.fn().mockResolvedValue(null),
@@ -102,4 +105,62 @@ describe('ChatService realtime message broadcasting', () => {
expect(chatRealtimeService.emitNewMessage).toHaveBeenCalledTimes(1);
expect(chatRealtimeService.emitNewMessage).toHaveBeenCalledWith(conversationId, message);
});
it('marks a message delivered for a participant that is not the sender', async () => {
const messageId = new Types.ObjectId().toString();
chatRepository.findMessageById.mockResolvedValue({
id: messageId,
conversationId: new Types.ObjectId(conversationId),
senderId: new Types.ObjectId(senderId),
});
const result = await service.markMessageDelivered(recipientId, conversationId, messageId);
expect(chatRepository.markMessageDelivered).toHaveBeenCalledWith(
messageId,
recipientId,
expect.any(Date),
);
expect(result).toMatchObject({
conversationId,
messageId,
userId: recipientId,
});
expect(result.deliveredAt).toEqual(expect.any(String));
});
it('does not let the sender mark their own message delivered', async () => {
const messageId = new Types.ObjectId().toString();
chatRepository.findMessageById.mockResolvedValue({
id: messageId,
conversationId: new Types.ObjectId(conversationId),
senderId: new Types.ObjectId(senderId),
});
await expect(service.markMessageDelivered(senderId, conversationId, messageId)).rejects.toThrow(
'Sender cannot mark own message delivered',
);
expect(chatRepository.markMessageDelivered).not.toHaveBeenCalled();
});
it('marks a message seen and returns conversationId and seenAt for realtime payloads', async () => {
const messageId = new Types.ObjectId().toString();
chatRepository.findMessageById.mockResolvedValue({
id: messageId,
conversationId: new Types.ObjectId(conversationId),
senderId: new Types.ObjectId(senderId),
});
const result = await service.markMessageSeen(recipientId, messageId, conversationId);
expect(chatRepository.markMessageSeen).toHaveBeenCalledWith(messageId, recipientId);
expect(chatRepository.clearConversationUnreadForUser).toHaveBeenCalledWith(conversationId, recipientId);
expect(result).toMatchObject({
success: true,
conversationId,
messageId,
userId: recipientId,
});
expect(result.seenAt).toEqual(expect.any(String));
});
});