diff --git a/app/models/comment.rb b/app/models/comment.rb index ba647ea1d..6ce273f35 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -317,9 +317,8 @@ class Comment < ApplicationRecord end def synchronous_spam_score_check - return unless Settings::RateLimit.trigger_spam_for?(text: [title, body_markdown].join("\n")) - - self.score = -1 # ensure notification is not sent if possibly spammy + self.score = -3 if user.registered_at > 48.hours.ago && body_markdown.include?("http") + self.score = -5 if Settings::RateLimit.trigger_spam_for?(text: [title, body_markdown].join("\n")) end def create_conditional_autovomits @@ -332,6 +331,7 @@ class Comment < ApplicationRecord parent_user != user && parent_user.notification_setting.email_comment_notifications && parent_user.email && + user&.badge_achievements_count&.positive? && parent_or_root_article.receive_notifications end diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb index 12419140b..cd27ecb0e 100644 --- a/spec/models/comment_spec.rb +++ b/spec/models/comment_spec.rb @@ -431,7 +431,7 @@ RSpec.describe Comment do # rubocop:disable RSpec/ExampleLength it "enqueues a worker to send email" do comment.save! - child_comment_user = create(:user) + child_comment_user = create(:user, badge_achievements_count: 1) child_comment = build(:comment, parent: comment, user: child_comment_user, commentable: article) expect do @@ -440,6 +440,16 @@ RSpec.describe Comment do end # rubocop:enable RSpec/ExampleLength + it "does not send email notification if commenter has no badges" do + comment.save! + child_comment_user = create(:user, badge_achievements_count: 0) + child_comment = build(:comment, parent: comment, user: child_comment_user, commentable: article) + + expect do + child_comment.save! + end.not_to change(Comments::SendEmailNotificationWorker.jobs, :size) + end + it "enqueues a worker to bust comment cache" do expect do comment.save @@ -492,6 +502,28 @@ RSpec.describe Comment do comment.save expect(Spam::Handler).to have_received(:handle_comment!).with(comment: comment) end + + it "marks score as negative 3 if new user and comment includes htttp" do + comment = build(:comment, user: user, commentable: article) + comment.body_markdown = "http://example.com this has a link" + comment.save! + expect(comment.score).to eq(-3) + end + + it "does not mark as negative 3 if not new user" do + user.update_column(:registered_at, 5.days.ago) + comment = build(:comment, user: user, commentable: article) + comment.body_markdown = "http://example.com this has a link" + comment.save + expect(comment.score).to eq(0) + end + + it "marks score as negative 5 if spam trigger is called" do + # Settings::RateLimit.trigger_spam_for?(text: [title, body_markdown].join("\n")) + allow(Settings::RateLimit).to receive(:trigger_spam_for?).and_return(true) + comment = create(:comment, user: user, commentable: article) + expect(comment.score).to eq(-5) + end end describe "#privileged_reaction_counts" do