Improve realtime chat delivery and notification events
Deploy To Ghaymah / deploy (push) Has been cancelled
Deploy To Ghaymah / deploy (push) Has been cancelled
This commit is contained in:
@@ -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));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user