FIX: don't bump topics when hidden tags are added or removed

This commit is contained in:
Neil Lalonde 2019-05-06 14:51:51 -04:00
parent 39260c841e
commit 5de750d373
3 changed files with 52 additions and 1 deletions

View File

@ -522,7 +522,23 @@ class PostRevisor
end
def bypass_bump?
!@post_successfully_saved || @topic_changes.errored? || @opts[:bypass_bump] == true || @post.whisper?
!@post_successfully_saved ||
@topic_changes.errored? ||
@opts[:bypass_bump] == true ||
@post.whisper? ||
only_hidden_tags_changed?
end
def only_hidden_tags_changed?
modifications = post_changes.merge(@topic_changes.diff)
if modifications.keys.size == 1 && tags_diff = modifications["tags"]
a, b = tags_diff[0] || [], tags_diff[1] || []
changed_tags = (a + b) - (a & b)
if (changed_tags - DiscourseTagging.hidden_tag_names(nil)).empty?
return true
end
end
false
end
def is_last_post?

View File

@ -740,6 +740,31 @@ describe PostRevisor do
end
end
context "hidden tags" do
let(:bumped_at) { 1.day.ago }
before do
topic.update_attributes!(bumped_at: bumped_at)
create_hidden_tags(['important', 'secret'])
topic = post.topic
topic.tags = [Fabricate(:tag, name: "super"), Tag.where(name: "important").first, Fabricate(:tag, name: "stuff")]
end
it "doesn't bump topic if only staff-only tags are added" do
expect {
result = subject.revise!(Fabricate(:admin), raw: post.raw, tags: topic.tags.map(&:name) + ['secret'])
expect(result).to eq(true)
}.to_not change { topic.reload.bumped_at }
end
it "doesn't bump topic if only staff-only tags are removed" do
expect {
result = subject.revise!(Fabricate(:admin), raw: post.raw, tags: topic.tags.map(&:name) - ['important', 'secret'])
expect(result).to eq(true)
}.to_not change { topic.reload.bumped_at }
end
end
end
context "cannot create tags" do

View File

@ -110,6 +110,16 @@ module Helpers
end
end
def create_hidden_tags(tag_names)
tag_group = Fabricate(:tag_group,
name: 'Hidden Tags',
permissions: { staff: :full }
)
tag_names.each do |name|
tag_group.tags << (Tag.where(name: name).first || Fabricate(:tag, name: name))
end
end
def capture_stdout
old_stdout = $stdout
io = StringIO.new