FIX: Ignore posts needing approval when calculating reviewable counts. (#13464)

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.

diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index 843e342..99efecf 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 cfda8b6..87385de 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

GitHub sha: e0e1e24c14720487e9e7af94e62b3df6f77525fa

This commit appears in #13464 which was approved by eviltrout. It was merged by romanrizzi.