diff --git a/app/models/follow.rb b/app/models/follow.rb index fd86ea027..fc7281716 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -27,13 +27,14 @@ class Follow < ApplicationRecord scope :follower_podcast, ->(id) { where(follower_id: id, followable_type: "Podcast") } scope :follower_tag, ->(id) { where(follower_id: id, followable_type: "ActsAsTaggableOn::Tag") } + # Follows from users who don't have suspended or spam role scope :non_suspended, lambda { |followable_type, followable_id| joins("INNER JOIN users ON users.id = follows.follower_id") .joins("LEFT JOIN users_roles ON users_roles.user_id = users.id") .joins("LEFT JOIN roles ON roles.id = users_roles.role_id") .where(followable_type: followable_type, followable_id: followable_id) .where("follows.follower_type = 'User'") - .where("roles.name != 'suspended' OR roles.name IS NULL") + .where("roles.name NOT IN (?) OR roles.name IS NULL", %w[suspended spam]) } counter_culture :follower, column_name: proc { |follow| COUNTER_CULTURE_COLUMN_NAME_BY_TYPE[follow.followable_type] }, diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb index c58631588..2c0032baf 100644 --- a/spec/models/follow_spec.rb +++ b/spec/models/follow_spec.rb @@ -4,11 +4,8 @@ RSpec.describe Follow do let(:user) { create(:user) } let(:tag) { create(:tag) } let(:user_2) { create(:user) } - let(:suspended_user) { create(:user) } - - before do - suspended_user.add_role(:suspended) - end + let(:suspended_user) { create(:user, :suspended) } + let(:spam_user) { create(:user, :spam) } describe "validations" do subject { user.follow(user_2) } @@ -77,15 +74,17 @@ RSpec.describe Follow do user.follow(user_2) user.follow(tag) suspended_user.follow(user_2) + spam_user.follow(user_2) end - it "excludes suspended users from the result" do + it "excludes suspended users from the result", :aggregate_failures do result = described_class.non_suspended(user_2.class.name, user_2.id) expect(result.map(&:follower)).to include(user) expect(result.map(&:follower)).not_to include(suspended_user) + expect(result.map(&:follower)).not_to include(spam_user) end - it "filters by followable type and id" do + it "filters by followable type and id", :aggregate_failures do result = described_class.non_suspended("ActsAsTaggableOn::Tag", tag.id) expect(result.map(&:follower)).to include(user) expect(result.map(&:follower)).not_to include(user_2)