From c51583a12ae1241012d471a6485a008be07ce9e8 Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Wed, 14 Sep 2022 10:03:51 -0400 Subject: [PATCH 1/7] Add delay between polling requests to USPS --- app/jobs/get_usps_proofing_results_job.rb | 6 +++++- config/application.yml.default | 1 + lib/identity_config.rb | 1 + spec/jobs/get_usps_proofing_results_job_spec.rb | 13 +++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index a43c6a0bf12..12c8b61647d 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -70,7 +70,7 @@ def perform(_now) def check_enrollments(enrollments) proofer = UspsInPersonProofing::Proofer.new - enrollments.each do |enrollment| + enrollments.each_with_index do |enrollment, idx| # Add a unique ID for enrollments that don't have one enrollment.update(unique_id: enrollment.usps_unique_id) if enrollment.unique_id.blank? @@ -94,6 +94,10 @@ def check_enrollments(enrollments) # Record the attempt to update the enrollment enrollment.update(status_check_attempted_at: status_check_attempted_at) + + # Sleep for a while before we attempt to make another call to USPS + request_delay = IdentityConfig.store.get_usps_proofing_results_job_request_delay_seconds + sleep request_delay if idx < enrollments.length - 1 end end diff --git a/config/application.yml.default b/config/application.yml.default index 756ed2a4e79..0dc89f5a87a 100644 --- a/config/application.yml.default +++ b/config/application.yml.default @@ -289,6 +289,7 @@ usps_ipp_username: '' usps_mock_fallback: true get_usps_proofing_results_job_cron: '0/10 * * * *' get_usps_proofing_results_job_reprocess_delay_minutes: 5 +get_usps_proofing_results_job_request_delay_seconds: 1 gpo_allowed_for_strict_ial2: true voice_otp_pause_time: '0.5s' voice_otp_speech_rate: 'slow' diff --git a/lib/identity_config.rb b/lib/identity_config.rb index 6966ba7ae9c..38042c4a2c8 100644 --- a/lib/identity_config.rb +++ b/lib/identity_config.rb @@ -376,6 +376,7 @@ def self.build_store(config_map) config.add(:usps_upload_enabled, type: :boolean) config.add(:get_usps_proofing_results_job_cron, type: :string) config.add(:get_usps_proofing_results_job_reprocess_delay_minutes, type: :integer) + config.add(:get_usps_proofing_results_job_request_delay_seconds, type: :integer) config.add(:gpo_allowed_for_strict_ial2, type: :boolean) config.add(:usps_upload_sftp_directory, type: :string) config.add(:usps_upload_sftp_host, type: :string) diff --git a/spec/jobs/get_usps_proofing_results_job_spec.rb b/spec/jobs/get_usps_proofing_results_job_spec.rb index 4fba546d105..776a8446fe0 100644 --- a/spec/jobs/get_usps_proofing_results_job_spec.rb +++ b/spec/jobs/get_usps_proofing_results_job_spec.rb @@ -80,6 +80,7 @@ include UspsIppHelper let(:reprocess_delay_minutes) { 2.0 } + let(:request_delay_seconds) { 0 } let(:job) { GetUspsProofingResultsJob.new } let(:job_analytics) { FakeAnalytics.new } @@ -87,6 +88,8 @@ allow(job).to receive(:analytics).and_return(job_analytics) allow(IdentityConfig.store).to receive(:get_usps_proofing_results_job_reprocess_delay_minutes). and_return(reprocess_delay_minutes) + allow(IdentityConfig.store).to receive(:get_usps_proofing_results_job_request_delay_seconds). + and_return(request_delay_seconds) stub_request_token end @@ -205,6 +208,16 @@ ).to be >= 0.0 end + it 'adds a delay between requests to USPS' do + allow(InPersonEnrollment).to receive(:needs_usps_status_check). + and_return(pending_enrollments) + stub_request_passed_proofing_results + expect(job).to receive(:sleep).exactly(pending_enrollments.length - 1).times. + with(request_delay_seconds) + + job.perform(Time.zone.now) + end + context 'when an enrollment does not have a unique ID' do it 'generates a backwards-compatible unique ID' do pending_enrollment.update(unique_id: nil) From 48d89f2314b1915c0fc8d13f2b5662494de1f694 Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Wed, 14 Sep 2022 13:22:59 -0400 Subject: [PATCH 2/7] Switch to ms. Move variable out of loop scope --- app/jobs/get_usps_proofing_results_job.rb | 4 ++-- config/application.yml.default | 2 +- lib/identity_config.rb | 2 +- spec/jobs/get_usps_proofing_results_job_spec.rb | 9 +++++---- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index 12c8b61647d..474127b7e04 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -68,6 +68,7 @@ def perform(_now) DEFAULT_EMAIL_DELAY_IN_HOURS = 1 def check_enrollments(enrollments) + request_delay_ms = IdentityConfig.store.get_usps_proofing_results_job_request_delay_milliseconds proofer = UspsInPersonProofing::Proofer.new enrollments.each_with_index do |enrollment, idx| @@ -96,8 +97,7 @@ def check_enrollments(enrollments) enrollment.update(status_check_attempted_at: status_check_attempted_at) # Sleep for a while before we attempt to make another call to USPS - request_delay = IdentityConfig.store.get_usps_proofing_results_job_request_delay_seconds - sleep request_delay if idx < enrollments.length - 1 + sleep request_delay_ms if idx < enrollments.length - 1 end end diff --git a/config/application.yml.default b/config/application.yml.default index 0dc89f5a87a..47ddc1671ed 100644 --- a/config/application.yml.default +++ b/config/application.yml.default @@ -289,7 +289,7 @@ usps_ipp_username: '' usps_mock_fallback: true get_usps_proofing_results_job_cron: '0/10 * * * *' get_usps_proofing_results_job_reprocess_delay_minutes: 5 -get_usps_proofing_results_job_request_delay_seconds: 1 +get_usps_proofing_results_job_request_delay_milliseconds: 1000 gpo_allowed_for_strict_ial2: true voice_otp_pause_time: '0.5s' voice_otp_speech_rate: 'slow' diff --git a/lib/identity_config.rb b/lib/identity_config.rb index 38042c4a2c8..8edc83c4820 100644 --- a/lib/identity_config.rb +++ b/lib/identity_config.rb @@ -376,7 +376,7 @@ def self.build_store(config_map) config.add(:usps_upload_enabled, type: :boolean) config.add(:get_usps_proofing_results_job_cron, type: :string) config.add(:get_usps_proofing_results_job_reprocess_delay_minutes, type: :integer) - config.add(:get_usps_proofing_results_job_request_delay_seconds, type: :integer) + config.add(:get_usps_proofing_results_job_request_delay_milliseconds, type: :integer) config.add(:gpo_allowed_for_strict_ial2, type: :boolean) config.add(:usps_upload_sftp_directory, type: :string) config.add(:usps_upload_sftp_host, type: :string) diff --git a/spec/jobs/get_usps_proofing_results_job_spec.rb b/spec/jobs/get_usps_proofing_results_job_spec.rb index 776a8446fe0..25c9f869f19 100644 --- a/spec/jobs/get_usps_proofing_results_job_spec.rb +++ b/spec/jobs/get_usps_proofing_results_job_spec.rb @@ -80,7 +80,7 @@ include UspsIppHelper let(:reprocess_delay_minutes) { 2.0 } - let(:request_delay_seconds) { 0 } + let(:request_delay_ms) { 0 } let(:job) { GetUspsProofingResultsJob.new } let(:job_analytics) { FakeAnalytics.new } @@ -88,8 +88,9 @@ allow(job).to receive(:analytics).and_return(job_analytics) allow(IdentityConfig.store).to receive(:get_usps_proofing_results_job_reprocess_delay_minutes). and_return(reprocess_delay_minutes) - allow(IdentityConfig.store).to receive(:get_usps_proofing_results_job_request_delay_seconds). - and_return(request_delay_seconds) + allow(IdentityConfig.store). + to receive(:get_usps_proofing_results_job_request_delay_milliseconds). + and_return(request_delay_ms) stub_request_token end @@ -213,7 +214,7 @@ and_return(pending_enrollments) stub_request_passed_proofing_results expect(job).to receive(:sleep).exactly(pending_enrollments.length - 1).times. - with(request_delay_seconds) + with(request_delay_ms) job.perform(Time.zone.now) end From 647da9e431c00db4b99ebb649dab137e156d0d96 Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Thu, 15 Sep 2022 10:50:13 -0400 Subject: [PATCH 3/7] changelog: Upcoming Features, In-person proofing, add a configurable delay between usps status checks From e041d058a8a2e22b5ec8ad7319ec1cdc4715b6bc Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Thu, 15 Sep 2022 11:09:01 -0400 Subject: [PATCH 4/7] Convert ms to seconds --- app/jobs/get_usps_proofing_results_job.rb | 4 +++- .../jobs/get_usps_proofing_results_job_spec.rb | 18 +++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index 474127b7e04..a94a8f27686 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -1,4 +1,5 @@ class GetUspsProofingResultsJob < ApplicationJob + MILLISECONDS_IN_SECONDS = 1000.0 # Specify float value to use floating point math IPP_STATUS_PASSED = 'In-person passed' IPP_STATUS_FAILED = 'In-person failed' IPP_INCOMPLETE_ERROR_MESSAGE = 'Customer has not been to a post office to complete IPP' @@ -68,7 +69,8 @@ def perform(_now) DEFAULT_EMAIL_DELAY_IN_HOURS = 1 def check_enrollments(enrollments) - request_delay_ms = IdentityConfig.store.get_usps_proofing_results_job_request_delay_milliseconds + request_delay_ms = IdentityConfig.store. + get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_IN_SECONDS proofer = UspsInPersonProofing::Proofer.new enrollments.each_with_index do |enrollment, idx| diff --git a/spec/jobs/get_usps_proofing_results_job_spec.rb b/spec/jobs/get_usps_proofing_results_job_spec.rb index 25c9f869f19..82a6390ffb2 100644 --- a/spec/jobs/get_usps_proofing_results_job_spec.rb +++ b/spec/jobs/get_usps_proofing_results_job_spec.rb @@ -209,14 +209,18 @@ ).to be >= 0.0 end - it 'adds a delay between requests to USPS' do - allow(InPersonEnrollment).to receive(:needs_usps_status_check). - and_return(pending_enrollments) - stub_request_passed_proofing_results - expect(job).to receive(:sleep).exactly(pending_enrollments.length - 1).times. - with(request_delay_ms) + context 'with a request delay in ms' do + let(:request_delay_ms) { 750 } - job.perform(Time.zone.now) + it 'adds a delay between requests to USPS' do + allow(InPersonEnrollment).to receive(:needs_usps_status_check). + and_return(pending_enrollments) + stub_request_passed_proofing_results + expect(job).to receive(:sleep).exactly(pending_enrollments.length - 1).times. + with(0.75) + + job.perform(Time.zone.now) + end end context 'when an enrollment does not have a unique ID' do From aee9a3901fc54011efec09aa5b1856f6888d9e43 Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Thu, 15 Sep 2022 11:11:39 -0400 Subject: [PATCH 5/7] Use a better variable name --- app/jobs/get_usps_proofing_results_job.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index a94a8f27686..cf6d0f2d982 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -1,5 +1,5 @@ class GetUspsProofingResultsJob < ApplicationJob - MILLISECONDS_IN_SECONDS = 1000.0 # Specify float value to use floating point math + MILLISECONDS_PER_SECOND = 1000.0 # Specify float value to use floating point math IPP_STATUS_PASSED = 'In-person passed' IPP_STATUS_FAILED = 'In-person failed' IPP_INCOMPLETE_ERROR_MESSAGE = 'Customer has not been to a post office to complete IPP' @@ -70,7 +70,7 @@ def perform(_now) def check_enrollments(enrollments) request_delay_ms = IdentityConfig.store. - get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_IN_SECONDS + get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_PER_SECOND proofer = UspsInPersonProofing::Proofer.new enrollments.each_with_index do |enrollment, idx| From e5dcad974fb91a27928729f3aed1c2ef044d747f Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Thu, 15 Sep 2022 11:32:51 -0400 Subject: [PATCH 6/7] Better variable name --- app/jobs/get_usps_proofing_results_job.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index cf6d0f2d982..7b360513a10 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -69,7 +69,7 @@ def perform(_now) DEFAULT_EMAIL_DELAY_IN_HOURS = 1 def check_enrollments(enrollments) - request_delay_ms = IdentityConfig.store. + request_delay_seconds = IdentityConfig.store. get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_PER_SECOND proofer = UspsInPersonProofing::Proofer.new @@ -99,7 +99,7 @@ def check_enrollments(enrollments) enrollment.update(status_check_attempted_at: status_check_attempted_at) # Sleep for a while before we attempt to make another call to USPS - sleep request_delay_ms if idx < enrollments.length - 1 + sleep request_delay_seconds if idx < enrollments.length - 1 end end From e4d180ecfcdc4992d21dca473f7c442dae60b3ef Mon Sep 17 00:00:00 2001 From: Sheldon Bachstein Date: Thu, 15 Sep 2022 11:36:23 -0400 Subject: [PATCH 7/7] Better variable name again --- app/jobs/get_usps_proofing_results_job.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index 7b360513a10..bea11b68d04 100644 --- a/app/jobs/get_usps_proofing_results_job.rb +++ b/app/jobs/get_usps_proofing_results_job.rb @@ -69,7 +69,7 @@ def perform(_now) DEFAULT_EMAIL_DELAY_IN_HOURS = 1 def check_enrollments(enrollments) - request_delay_seconds = IdentityConfig.store. + request_delay_in_seconds = IdentityConfig.store. get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_PER_SECOND proofer = UspsInPersonProofing::Proofer.new @@ -99,7 +99,7 @@ def check_enrollments(enrollments) enrollment.update(status_check_attempted_at: status_check_attempted_at) # Sleep for a while before we attempt to make another call to USPS - sleep request_delay_seconds if idx < enrollments.length - 1 + sleep request_delay_in_seconds if idx < enrollments.length - 1 end end