From cf8088ee7fe19221b2caa6d5309d46a65b3c43c7 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 11 Aug 2023 15:59:32 +0530 Subject: [PATCH] fix(ui): fix replaceMentions not working with usernames. Signed-off-by: Sahil Kumar --- .../lib/src/utils/extensions.dart | 6 +- .../test/src/utils/extension_test.dart | 122 ++++++++++++++++++ 2 files changed, 125 insertions(+), 3 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/utils/extensions.dart b/packages/stream_chat_flutter/lib/src/utils/extensions.dart index 06b02aae..94a1bd83 100644 --- a/packages/stream_chat_flutter/lib/src/utils/extensions.dart +++ b/packages/stream_chat_flutter/lib/src/utils/extensions.dart @@ -352,12 +352,12 @@ extension MessageX on Message { final userName = user.name; if (linkify) { messageTextToRender = messageTextToRender?.replaceAll( - '@$userId', - '[@$userName](@${userName.replaceAll(' ', '')})', + RegExp('@($userId|$userName)'), + '[@$userName]($userId)', ); } else { messageTextToRender = messageTextToRender?.replaceAll( - '@$userId', + RegExp('@($userId|$userName)'), '@$userName', ); } diff --git a/packages/stream_chat_flutter/test/src/utils/extension_test.dart b/packages/stream_chat_flutter/test/src/utils/extension_test.dart index eef7677e..52a6cc5f 100644 --- a/packages/stream_chat_flutter/test/src/utils/extension_test.dart +++ b/packages/stream_chat_flutter/test/src/utils/extension_test.dart @@ -148,4 +148,126 @@ void main() { expect('ㅎㅎㅎㅎ'.isOnlyEmoji, false); }); }); + + group('Message Extension Tests', () { + test('replaceMentions should replace user mentions with names and IDs', () { + final user1 = User(id: 'user1', name: 'Alice'); + final user2 = User(id: 'user2', name: 'Bob'); + + final message = Message( + text: 'Hello, @user1 and @user2!', + mentionedUsers: [user1, user2], + ); + + final modifiedMessage = message.replaceMentions(); + + expect(modifiedMessage.text, contains('[@Alice](user1)')); + expect(modifiedMessage.text, contains('[@Bob](user2)')); + }); + + test('replaceMentions without linkify should not add links', () { + final user = User(id: 'user1', name: 'Alice'); + + final message = Message( + text: 'Hello, @user1!', + mentionedUsers: [user], + ); + + final modifiedMessage = message.replaceMentions(linkify: false); + + expect(modifiedMessage.text, contains('@Alice')); + }); + + test('replaceMentions should handle mentions with usernames', () { + final user = User(id: 'user1', name: 'Alice'); + + final message = Message( + text: 'Hello, @Alice!', + mentionedUsers: [user], + ); + + final modifiedMessage = message.replaceMentions(); + + expect(modifiedMessage.text, contains('[@Alice](user1)')); + }); + + test( + '''replaceMentions without linkify should not change mentions with usernames''', + () { + final user = User(id: 'user1', name: 'Alice'); + + final message = Message( + text: 'Hello, @Alice!', + mentionedUsers: [user], + ); + + final modifiedMessage = message.replaceMentions(linkify: false); + + expect(modifiedMessage.text, contains('@Alice')); + }, + ); + + test( + 'replaceMentions should replace mixed user mentions with names and IDs', + () { + final user1 = User(id: 'user1', name: 'Alice'); + final user2 = User(id: 'user2', name: 'Bob'); + + final message = Message( + text: 'Hello, @user1 and @Bob!', + mentionedUsers: [user1, user2], + ); + + final modifiedMessage = message.replaceMentions(); + + expect(modifiedMessage.text, contains('[@Alice](user1)')); + expect(modifiedMessage.text, contains('[@Bob](user2)')); + }, + ); + + test('replaceMentionsWithId should replace user names with IDs', () { + final user1 = User(id: 'user1', name: 'Alice'); + final user2 = User(id: 'user2', name: 'Bob'); + + final message = Message( + text: 'Hello, @Alice and @Bob!', + mentionedUsers: [user1, user2], + ); + + final modifiedMessage = message.replaceMentionsWithId(); + + expect(modifiedMessage.text, contains('@user1')); + expect(modifiedMessage.text, contains('@user2')); + expect(modifiedMessage.text, isNot(contains('@Alice'))); + expect(modifiedMessage.text, isNot(contains('@Bob'))); + }); + + test( + 'replaceMentionsWithId should not change message without mentions', + () { + final message = Message( + text: 'Hello, @Alice!', + ); + + final modifiedMessage = message.replaceMentionsWithId(); + + expect(modifiedMessage.text, equals('Hello, @Alice!')); + expect(modifiedMessage.text, isNot(contains('@user1'))); + }, + ); + + test('replaceMentionsWithId should handle message with only mention', () { + final user = User(id: 'user1', name: 'Alice'); + + final message = Message( + text: '@Alice', + mentionedUsers: [user], + ); + + final modifiedMessage = message.replaceMentionsWithId(); + + expect(modifiedMessage.text, contains('@user1')); + expect(modifiedMessage.text, isNot(contains('@Alice'))); + }); + }); }