DEV: Create and update chat message mentions earlier (#21388)

We need to create and update `chat_mentions` records for messages earlier. They should be created or updated before we  call `Chat::Publisher.publish_new!` `Chat::Publisher.publish_edit!` to send the message to message bus subscribers).

This logic is covered with tests in `message_creator_spec.rb`, `message_updater_spec.rb`, `notifier_spec.rb` and `notify_mentioned_spec.rb`.

See the commits history for steps of refactoring.
This commit is contained in:
Andrei Prigorshnev
2023-05-05 15:47:07 +04:00
committed by GitHub
parent 78616404ce
commit 35a414bb38
7 changed files with 104 additions and 65 deletions

View File

@ -552,17 +552,22 @@ describe Chat::Message do
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
it "creates mentions for passed user ids" do
mentioned_user_ids = [user1.id, user2.id]
message.create_mentions(mentioned_user_ids)
it "creates mentions for mentioned usernames" do
message.message = "Mentioning @#{user1.username} and @#{user2.username}"
message.cook
message.create_mentions
message.reload
expect(message.chat_mentions.pluck(:user_id)).to match_array(mentioned_user_ids)
expect(message.chat_mentions.pluck(:user_id)).to match_array([user1.id, user2.id])
end
it "ignores duplicates in passed user ids" do
mentioned_user_ids = [user1.id, user1.id, user1.id, user1.id, user1.id]
message.create_mentions(mentioned_user_ids)
it "ignores duplicated mentions" do
message.message =
"Mentioning @#{user1.username} @#{user1.username} @#{user1.username} @#{user1.username}"
message.cook
message.create_mentions
message.reload
expect(message.chat_mentions.pluck(:user_id)).to contain_exactly(user1.id)
@ -570,28 +575,36 @@ describe Chat::Message do
end
describe "#update_mentions" do
fab!(:message) { Fabricate(:chat_message) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
fab!(:user3) { Fabricate(:user) }
fab!(:user4) { Fabricate(:user) }
fab!(:message) do
Fabricate(:chat_message, message: "Hey @#{user1.username} and @#{user2.username}")
end
let(:already_mentioned) { [user1.id, user2.id] }
before { message.create_mentions(already_mentioned) }
before { message.create_mentions }
it "creates newly added mentions" do
existing_mention_ids = message.chat_mentions.pluck(:id)
message.message = message.message + " @#{user3.username} @#{user4.username} "
message.cook
mentioned_user_ids = [*already_mentioned, user3.id, user4.id]
message.update_mentions(mentioned_user_ids)
message.update_mentions
message.reload
expect(message.chat_mentions.pluck(:user_id)).to match_array(mentioned_user_ids)
expect(message.chat_mentions.pluck(:user_id)).to match_array(
[user1.id, user2.id, user3.id, user4.id],
)
expect(message.chat_mentions.pluck(:id)).to include(*existing_mention_ids) # existing mentions weren't recreated
end
it "drops removed mentions" do
message.update_mentions([user1.id]) # user 2 is not mentioned anymore
message.message = "Hey @#{user1.username}" # user 2 is not mentioned anymore
message.cook
message.update_mentions
message.reload
expect(message.chat_mentions.pluck(:user_id)).to contain_exactly(user1.id)
@ -599,12 +612,13 @@ describe Chat::Message do
it "changes nothing if passed mentions are identical to existing mentions" do
existing_mention_ids = message.chat_mentions.pluck(:id)
message.message = message.message
message.cook
mentioned_user_ids = [*already_mentioned]
message.update_mentions(mentioned_user_ids)
message.update_mentions
message.reload
expect(message.chat_mentions.pluck(:user_id)).to match_array(mentioned_user_ids)
expect(message.chat_mentions.pluck(:user_id)).to match_array(already_mentioned)
expect(message.chat_mentions.pluck(:id)).to include(*existing_mention_ids) # the mentions weren't recreated
end
end