diff --git a/app/jobs/get_usps_proofing_results_job.rb b/app/jobs/get_usps_proofing_results_job.rb index a43c6a0bf12..bea11b68d04 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_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' @@ -68,9 +69,11 @@ def perform(_now) DEFAULT_EMAIL_DELAY_IN_HOURS = 1 def check_enrollments(enrollments) + request_delay_in_seconds = IdentityConfig.store. + get_usps_proofing_results_job_request_delay_milliseconds / MILLISECONDS_PER_SECOND 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 +97,9 @@ 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 + sleep request_delay_in_seconds if idx < enrollments.length - 1 end end diff --git a/config/application.yml.default b/config/application.yml.default index 756ed2a4e79..47ddc1671ed 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_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 6966ba7ae9c..8edc83c4820 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_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 4fba546d105..82a6390ffb2 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_ms) { 0 } let(:job) { GetUspsProofingResultsJob.new } let(:job_analytics) { FakeAnalytics.new } @@ -87,6 +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_milliseconds). + and_return(request_delay_ms) stub_request_token end @@ -205,6 +209,20 @@ ).to be >= 0.0 end + context 'with a request delay in ms' do + let(:request_delay_ms) { 750 } + + 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 it 'generates a backwards-compatible unique ID' do pending_enrollment.update(unique_id: nil)