From d142544159dee7a93e31c886737e12c5bca8844a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 10 May 2017 09:45:43 -0400 Subject: [PATCH] Spec coverage and refactor of digest mailer worker (#2961) --- app/workers/digest_mailer_worker.rb | 15 ++++++++-- spec/workers/digest_mailer_worker_spec.rb | 36 +++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 spec/workers/digest_mailer_worker_spec.rb diff --git a/app/workers/digest_mailer_worker.rb b/app/workers/digest_mailer_worker.rb index dedb21e4e..028db89a9 100644 --- a/app/workers/digest_mailer_worker.rb +++ b/app/workers/digest_mailer_worker.rb @@ -5,10 +5,21 @@ class DigestMailerWorker sidekiq_options queue: 'mailers' + attr_reader :user + def perform(user_id) - user = User.find(user_id) - return unless user.settings.notification_emails['digest'] + @user = User.find(user_id) + deliver_digest if user_receives_digest? + end + + private + + def deliver_digest NotificationMailer.digest(user.account).deliver_now! user.touch(:last_emailed_at) end + + def user_receives_digest? + user.settings.notification_emails['digest'] + end end diff --git a/spec/workers/digest_mailer_worker_spec.rb b/spec/workers/digest_mailer_worker_spec.rb new file mode 100644 index 000000000..db3b1390d --- /dev/null +++ b/spec/workers/digest_mailer_worker_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe DigestMailerWorker do + describe 'perform' do + let(:user) { Fabricate(:user, last_emailed_at: 3.days.ago) } + + context 'for a user who receives digests' do + it 'sends the email' do + service = double(deliver_now!: nil) + allow(NotificationMailer).to receive(:digest).and_return(service) + update_user_digest_setting(true) + described_class.perform_async(user.id) + + expect(NotificationMailer).to have_received(:digest) + expect(user.reload.last_emailed_at).to be_within(1).of(Time.now.utc) + end + end + + context 'for a user who does not receive digests' do + it 'does not send the email' do + allow(NotificationMailer).to receive(:digest) + update_user_digest_setting(false) + described_class.perform_async(user.id) + + expect(NotificationMailer).not_to have_received(:digest) + expect(user.last_emailed_at).to be_within(1).of(3.days.ago) + end + end + + def update_user_digest_setting(value) + user.settings['notification_emails'] = user.settings['notification_emails'].merge('digest' => value) + end + end +end