From 11ccea5c9a136ff322d555d397176e8e0004ba66 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Tue, 2 Mar 2021 15:46:50 +0100 Subject: [PATCH] FIX: `Topic#invite_group` failed to notify users on newly created topic (#12255) When `PostCreator` creates a new topic it loads the `allowed_groups` of the topic. `Fabricate` doesn't do that and that's why the existing spec worked even though it should have failed, because `PostAlerter#notify_group_summary` didn't create a notification for a non-fabricated topic. `Topic#invite_group` added a new `TopicAllowedGroup` record without reloading `Topic.allowed_groups`. A subsequent call to `PostAlerter#notify_group_summary` didn't work because it didn't find the invited group in the topic's `allowed_groups` association. --- app/models/topic.rb | 2 ++ spec/models/topic_spec.rb | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/models/topic.rb b/app/models/topic.rb index a141b144646..2ad0fccdc37 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -930,6 +930,7 @@ class Topic < ActiveRecord::Base group_user = topic_allowed_groups.find_by(group_id: group.id) if group_user group_user.destroy + allowed_groups.reload add_small_action(removed_by, "removed_group", group.name) return true end @@ -968,6 +969,7 @@ class Topic < ActiveRecord::Base def invite_group(user, group) TopicAllowedGroup.create!(topic_id: id, group_id: group.id) + allowed_groups.reload last_post = posts.order('post_number desc').where('not hidden AND posts.deleted_at IS NULL').first if last_post diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index c5d45472406..6f45a32708f 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -909,7 +909,15 @@ describe Topic do context 'private message' do let(:coding_horror) { Fabricate(:coding_horror) } fab!(:evil_trout) { Fabricate(:evil_trout) } - let(:topic) { Fabricate(:private_message_topic, recipient: coding_horror) } + let(:topic) do + PostCreator.new( + Fabricate(:user), + title: "This is a private message", + raw: "This is my message to you-ou-ou", + archetype: Archetype.private_message, + target_usernames: coding_horror.username + ).create!.topic + end it "should integrate correctly" do expect(Guardian.new(topic.user).can_see?(topic)).to eq(true)