diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 370bd721aea..427e9b3fe8e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -886,6 +886,7 @@ lib/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be lib/decision_review_v1 @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group lib/dependents @department-of-veterans-affairs/benefits-dependents-management @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group lib/disability_compensation @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/dbex-trex @department-of-veterans-affairs/benefits-disability-2 +lib/disability_max_ratings @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-vro-engineers @department-of-veterans-affairs/benefits-employee-exp-engineers lib/efolder @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group lib/efolder/service.rb @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group lib/evss/auth_headers.rb @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group @@ -1455,6 +1456,7 @@ spec/lib/decision_review @department-of-veterans-affairs/benefits-decision-revie spec/lib/decision_review_v1 @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/lib/dependents/monitor_spec.rb @department-of-veterans-affairs/benefits-dependents-management @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/lib/disability_compensation @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group +spec/lib/disability_max_ratings @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-vro-engineers @department-of-veterans-affairs/benefits-employee-exp-engineers spec/lib/efolder/service_spec.rb @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group spec/lib/evss/auth_headers_spec.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/lib/evss/common_service_spec.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @@ -2092,6 +2094,7 @@ spec/support/vcr_cassettes/cypress_viewport_updater @department-of-veterans-affa spec/support/vcr_cassettes/debts @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group spec/support/vcr_cassettes/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/support/vcr_cassettes/dgi @department-of-veterans-affairs/my-education-benefits @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group +spec/support/vcr_cassettes/disability_max_ratings @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-vro-engineers @department-of-veterans-affairs/benefits-employee-exp-engineers spec/support/vcr_cassettes/dmc @department-of-veterans-affairs/vsa-debt-resolution spec/support/vcr_cassettes/dmc/download_pdf.yml @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/support/vcr_cassettes/dmc/submit_to_vbs.yml @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/va-api-engineers diff --git a/app/services/claim_fast_tracking/max_rating_annotator.rb b/app/services/claim_fast_tracking/max_rating_annotator.rb index 47272548f68..952ccaf3a03 100644 --- a/app/services/claim_fast_tracking/max_rating_annotator.rb +++ b/app/services/claim_fast_tracking/max_rating_annotator.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'virtual_regional_office/client' +require 'disability_max_ratings/client' module ClaimFastTracking class MaxRatingAnnotator @@ -58,13 +59,16 @@ def self.diagnostic_code_type(rated_disability) def self.get_ratings(diagnostic_codes, user) if Flipper.enabled?(:disability_526_max_cfi_service_switch, user) - Rails.logger.info('New Max Ratings service triggered by feature flag, but implementation is pending') - # TODO: Handle the new logic for max ratings when switching to the new service + disability_max_ratings_client = DisabilityMaxRatings::Client.new + response = disability_max_ratings_client.post_for_max_ratings(diagnostic_codes) else vro_client = VirtualRegionalOffice::Client.new response = vro_client.get_max_rating_for_diagnostic_codes(diagnostic_codes) - response.body['ratings'] end + response.body['ratings'] + rescue Faraday::TimeoutError + Rails.logger.error 'Get Max Ratings Failed: Request timed out.' + nil rescue Common::Client::Errors::ClientError => e Rails.logger.error "Get Max Ratings Failed #{e.message}.", backtrace: e.backtrace nil diff --git a/config/features.yml b/config/features.yml index fa1b5f5f82b..321863c2ba2 100644 --- a/config/features.yml +++ b/config/features.yml @@ -537,6 +537,7 @@ features: disability_526_max_cfi_service_switch: actor_type: user description: Enables the use of the new Max Ratings CFI service instead of the VRO client for fetching max ratings. + enable_in_development: true disability_compensation_flashes: actor_type: user description: enables sending flashes to BGS for disability_compensation submissions. diff --git a/config/settings.yml b/config/settings.yml index a87ff5f1fa8..6fe4bd7907a 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -1513,6 +1513,12 @@ virtual_regional_office: expanded_classification_path: contention-classification/expanded-contention-classification max_cfi_path: employee-experience/max-ratings +disability_max_ratings_api: + url: http://disability-max-ratings-api-dev.vfs.va.gov + ratings_path: /disability-max-ratings + open_timeout: 5 + read_timeout: 10 + # Settings for Test User Dashboard modules test_user_dashboard: env: dev diff --git a/lib/disability_max_ratings/client.rb b/lib/disability_max_ratings/client.rb new file mode 100644 index 00000000000..293279c5e80 --- /dev/null +++ b/lib/disability_max_ratings/client.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'disability_max_ratings/configuration' + +module DisabilityMaxRatings + class Client < Common::Client::Base + include Common::Client::Concerns::Monitoring + configuration DisabilityMaxRatings::Configuration + + STATSD_KEY_PREFIX = 'api.disability_max_ratings' + + def post_for_max_ratings(diagnostic_codes_array) + with_monitoring do + params = { diagnostic_codes: diagnostic_codes_array } + perform(:post, Settings.disability_max_ratings_api.ratings_path, params.to_json, headers_hash) + end + end + + private + + def headers_hash + { + 'Content-Type': 'application/json' + } + end + end +end diff --git a/lib/disability_max_ratings/configuration.rb b/lib/disability_max_ratings/configuration.rb new file mode 100644 index 00000000000..ecc801d1124 --- /dev/null +++ b/lib/disability_max_ratings/configuration.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'common/client/configuration/rest' +require 'common/client/middleware/response/raise_custom_error' + +module DisabilityMaxRatings + class Configuration < Common::Client::Configuration::REST + self.open_timeout = Settings.disability_max_ratings_api.open_timeout + self.read_timeout = Settings.disability_max_ratings_api.read_timeout + + def base_path + Settings.disability_max_ratings_api.url.to_s + end + + def service_name + 'DisabilityMaxRatingsApiClient' + end + + def connection + Faraday.new(base_path, headers: base_request_headers, request: request_options) do |faraday| + faraday.use :breakers + faraday.use Faraday::Response::RaiseError + faraday.response :json, content_type: /\bjson/ + faraday.adapter Faraday.default_adapter + end + end + end +end diff --git a/spec/lib/disability_max_ratings/client_spec.rb b/spec/lib/disability_max_ratings/client_spec.rb new file mode 100644 index 00000000000..7faa5be7dfe --- /dev/null +++ b/spec/lib/disability_max_ratings/client_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' +require 'disability_max_ratings/client' + +RSpec.describe DisabilityMaxRatings::Client do + let(:client) { DisabilityMaxRatings::Client.new } + let(:max_ratings_params) { { diagnostic_codes: [1234] } } + + describe 'making max rating requests' do + subject { client.post_for_max_ratings(max_ratings_params[:diagnostic_codes]) } + + context 'valid requests' do + describe 'when requesting max ratings' do + let(:generic_response) do + double( + 'disability max ratings response', status: 200, + body: { + ratings: [ + diagnostic_code: 1234, max_rating: 100 + ] + }.as_json + ) + end + + before do + allow(client).to receive(:perform).and_return(generic_response) + end + + it 'returns the API response' do + expect(subject).to eq generic_response + end + end + end + + context 'unsuccessful requests' do + let(:error_state) do + double( + 'disability max ratings response', status: 404, + body: { message: 'Something went wrong.' }.as_json + ) + end + + before do + allow(client).to receive(:perform).and_return(error_state) + end + + it 'handles an error' do + expect(subject).to eq error_state + end + end + end +end diff --git a/spec/lib/disability_max_ratings/configuration_spec.rb b/spec/lib/disability_max_ratings/configuration_spec.rb new file mode 100644 index 00000000000..735cc1dc20c --- /dev/null +++ b/spec/lib/disability_max_ratings/configuration_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' +require 'disability_max_ratings/configuration' + +RSpec.describe DisabilityMaxRatings::Configuration do + subject { described_class.send(:new) } + + describe '#base_path' do + it 'returns the correct base URL from the settings' do + expect(subject.base_path).to eq(Settings.disability_max_ratings_api.url.to_s) + end + end + + describe '#service_name' do + it 'returns the DisabilityMaxRatingsApiClient service name' do + expect(subject.service_name).to eq('DisabilityMaxRatingsApiClient') + end + end + + describe '#connection' do + it 'includes the correct middleware' do + connection = subject.connection + + expect(connection.builder.handlers).to include(Faraday::Response::RaiseError) + expect(connection.builder.handlers).to include(Faraday::Response::Json) + end + end +end diff --git a/spec/models/form_profile_spec.rb b/spec/models/form_profile_spec.rb index fa692999c3d..00cff037de0 100644 --- a/spec/models/form_profile_spec.rb +++ b/spec/models/form_profile_spec.rb @@ -11,13 +11,15 @@ let(:user) { build(:user, :loa3, suffix: 'Jr.', address: build(:mpi_profile_address)) } before do - Flipper.disable(:remove_pciu) stub_evss_pciu(user) described_class.instance_variable_set(:@mappings, nil) - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:remove_pciu) - Flipper.disable('remove_pciu_2') - Flipper.disable(ApiProviderFactory::FEATURE_TOGGLE_PPIU_DIRECT_DEPOSIT) + allow(Flipper).to receive(:enabled?).and_call_original + allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, anything).and_return(false) + allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, anything) + .and_return(false) + allow(Flipper).to receive(:enabled?).with(ApiProviderFactory::FEATURE_TOGGLE_PPIU_DIRECT_DEPOSIT, + anything).and_return(false) end let(:street_check) { build(:street_check) } @@ -1830,8 +1832,15 @@ def expect_prefilled(form_id) end it 'returns prefilled 21-526EZ' do - Flipper.disable(ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND) - Flipper.disable(:disability_compensation_remove_pciu) + allow(Flipper).to receive(:enabled?) + .with( + ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything + ) + .and_return(false) + + allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, + anything).and_return(false) VCR.use_cassette('evss/pciu_address/address_domestic') do VCR.use_cassette('evss/disability_compensation_form/rated_disabilities') do VCR.use_cassette('evss/ppiu/payment_information') do @@ -1845,6 +1854,31 @@ def expect_prefilled(form_id) end end end + + it 'returns prefilled 21-526EZ when disability_526_max_cfi_service_switch is enabled' do + allow(Flipper).to receive(:enabled?) + .with( + ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything + ) + .and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, + anything).and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, + anything).and_return(true) + VCR.use_cassette('evss/pciu_address/address_domestic') do + VCR.use_cassette('evss/disability_compensation_form/rated_disabilities') do + VCR.use_cassette('evss/ppiu/payment_information') do + VCR.use_cassette('va_profile/military_personnel/service_history_200_many_episodes', + allow_playback_repeats: true, match_requests_on: %i[uri method body]) do + VCR.use_cassette('/disability-max-ratings/max_ratings') do + expect_prefilled('21-526EZ') + end + end + end + end + end + end end end @@ -1863,7 +1897,12 @@ def expect_prefilled(form_id) end it 'returns prefilled 21-526EZ' do - Flipper.disable(ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND) + allow(Flipper).to receive(:enabled?) + .with( + ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything + ) + .and_return(false) expect(user).to receive(:authorize).with(:ppiu, :access?).and_return(true).at_least(:once) expect(user).to receive(:authorize).with(:evss, :access?).and_return(true).at_least(:once) expect(user).to receive(:authorize).with(:va_profile, :access_to_v2?).and_return(true).at_least(:once) @@ -1880,6 +1919,32 @@ def expect_prefilled(form_id) end end end + + it 'returns prefilled 21-526EZ when disability_526_max_cfi_service_switch is enabled' do + allow(Flipper).to receive(:enabled?) + .with( + ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything + ) + .and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, + anything).and_return(true) + expect(user).to receive(:authorize).with(:ppiu, :access?).and_return(true).at_least(:once) + expect(user).to receive(:authorize).with(:evss, :access?).and_return(true).at_least(:once) + expect(user).to receive(:authorize).with(:va_profile, :access_to_v2?).and_return(true).at_least(:once) + VCR.use_cassette('evss/pciu_address/address_domestic') do + VCR.use_cassette('evss/disability_compensation_form/rated_disabilities') do + VCR.use_cassette('evss/ppiu/payment_information') do + VCR.use_cassette('va_profile/military_personnel/service_history_200_many_episodes', + allow_playback_repeats: true, match_requests_on: %i[uri method body]) do + VCR.use_cassette('/disability-max-ratings/max_ratings') do + expect_prefilled('21-526EZ') + end + end + end + end + end + end end it 'returns prefilled 21-686C' do diff --git a/spec/models/form_profile_v2_spec.rb b/spec/models/form_profile_v2_spec.rb index d341ad7ba12..bcd81e52f8b 100644 --- a/spec/models/form_profile_v2_spec.rb +++ b/spec/models/form_profile_v2_spec.rb @@ -9,18 +9,14 @@ include SchemaMatchers before do - Flipper.enable(:remove_pciu) - Flipper.enable(:va_v3_contact_information_service) - Flipper.enable(:disability_compensation_remove_pciu) + allow(Flipper).to receive(:enabled?).and_call_original + allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(true) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, anything).and_return(false) + allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, anything).and_return(true) + allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, anything).and_return(true) described_class.instance_variable_set(:@mappings, nil) - Flipper.disable(:disability_526_toxic_exposure) - Flipper.disable(ApiProviderFactory::FEATURE_TOGGLE_PPIU_DIRECT_DEPOSIT) - end - - after do - Flipper.disable(:remove_pciu) - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:disability_compensation_remove_pciu) + allow(Flipper).to receive(:enabled?).with(ApiProviderFactory::FEATURE_TOGGLE_PPIU_DIRECT_DEPOSIT, + anything).and_return(false) end let(:user) { build(:user, :loa3, suffix: 'Jr.', address: build(:va_profile_v3_address), vet360_id: '1781151') } @@ -1527,7 +1523,7 @@ def expect_prefilled(form_id) FORM-MOCK-AE-DESIGN-PATTERNS ].each do |form_id| it "returns prefilled #{form_id}" do - Flipper.disable(:pension_military_prefill) + allow(Flipper).to receive(:enabled?).with(:pension_military_prefill, anything).and_return(false) VCR.use_cassette('va_profile/military_personnel/service_history_200_many_episodes', allow_playback_repeats: true, match_requests_on: %i[uri method body]) do expect_prefilled(form_id) @@ -1537,7 +1533,7 @@ def expect_prefilled(form_id) context 'with pension_military_prefill' do it 'returns prefilled 21P-527EZ' do - Flipper.enable(:pension_military_prefill) + allow(Flipper).to receive(:enabled?).with(:pension_military_prefill, anything).and_return(true) VCR.use_cassette('va_profile/military_personnel/service_history_200_many_episodes', allow_playback_repeats: true, match_requests_on: %i[uri method body]) do form_id = '21P-527EZ' @@ -1581,9 +1577,9 @@ def expect_prefilled(form_id) VAProfile::Configuration::SETTINGS.prefill = false end - it 'returns prefilled 21-526EZ' do - Flipper.disable(ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND) - Flipper.enable(:disability_526_toxic_exposure, user) + it 'returns prefilled 21-526EZ when disability_526_max_cfi_service_switch is disabled' do + allow(Flipper).to receive(:enabled?).with(ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything).and_return(false) expect(user).to receive(:authorize).with(:ppiu, :access?).and_return(true).at_least(:once) expect(user).to receive(:authorize).with(:evss, :access?).and_return(true).at_least(:once) expect(user).to receive(:authorize).with(:va_profile, :access_to_v2?).and_return(true).at_least(:once) @@ -1600,6 +1596,28 @@ def expect_prefilled(form_id) end end end + + it 'returns prefilled 21-526EZ when disability_526_max_cfi_service_switch is enabled' do + allow(Flipper).to receive(:enabled?).with(ApiProviderFactory::FEATURE_TOGGLE_RATED_DISABILITIES_FOREGROUND, + anything).and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, anything).and_return(true) + + expect(user).to receive(:authorize).with(:ppiu, :access?).and_return(true).at_least(:once) + expect(user).to receive(:authorize).with(:evss, :access?).and_return(true).at_least(:once) + expect(user).to receive(:authorize).with(:va_profile, :access_to_v2?).and_return(true).at_least(:once) + VCR.use_cassette('va_profile/v2/contact_information/get_address') do + VCR.use_cassette('evss/disability_compensation_form/rated_disabilities') do + VCR.use_cassette('evss/ppiu/payment_information') do + VCR.use_cassette('va_profile/military_personnel/service_history_200_many_episodes', + allow_playback_repeats: true, match_requests_on: %i[uri method body]) do + VCR.use_cassette('disability-max-ratings/max_ratings') do + expect_prefilled('21-526EZ') + end + end + end + end + end + end end end end diff --git a/spec/services/claim_fast_tracking/max_rating_annotator_spec.rb b/spec/services/claim_fast_tracking/max_rating_annotator_spec.rb index b8eedef0c7e..13eeb542cfc 100644 --- a/spec/services/claim_fast_tracking/max_rating_annotator_spec.rb +++ b/spec/services/claim_fast_tracking/max_rating_annotator_spec.rb @@ -36,6 +36,17 @@ end end + context 'when a disabilities response does not contains rating any disability and feature flag is enabled' do + it 'shouldnt mutate any of the disabilities with a max rating when' do + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, user).and_return(true) + VCR.use_cassette('disability_max_ratings/max_ratings_none') do + subject + max_ratings = disabilities_response.rated_disabilities.map(&:maximum_rating_percentage) + expect(max_ratings).to eq([nil, nil, nil]) + end + end + end + context 'when a disabilities response contains rating for a single disability' do it 'mutates just the rated disability with a max rating' do VCR.use_cassette('virtual_regional_office/max_ratings') do @@ -234,11 +245,58 @@ allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, user).and_return(true) end - it 'logs a message indicating the new service is used' do - expect(Rails.logger).to receive(:info).with( - 'New Max Ratings service triggered by feature flag, but implementation is pending' + it 'calls the DisabilityMaxRating::Client to fetch multiple max ratings' do + VCR.use_cassette('disability_max_ratings/max_ratings_multiple') do + diagnostic_codes = [6260, 7101, 6204] + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to eq([ + { 'diagnostic_code' => 7101, 'max_rating' => 60.0 }, + { 'diagnostic_code' => 6260, 'max_rating' => 10.0 } + ]) + end + end + + it 'calls the DisabilityMaxRating::Client to fetch single max ratings' do + VCR.use_cassette('disability_max_ratings/max_ratings') do + diagnostic_codes = [6260] + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to eq([{ 'diagnostic_code' => 6260, 'max_rating' => 10.0 }]) + end + end + + it 'returns an empty array when no ratings are found' do + VCR.use_cassette('disability_max_ratings/max_ratings_none') do + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to eq([]) + end + end + + it 'logs an error when the DisabilityMaxRating client raises a ClientError' do + VCR.use_cassette('disability_max_ratings/max_ratings_failure') do + expect(Rails.logger).to receive(:error).with( + 'Get Max Ratings Failed the server responded with status 500.', + hash_including(:backtrace) + ) + + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to be_nil + end + end + end + + context 'when the API times out' do + before do + allow_any_instance_of(DisabilityMaxRatings::Client).to receive(:post_for_max_ratings) + .and_raise(Faraday::TimeoutError) + end + + it 'logs the timeout error and returns nil' do + expect(Rails.logger).to receive(:error).with( + 'Get Max Ratings Failed: Request timed out.' ) - described_class.send(:get_ratings, diagnostic_codes, user) + + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to be_nil end end @@ -247,30 +305,35 @@ allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, user).and_return(false) end - it 'calls the VRO client to fetch max ratings' do - vro_client = instance_double(VirtualRegionalOffice::Client) - response = double('response', body: { 'ratings' => [10, 20, 30] }) - - allow(VirtualRegionalOffice::Client).to receive(:new).and_return(vro_client) - allow(vro_client).to receive(:get_max_rating_for_diagnostic_codes).with(diagnostic_codes).and_return(response) + it 'calls the VRO client to fetch multiple max ratings' do + VCR.use_cassette('virtual_regional_office/max_ratings_multiple') do + diagnostic_codes = [6260, 7101, 6204] + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to eq([ + { 'diagnostic_code' => 7101, 'max_rating' => 60.0 }, + { 'diagnostic_code' => 6260, 'max_rating' => 10.0 } + ]) + end + end - result = described_class.send(:get_ratings, diagnostic_codes, user) - expect(result).to eq([10, 20, 30]) + it 'calls the VRO client to fetch single max ratings' do + VCR.use_cassette('virtual_regional_office/max_ratings') do + diagnostic_codes = [6260] + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to eq([{ 'diagnostic_code' => 6260, 'max_rating' => 10.0 }]) + end end it 'logs an error when the VRO client raises a ClientError' do - vro_client = instance_double(VirtualRegionalOffice::Client) - allow(VirtualRegionalOffice::Client).to receive(:new).and_return(vro_client) - allow(vro_client).to receive(:get_max_rating_for_diagnostic_codes).and_raise( - Common::Client::Errors::ClientError.new('Miserably') - ) - expect(Rails.logger).to receive(:error).with( - 'Get Max Ratings Failed Miserably.', - hash_including(:backtrace) - ) + VCR.use_cassette('virtual_regional_office/max_ratings_failure') do + expect(Rails.logger).to receive(:error).with( + 'Get Max Ratings Failed the server responded with status 500.', + hash_including(:backtrace) + ) - result = described_class.send(:get_ratings, diagnostic_codes, user) - expect(result).to be_nil + result = described_class.send(:get_ratings, diagnostic_codes, user) + expect(result).to be_nil + end end end end diff --git a/spec/support/vcr.rb b/spec/support/vcr.rb index 123828f85b6..60101a37b22 100644 --- a/spec/support/vcr.rb +++ b/spec/support/vcr.rb @@ -15,6 +15,7 @@ c.filter_sensitive_data('') { Settings.evss.url } c.filter_sensitive_data('') { Settings.evss.dvp.url } c.filter_sensitive_data('') { Faraday::Connection::USER_AGENT } + c.filter_sensitive_data('') { Settings.disability_max_ratings_api.url } c.filter_sensitive_data('') { Settings.gids.url } c.filter_sensitive_data('') { Settings.decision_review.api_key } c.filter_sensitive_data('') { Settings.lighthouse.facilities.api_key } diff --git a/spec/support/vcr_cassettes/disability_max_ratings/max_ratings.yml b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings.yml new file mode 100644 index 00000000000..8c8af26c053 --- /dev/null +++ b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: post + uri: /disability-max-ratings + body: + encoding: UTF-8 + string: '{"diagnostic_codes":[6260]}' + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - Vets.gov Agent + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 10 Aug 2023 19:52:23 GMT + Server: + - uvicorn + Content-Length: + - '56' + Content-Type: + - application/json + body: + encoding: UTF-8 + string: '{"ratings":[{"diagnostic_code":6260,"max_rating":10.0}]}' + recorded_at: Thu, 10 Aug 2023 19:52:24 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_failure.yml b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_failure.yml new file mode 100644 index 00000000000..09fb3d697b5 --- /dev/null +++ b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_failure.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: post + uri: /disability-max-ratings + body: + encoding: UTF-8 + string: '{"diagnostic_codes":[7101,6260,6204]}' + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - Vets.gov Agent + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 500 + message: Internal Server Error + headers: + Date: + - Thu, 10 Aug 2023 20:55:14 GMT + Server: + - uvicorn + Content-Length: + - '34' + Content-Type: + - application/json + body: + encoding: UTF-8 + string: '{"detail":"Internal Server Error"}' + recorded_at: Thu, 10 Aug 2023 20:55:14 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_multiple.yml b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_multiple.yml new file mode 100644 index 00000000000..a362928115a --- /dev/null +++ b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_multiple.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: post + uri: /disability-max-ratings + body: + encoding: UTF-8 + string: '{"diagnostic_codes":[6260,7101,6204]}' + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - Vets.gov Agent + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 10 Aug 2023 19:52:23 GMT + Server: + - uvicorn + Content-Length: + - '56' + Content-Type: + - application/json + body: + encoding: UTF-8 + string: '{"ratings":[{"diagnostic_code":7101, "max_rating": 60.0},{"diagnostic_code":6260,"max_rating":10.0}]}' + recorded_at: Thu, 10 Aug 2023 19:52:24 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_none.yml b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_none.yml new file mode 100644 index 00000000000..89853865e20 --- /dev/null +++ b/spec/support/vcr_cassettes/disability_max_ratings/max_ratings_none.yml @@ -0,0 +1,35 @@ +--- +http_interactions: +- request: + method: post + uri: /disability-max-ratings + body: + encoding: UTF-8 + string: '{"diagnostic_codes":[6260,7101,6204]}' + headers: + Accept: + - application/json + Content-Type: + - application/json + User-Agent: + - Vets.gov Agent + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 10 Aug 2023 19:52:23 GMT + Server: + - uvicorn + Content-Length: + - '56' + Content-Type: + - application/json + body: + encoding: UTF-8 + string: '{"ratings":[]}' + recorded_at: Thu, 10 Aug 2023 19:52:24 GMT +recorded_with: VCR 6.2.0