From e5e0144957513719de1885c41ff08eebcac25fa8 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Wed, 9 Oct 2024 19:29:02 +0200
Subject: [PATCH] Fix notification requests from suspended accounts still being
 listed (#32354)

---
 .../v1/notifications/requests_controller.rb    |  2 +-
 app/models/notification_policy.rb              |  2 +-
 app/models/notification_request.rb             |  2 ++
 spec/models/notification_policy_spec.rb        | 18 ++++++++++++------
 4 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb
index 36ee073b9..3c90f13ce 100644
--- a/app/controllers/api/v1/notifications/requests_controller.rb
+++ b/app/controllers/api/v1/notifications/requests_controller.rb
@@ -52,7 +52,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
   private
 
   def load_requests
-    requests = NotificationRequest.where(account: current_account).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id(
+    requests = NotificationRequest.where(account: current_account).without_suspended.includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id(
       limit_param(DEFAULT_ACCOUNTS_LIMIT),
       params_slice(:max_id, :since_id, :min_id)
     )
diff --git a/app/models/notification_policy.rb b/app/models/notification_policy.rb
index 3b16f33d8..d22f871a3 100644
--- a/app/models/notification_policy.rb
+++ b/app/models/notification_policy.rb
@@ -62,6 +62,6 @@ class NotificationPolicy < ApplicationRecord
   private
 
   def pending_notification_requests
-    @pending_notification_requests ||= notification_requests.limit(MAX_MEANINGFUL_COUNT).pick(Arel.sql('count(*), coalesce(sum(notifications_count), 0)::bigint'))
+    @pending_notification_requests ||= notification_requests.without_suspended.limit(MAX_MEANINGFUL_COUNT).pick(Arel.sql('count(*), coalesce(sum(notifications_count), 0)::bigint'))
   end
 end
diff --git a/app/models/notification_request.rb b/app/models/notification_request.rb
index f0778b3af..eb9ff93ab 100644
--- a/app/models/notification_request.rb
+++ b/app/models/notification_request.rb
@@ -26,6 +26,8 @@ class NotificationRequest < ApplicationRecord
 
   before_save :prepare_notifications_count
 
+  scope :without_suspended, -> { joins(:from_account).merge(Account.without_suspended) }
+
   def self.preload_cache_collection(requests)
     cached_statuses_by_id = yield(requests.filter_map(&:last_status)).index_by(&:id) # Call cache_collection in block
 
diff --git a/spec/models/notification_policy_spec.rb b/spec/models/notification_policy_spec.rb
index 02a582bb0..7d1b494dd 100644
--- a/spec/models/notification_policy_spec.rb
+++ b/spec/models/notification_policy_spec.rb
@@ -7,19 +7,25 @@ RSpec.describe NotificationPolicy do
     subject { Fabricate(:notification_policy) }
 
     let(:sender) { Fabricate(:account) }
+    let(:suspended_sender) { Fabricate(:account) }
 
     before do
       Fabricate.times(2, :notification, account: subject.account, activity: Fabricate(:status, account: sender), filtered: true, type: :mention)
       Fabricate(:notification_request, account: subject.account, from_account: sender)
+
+      Fabricate(:notification, account: subject.account, activity: Fabricate(:status, account: suspended_sender), filtered: true, type: :mention)
+      Fabricate(:notification_request, account: subject.account, from_account: suspended_sender)
+
+      suspended_sender.suspend!
+
       subject.summarize!
     end
 
-    it 'sets pending_requests_count' do
-      expect(subject.pending_requests_count).to eq 1
-    end
-
-    it 'sets pending_notifications_count' do
-      expect(subject.pending_notifications_count).to eq 2
+    it 'sets pending_requests_count and pending_notifications_count' do
+      expect(subject).to have_attributes(
+        pending_requests_count: 1,
+        pending_notifications_count: 2
+      )
     end
   end
 end