From e06e32238c1b4c32f21f1d5ded92df62d01cb9c3 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Thu, 2 May 2019 09:24:22 +0000 Subject: [PATCH] api_entreprise: display a specific error message on network errors --- app/controllers/champs/siret_controller.rb | 48 +++++++++++-------- app/controllers/users/dossiers_controller.rb | 6 ++- app/jobs/etablissement_update_job.rb | 6 ++- .../champs/siret/_etablissement.html.haml | 3 ++ config/locales/fr.yml | 3 +- .../champs/siret_controller_spec.rb | 20 ++++++++ .../users/dossiers_controller_spec.rb | 7 +++ 7 files changed, 71 insertions(+), 22 deletions(-) diff --git a/app/controllers/champs/siret_controller.rb b/app/controllers/champs/siret_controller.rb index 4923f6585..02175e455 100644 --- a/app/controllers/champs/siret_controller.rb +++ b/app/controllers/champs/siret_controller.rb @@ -7,25 +7,25 @@ class Champs::SiretController < ApplicationController find_etablisement if @siret.empty? - @champ&.update!(value: '') - @etablissement&.destroy - elsif @siret.present? && @siret.length == 14 - etablissement = find_etablisement_with_siret - if etablissement.present? - @etablissement = etablissement + return clear_siret_and_etablissement + end - if !@champ.nil? - @champ.update!(value: etablissement.siret, etablissement: etablissement) - end - else - @champ&.update!(value: '') - @etablissement&.destroy - @siret = :not_found - end - else - @champ&.update!(value: '') - @etablissement&.destroy - @siret = :invalid + if @siret.present? && @siret.length != 14 + return siret_error(:invalid) + end + + begin + etablissement = find_etablissement_with_siret + rescue RestClient::RequestFailed + return siret_error(:network_error) + end + if etablissement.blank? + return siret_error(:not_found) + end + + @etablissement = etablissement + if !@champ.nil? + @champ.update!(value: etablissement.siret, etablissement: etablissement) end end @@ -49,10 +49,20 @@ class Champs::SiretController < ApplicationController @procedure_id = @champ&.dossier&.procedure_id || 'aperçu' end - def find_etablisement_with_siret + def find_etablissement_with_siret etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(@siret, @procedure_id) if etablissement_attributes.present? Etablissement.new(etablissement_attributes) end end + + def clear_siret_and_etablissement + @champ&.update!(value: '') + @etablissement&.destroy + end + + def siret_error(error) + clear_siret_and_etablissement + @siret = error + end end diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 4673b580c..9f3bce5e9 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -91,7 +91,11 @@ module Users end sanitized_siret = siret_model.siret - etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(sanitized_siret, @dossier.procedure.id) + begin + etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(sanitized_siret, @dossier.procedure.id) + rescue RestClient::RequestFailed + return render_siret_error(t('errors.messages.siret_network_error')) + end if etablissement_attributes.blank? return render_siret_error(t('errors.messages.siret_unknown')) end diff --git a/app/jobs/etablissement_update_job.rb b/app/jobs/etablissement_update_job.rb index bcd81fa75..537f28ca6 100644 --- a/app/jobs/etablissement_update_job.rb +++ b/app/jobs/etablissement_update_job.rb @@ -2,7 +2,11 @@ class EtablissementUpdateJob < ApplicationJob queue_as :default def perform(dossier, siret) - etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(siret, dossier.procedure_id) + begin + etablissement_attributes = ApiEntrepriseService.get_etablissement_params_for_siret(siret, dossier.procedure_id) + rescue + return + end if etablissement_attributes.present? if dossier.etablissement.present? diff --git a/app/views/shared/champs/siret/_etablissement.html.haml b/app/views/shared/champs/siret/_etablissement.html.haml index bdb8eb8e4..d5a35ae2c 100644 --- a/app/views/shared/champs/siret/_etablissement.html.haml +++ b/app/views/shared/champs/siret/_etablissement.html.haml @@ -6,6 +6,9 @@ Nous n’avons pas trouvé d’établissement correspondant à ce numéro de SIRET. = link_to('Plus d’informations', "https://faq.demarches-simplifiees.fr/article/4-erreur-siret", target: '_blank', rel: 'noopener') +- when :network_error + = t('errors.messages.siret_network_error') + - else - if siret.present? && siret == etablissement&.siret = render partial: 'shared/dossiers/editable_champs/etablissement_titre', locals: { etablissement: etablissement } diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4000e6ece..b746c9fa4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -182,7 +182,8 @@ fr: dossier_map_not_activated: "Le dossier n'a pas accès à la cartographie." invalid_siret: "Le siret est incorrect" procedure_not_found: "La démarche n'existe pas" - siret_unknown: 'Désolé, nous n’avons pas trouvé d’établissement enregistré correspondant à ce numéro SIRET' + siret_unknown: 'Désolé, nous n’avons pas trouvé d’établissement enregistré correspondant à ce numéro SIRET.' + siret_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.' etablissement_fail: 'Désolé, nous n’avons pas réussi à enregistrer l’établissement correspondant à ce numéro SIRET' france_connect: connexion: "Erreur lors de la connexion à France Connect." diff --git a/spec/controllers/champs/siret_controller_spec.rb b/spec/controllers/champs/siret_controller_spec.rb index 91d9f333c..e374ce4a1 100644 --- a/spec/controllers/champs/siret_controller_spec.rb +++ b/spec/controllers/champs/siret_controller_spec.rb @@ -55,6 +55,26 @@ describe Champs::SiretController, type: :controller do end end + context 'when the API is unavailable' do + let(:siret) { '82161143100015' } + + before do + allow(controller).to receive(:find_etablissement_with_siret).and_raise(RestClient::RequestFailed) + end + + subject! { get :show, params: params, format: 'js' } + + it 'clears the etablissement and SIRET on the model' do + champ.reload + expect(champ.etablissement).to be_nil + expect(champ.value).to be_empty + end + + it 'displays a “API is unavailable” error message' do + expect(response.body).to include(I18n.t('errors.messages.siret_network_error')) + end + end + context 'when the SIRET is valid but unknown' do let(:siret) { '00000000000000' } diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index 17d3dfa10..351e2fae7 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -278,6 +278,13 @@ describe Users::DossiersController, type: :controller do context 'with a valid SIRET' do let(:params_siret) { '440 117 620 01530' } + context 'When API-Entreprise is down' do + let(:api_etablissement_status) { 502 } + let(:api_body_status) { File.read('spec/fixtures/files/api_entreprise/exercices_unavailable.json') } + + it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_network_error') + end + context 'when API-Entreprise doesn’t know this SIRET' do let(:api_etablissement_status) { 404 } let(:api_body_status) { '' }