From 82c6bd4ff7dbfcb272e15da975051258d76d687d Mon Sep 17 00:00:00 2001 From: lizconlan Date: Fri, 16 Dec 2016 16:53:23 +0000 Subject: [PATCH] Prevent the survey from being sent multiple times --- lib/model_patches.rb | 11 +++++++++-- spec/model_patches_spec.rb | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/model_patches.rb b/lib/model_patches.rb index b5ae9bbe..93d1da62 100644 --- a/lib/model_patches.rb +++ b/lib/model_patches.rb @@ -111,10 +111,15 @@ def alert_survey " )" ).includes(:user) + # TODO: change the initial query to iterate over users rather + # than info_requests rather than using an array to check whether + # we're about to send multiple emails to the same user_id + sent_to = [] for info_request in info_requests - # Exclude users who have already completed the survey + # Exclude users who have already completed the survey or + # have already been sent a survey email in this run logger.debug "[alert_survey] Considering #{info_request.user.url_name}" - next if info_request.user.survey.already_done? + next if info_request.user.survey.already_done? || sent_to.include?(info_request.user_id) store_sent = UserInfoRequestSentAlert.new store_sent.info_request = info_request @@ -122,6 +127,8 @@ def alert_survey store_sent.alert_type = 'survey_1' store_sent.info_request_event_id = info_request.info_request_events[0].id + sent_to << info_request.user_id + RequestMailer.survey_alert(info_request).deliver store_sent.save! end diff --git a/spec/model_patches_spec.rb b/spec/model_patches_spec.rb index ae9f1035..90d38de7 100644 --- a/spec/model_patches_spec.rb +++ b/spec/model_patches_spec.rb @@ -21,8 +21,12 @@ ActionMailer::Base.deliveries = [] end - def get_surveyable_request - info_request = FactoryGirl.create(:info_request) + def get_surveyable_request(user=nil) + info_request = if user + FactoryGirl.create(:info_request, :user => user) + else + FactoryGirl.create(:info_request) + end info_request.created_at = Time.now - (2.weeks + 1.hour) info_request.save! info_request @@ -79,6 +83,19 @@ def get_surveyable_request expect(ActionMailer::Base.deliveries.size).to eq(0) end end + + context 'when a user has made multiple qualifying requests' do + + it 'does not send multiple alerts' do + allow_any_instance_of(User).to receive(:survey). + and_return(double('survey', :already_done? => false)) + request = get_surveyable_request + get_surveyable_request(request.user) + RequestMailer.alert_new_response_reminders + expect(ActionMailer::Base.deliveries.size).to eq(1) + end + end + end context 'when SEND_SURVEY_MAILS is not set' do