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.
This commit is contained in:
Gerhard Schlager 2021-03-02 15:46:50 +01:00 committed by GitHub
parent 154bfcf750
commit 11ccea5c9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 1 deletions

View File

@ -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

View File

@ -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)