From e0e1e24c14720487e9e7af94e62b3df6f77525fa Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Tue, 22 Jun 2021 12:12:39 -0300 Subject: [PATCH] FIX: Ignore posts needing approval when calculating reviewable counts. (#13464) In #12841, we started setting the ReviewableQueuedPost's target and topic after approving it instead of storing them in the payload. As a result, the reviewable_counts query started to include queued posts. When a category is set to require approval, every post has an associated reviewable. Pointing that each post has an associated queued post is not necessary in this case, so I added a WHERE clause to skip them. --- lib/topic_view.rb | 3 ++- spec/components/topic_view_spec.rb | 37 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 843e342163a..99efecfdb1e 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -509,7 +509,8 @@ class TopicView reviewable_scores s ON reviewable_id = r.id WHERE r.target_id IN (:post_ids) AND - r.target_type = 'Post' + r.target_type = 'Post' AND + COALESCE(s.reason, '') != 'category' GROUP BY target_id SQL diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb index cfda8b6ef46..87385de49a7 100644 --- a/spec/components/topic_view_spec.rb +++ b/spec/components/topic_view_spec.rb @@ -915,4 +915,41 @@ describe TopicView do expect(topic_view.show_read_indicator?).to be_falsey end end + + describe '#reviewable_counts' do + it 'exclude posts queued because the category needs approval' do + category = Fabricate.build(:category, user: admin) + category.custom_fields[Category::REQUIRE_TOPIC_APPROVAL] = true + category.save! + manager = NewPostManager.new( + user, + raw: 'to the handler I say enqueue me!', + title: 'this is the title of the queued post', + category: category.id + ) + result = manager.perform + reviewable = result.reviewable + reviewable.perform(admin, :approve_post) + + topic_view = TopicView.new(reviewable.topic, admin) + + expect(topic_view.reviewable_counts).to be_empty + end + + it 'include posts queued for other reasons' do + Fabricate(:watched_word, word: "darn", action: WatchedWord.actions[:require_approval]) + manager = NewPostManager.new( + user, + raw: 'this is darn new post content', + title: 'this is the title of the queued post' + ) + result = manager.perform + reviewable = result.reviewable + reviewable.perform(admin, :approve_post) + + topic_view = TopicView.new(reviewable.topic, admin) + + expect(topic_view.reviewable_counts.keys).to contain_exactly(reviewable.target_id) + end + end end