Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 22 additions & 21 deletions app/jobs/get_usps_proofing_results_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -433,40 +433,41 @@ 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)
{
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

Expand Down
68 changes: 43 additions & 25 deletions spec/jobs/get_usps_proofing_results_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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),
)
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand All @@ -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',
Expand All @@ -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
Expand All @@ -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(
Expand All @@ -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
Expand All @@ -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(
Expand All @@ -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
Expand All @@ -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(
Expand All @@ -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
Expand Down Expand Up @@ -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(
Expand Down