diff --git a/app/models/message/mentionee.rb b/app/models/message/mentionee.rb index c109f9c..9d88518 100644 --- a/app/models/message/mentionee.rb +++ b/app/models/message/mentionee.rb @@ -2,7 +2,8 @@ module Message::Mentionee extend ActiveSupport::Concern def mentionees - room.users.where(id: mentioned_users.map(&:id)) + ids = mentioned_users.map(&:id) + ids.empty? ? User.none : room.users.where(id: ids) end private diff --git a/test/models/message/mentionee_test.rb b/test/models/message/mentionee_test.rb new file mode 100644 index 0000000..d8d1e3e --- /dev/null +++ b/test/models/message/mentionee_test.rb @@ -0,0 +1,38 @@ +require "test_helper" + +class Message::MentioneeTest < ActiveSupport::TestCase + test "ordinary messages return an empty user relation without loading their room" do + message = rooms(:pets).messages.create!(creator: users(:jason), body: "

Fish & chips 🌍

").reload + message.body + assert_not message.association(:room).loaded? + queries = [] + subscriber = ->(*, payload) { queries << payload[:sql] unless payload[:name] == "SCHEMA" || payload[:cached] } + + ActiveSupport::Notifications.subscribed(subscriber, "sql.active_record") do + mentionees = message.mentionees + assert_equal User, mentionees.klass + assert_empty mentionees.to_a + assert_empty mentionees.ids + assert_empty mentionees.active_bots.excluding(users(:jason)).to_a + end + + assert_empty queries + assert_not message.association(:room).loaded? + assert_not message.changed? + end + + test "signed mentions follow a moved message and fresh membership changes" do + message = rooms(:designers).messages.create!(creator: users(:david), body: "

Hey #{mention_attachment_for(:kevin)}

") + assert_equal [ users(:kevin).id ], message.reload.mentionees.ids + Message.where(id: message.id).update_all(room_id: rooms(:pets).id) + message = Message.find(message.id) + assert_empty message.mentionees.ids + + membership = Membership.create!(room: rooms(:pets), user: users(:kevin)) + assert_equal [ users(:kevin).id ], message.mentionees.ids + membership.delete + assert_empty message.mentionees.ids + assert_equal rooms(:pets).id, message.room_id + assert_not message.changed? + end +end