diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index c19e0fea8b2..992ec3a6ec9 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -403,7 +403,7 @@ def send_verified_email(user, enrollment) # rubocop:disable IdentityIdp/MailLaterLinter UserMailer.with(user: user, email_address: email_address).in_person_verified( enrollment: enrollment, - ).deliver_later(**mail_delivery_params(enrollment.proofed_at)) + ).deliver_later(**notification_delivery_params(enrollment)) # rubocop:enable IdentityIdp/MailLaterLinter end end @@ -423,7 +423,7 @@ def send_failed_email(user, enrollment) # rubocop:disable IdentityIdp/MailLaterLinter UserMailer.with(user: user, email_address: email_address).in_person_failed( enrollment: enrollment, - ).deliver_later(**mail_delivery_params(enrollment.proofed_at)) + ).deliver_later(**notification_delivery_params(enrollment)) # rubocop:enable IdentityIdp/MailLaterLinter end end @@ -433,32 +433,33 @@ def send_failed_fraud_email(user, enrollment) # rubocop:disable IdentityIdp/MailLaterLinter UserMailer.with(user: user, email_address: email_address).in_person_failed_fraud( enrollment: enrollment, - ).deliver_later(**mail_delivery_params(enrollment.proofed_at)) + ).deliver_later(**notification_delivery_params(enrollment)) # rubocop:enable IdentityIdp/MailLaterLinter end end - def mail_delivery_params(proofed_at) - return {} if proofed_at.blank? - mail_delay_hours = IdentityConfig.store.in_person_results_delay_in_hours || - DEFAULT_EMAIL_DELAY_IN_HOURS - wait_until = proofed_at + mail_delay_hours.hours - return {} if mail_delay_hours == 0 || wait_until < Time.zone.now - return { wait_until: wait_until, queue: :intentionally_delayed } - end - # enqueue sms notification job when it's expired or success # @param [InPersonEnrollment] enrollment def send_enrollment_status_sms_notification(enrollment:) - return unless IdentityConfig.store.in_person_send_proofing_notifications_enabled - return if enrollment&.proofed_at.blank? - sms_delay_hours = IdentityConfig.store.in_person_results_delay_in_hours || - DEFAULT_EMAIL_DELAY_IN_HOURS - wait_until = enrollment.proofed_at + sms_delay_hours - InPerson::SendProofingNotificationJob.set( - wait_until: wait_until, + if IdentityConfig.store.in_person_send_proofing_notifications_enabled + InPerson::SendProofingNotificationJob.set( + **notification_delivery_params(enrollment), + ).perform_later(enrollment.id) + end + end + + def notification_delivery_params(enrollment) + return {} unless enrollment.passed? || enrollment.failed? + + wait_until = enrollment.status_check_completed_at + ( + IdentityConfig.store.in_person_results_delay_in_hours || DEFAULT_EMAIL_DELAY_IN_HOURS + ).hours + return {} unless Time.zone.now < wait_until + + { + wait_until:, queue: :intentionally_delayed, - ).perform_later(enrollment.id) + } end def email_analytics_attributes(enrollment) @@ -466,7 +467,7 @@ def email_analytics_attributes(enrollment) enrollment_code: enrollment.enrollment_code, timestamp: Time.zone.now, service_provider: enrollment.issuer, - wait_until: mail_delivery_params(enrollment.proofed_at)[:wait_until], + wait_until: notification_delivery_params(enrollment)[:wait_until], } end diff --git a/spec/jobs/get_usps_proofing_results_job_spec.rb b/spec/jobs/get_usps_proofing_results_job_spec.rb index 17b4ecfa25b..5e338b12d09 100644 --- a/spec/jobs/get_usps_proofing_results_job_spec.rb +++ b/spec/jobs/get_usps_proofing_results_job_spec.rb @@ -194,6 +194,8 @@ end before do + allow(IdentityConfig.store). + to(receive(:in_person_results_delay_in_hours).and_return(nil)) allow(Rails).to receive(:cache).and_return( ActiveSupport::Cache::RedisCacheStore.new(url: IdentityConfig.store.redis_throttle_url), ) @@ -493,7 +495,7 @@ end.to have_enqueued_mail(UserMailer, :in_person_deadline_passed).with( params: { user: user, email_address: user.email_addresses.first }, args: [{ enrollment: pending_enrollment }], - ).on_queue(:default) + ).at(:no_wait).on_queue(:default) pending_enrollment.reload expect(pending_enrollment.deadline_passed_sent).to be true expect(job_analytics).to have_logged_event( @@ -613,14 +615,12 @@ to(receive(:in_person_results_delay_in_hours).and_return(0)) user = pending_enrollment.user - freeze_time do - expect do - job.perform(Time.zone.now) - end.to have_enqueued_mail(UserMailer, :in_person_verified).with( - params: { user: user, email_address: user.email_addresses.first }, - args: [{ enrollment: pending_enrollment }], - ).on_queue(:default) - end + expect do + job.perform(Time.zone.now) + end.to have_enqueued_mail(UserMailer, :in_person_verified).with( + params: { user: user, email_address: user.email_addresses.first }, + args: [{ enrollment: pending_enrollment }], + ).at(:no_wait).on_queue(:default) end end end @@ -639,13 +639,17 @@ request_passed_proofing_results_response, ) - it 'logs details about the success' do + it 'invokes the SendProofingNotificationJob and logs details about the success' do allow(IdentityConfig.store).to receive(:in_person_send_proofing_notifications_enabled). and_return(true) - expect do - job.perform(Time.zone.now) - end.to have_enqueued_job(InPerson::SendProofingNotificationJob). - with(pending_enrollment.id).on_queue(:intentionally_delayed) + expected_wait_until = nil + freeze_time do + expected_wait_until = 1.hour.from_now + expect do + job.perform(Time.zone.now) + end.to have_enqueued_job(InPerson::SendProofingNotificationJob). + with(pending_enrollment.id).at(expected_wait_until).on_queue(:intentionally_delayed) + end expect(pending_enrollment.proofed_at).to eq(transaction_end_date_time) expect(job_analytics).to have_logged_event( 'GetUspsProofingResultsJob: Enrollment status updated', @@ -661,7 +665,7 @@ enrollment_code: pending_enrollment.enrollment_code, service_provider: anything, timestamp: anything, - wait_until: nil, + wait_until: expected_wait_until, job_name: 'GetUspsProofingResultsJob', ) end @@ -682,7 +686,11 @@ ) it 'logs failure details' do - job.perform(Time.zone.now) + expected_wait_until = nil + freeze_time do + expected_wait_until = 1.hour.from_now + job.perform(Time.zone.now) + end expect(pending_enrollment.proofed_at).to eq(transaction_end_date_time) expect(job_analytics).to have_logged_event( @@ -699,7 +707,7 @@ enrollment_code: pending_enrollment.enrollment_code, service_provider: anything, timestamp: anything, - wait_until: nil, + wait_until: expected_wait_until, job_name: 'GetUspsProofingResultsJob', ) end @@ -720,7 +728,11 @@ ) it 'logs fraud failure details' do - job.perform(Time.zone.now) + expected_wait_until = nil + freeze_time do + expected_wait_until = 1.hour.from_now + job.perform(Time.zone.now) + end expect(pending_enrollment.proofed_at).to eq(transaction_end_date_time) expect(job_analytics).to have_logged_event( @@ -738,7 +750,7 @@ enrollment_code: pending_enrollment.enrollment_code, service_provider: anything, timestamp: anything, - wait_until: nil, + wait_until: expected_wait_until, job_name: 'GetUspsProofingResultsJob', ) end @@ -759,7 +771,11 @@ ) it 'logs a message about the unsupported ID' do - job.perform Time.zone.now + expected_wait_until = nil + freeze_time do + expected_wait_until = 1.hour.from_now + job.perform Time.zone.now + end expect(pending_enrollment.proofed_at).to eq(transaction_end_date_time) expect(job_analytics).to have_logged_event( @@ -777,7 +793,7 @@ enrollment_code: pending_enrollment.enrollment_code, service_provider: anything, timestamp: anything, - wait_until: nil, + wait_until: expected_wait_until, job_name: 'GetUspsProofingResultsJob', ) end @@ -1138,10 +1154,12 @@ it 'logs a message about enrollment with secondary ID' do allow(IdentityConfig.store).to receive(:in_person_send_proofing_notifications_enabled). and_return(true) - expect do - job.perform Time.zone.now - end.to have_enqueued_job(InPerson::SendProofingNotificationJob). - with(pending_enrollment.id).on_queue(:intentionally_delayed) + freeze_time do + expect do + job.perform Time.zone.now + end.to have_enqueued_job(InPerson::SendProofingNotificationJob). + with(pending_enrollment.id).at(1.hour.from_now).on_queue(:intentionally_delayed) + end expect(pending_enrollment.proofed_at).to eq(transaction_end_date_time) expect(pending_enrollment.profile.active).to eq(false) expect(job_analytics).to have_logged_event(