From b062b4a98e5a0053d9defa4abf945644be5bae01 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 6 Jun 2013 11:45:18 -0400 Subject: [PATCH] Unapproved users should not receive digest emails. Fixes #974 --- lib/jobs/enqueue_digest_emails.rb | 16 +++++++++++----- .../jobs/enqueue_digest_emails_spec.rb | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/jobs/enqueue_digest_emails.rb b/lib/jobs/enqueue_digest_emails.rb index accb97875d5..19daf9a6443 100644 --- a/lib/jobs/enqueue_digest_emails.rb +++ b/lib/jobs/enqueue_digest_emails.rb @@ -11,11 +11,17 @@ module Jobs def target_users # Users who want to receive emails and haven't been emailed int he last day - User - .select(:id) - .where(email_digests: true) - .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)") - .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)") + query = User.select(:id) + .where(email_digests: true) + .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)") + .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)") + + # If the site requires approval, make sure the user is approved + if SiteSetting.must_approve_users? + query = query.where("approved OR moderator OR admin") + end + + query end end diff --git a/spec/components/jobs/enqueue_digest_emails_spec.rb b/spec/components/jobs/enqueue_digest_emails_spec.rb index db0ada1a220..d682daf49ca 100644 --- a/spec/components/jobs/enqueue_digest_emails_spec.rb +++ b/spec/components/jobs/enqueue_digest_emails_spec.rb @@ -14,6 +14,24 @@ describe Jobs::EnqueueDigestEmails do end end + context 'unapproved users' do + Given!(:unapproved_user) { Fabricate(:user, approved: false, last_emailed_at: 8.days.ago, last_seen_at: 10.days.ago) } + When { SiteSetting.stubs(:must_approve_users?).returns(true) } + Then { expect(Jobs::EnqueueDigestEmails.new.target_users.include?(unapproved_user)).to eq(false) } + + # As a moderator + And { unapproved_user.update_column(:moderator, true) } + And { expect(Jobs::EnqueueDigestEmails.new.target_users.include?(unapproved_user)).to eq(true) } + + # As an admin + And { unapproved_user.update_attributes(admin: true, moderator: false) } + And { expect(Jobs::EnqueueDigestEmails.new.target_users.include?(unapproved_user)).to eq(true) } + + # As an approved user + And { unapproved_user.update_attributes(admin: false, moderator: false, approved: true ) } + And { expect(Jobs::EnqueueDigestEmails.new.target_users.include?(unapproved_user)).to eq(true) } + end + context 'recently emailed' do let!(:user_emailed_recently) { Fabricate(:user, last_emailed_at: 6.days.ago) }