diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index dbc6a0611..b04237199 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -114,8 +114,15 @@ module Users sanitized_siret = siret_model.siret begin etablissement = APIEntrepriseService.create_etablissement(@dossier, sanitized_siret, current_user.id) - rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError - return render_siret_error(t('errors.messages.siret_network_error')) + rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError => e + if e.is_a?(APIEntrepriseToken::TokenError) || APIEntrepriseService.api_up? + # probably random error, invite user to retry + Sentry.capture_exception(e, extra: { dossier_id: @dossier.id, siret: sanitized_siret }) + return render_siret_error(t('errors.messages.siret_network_error')) + else + # global API Entreprise error. TODO: degraded mode + notify ops + return render_siret_error(t('errors.messages.siret_api_down')) + end end if etablissement.nil? return render_siret_error(t('errors.messages.siret_unknown')) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ff8847661..a04492bad 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -370,6 +370,7 @@ fr: 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_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.' + siret_api_down: "L'INSEE rencontre actuellement un problème majeur qui empêche le traitement des informations SIRET. Il n'y a pas encore de date de résolution annoncée." siret_not_found: 'Nous n’avons pas trouvé d’établissement correspondant à ce numéro de SIRET.' # etablissement_fail: 'Désolé, nous n’avons pas réussi à enregistrer l’établissement correspondant à ce numéro SIRET' france_connect: diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index 33c4d699e..82ecfc697 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -207,6 +207,7 @@ describe Users::DossiersController, type: :controller do let(:api_etablissement_status) { 200 } let(:api_etablissement_body) { File.read('spec/fixtures/files/api_entreprise/etablissements.json') } let(:token_expired) { false } + let(:api_current_status_response) { nil } before do sign_in(user) @@ -215,6 +216,11 @@ describe Users::DossiersController, type: :controller do allow_any_instance_of(APIEntrepriseToken).to receive(:roles) .and_return(["attestations_fiscales", "attestations_sociales", "bilans_entreprise_bdf"]) allow_any_instance_of(APIEntrepriseToken).to receive(:expired?).and_return(token_expired) + + if api_current_status_response + stub_request(:get, "https://entreprise.api.gouv.fr/watchdoge/dashboard/current_status") + .to_return(body: api_current_status_response) + end end subject! { post :update_siret, params: { id: dossier.id, user: { siret: params_siret } } } @@ -255,12 +261,21 @@ describe Users::DossiersController, type: :controller do context 'with a valid SIRET' do let(:params_siret) { '418 166 096 00051' } - context 'When API-Entreprise is down' do + + context 'When API-Entreprise is ponctually down' do let(:api_etablissement_status) { 502 } + let(:api_current_status_response) { File.read('spec/fixtures/files/api_entreprise/current_status.json') } it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_network_error') end + context 'When API-Entreprise is globally down' do + let(:api_etablissement_status) { 502 } + let(:api_current_status_response) { File.read('spec/fixtures/files/api_entreprise/current_status.json').tr('200', '502') } + + it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_api_down') + end + context 'when API-Entreprise doesn’t know this SIRET' do let(:api_etablissement_status) { 404 } @@ -269,6 +284,7 @@ describe Users::DossiersController, type: :controller do context 'when default token has expired' do let(:api_etablissement_status) { 200 } + let(:api_current_status_response) { File.read('spec/fixtures/files/api_entreprise/current_status.json') } let(:token_expired) { true } it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_network_error')