Merge pull request #7778 from betagouv/allow_champ_siret_submission_when_api_down

feat(champ siret): permet la soumission du formulaire lorsque l'api est down
This commit is contained in:
mfo 2022-09-19 13:34:19 +02:00 committed by GitHub
commit f80132377a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 6 deletions

View file

@ -17,9 +17,22 @@ class Champs::SiretController < ApplicationController
begin begin
etablissement = find_etablissement_with_siret etablissement = find_etablissement_with_siret
rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError rescue => error
# i18n-tasks-use t('errors.messages.siret_network_error') if error.try(:network_error?) && !APIEntrepriseService.api_up?
return siret_error(:network_error) # TODO: notify ops
etablissement = APIEntrepriseService.create_etablissement_as_degraded_mode(@champ, @siret, current_user.id)
if !@champ.nil?
@champ.update!(value: etablissement.siret, etablissement: etablissement)
end
@siret = :api_entreprise_down
return
else
Sentry.capture_exception(error, extra: { dossier_id: @champ.dossier_id, siret: @siret })
# i18n-tasks-use t('errors.messages.siret_network_error')
return siret_error(:network_error)
end
end end
if etablissement.nil? if etablissement.nil?
# i18n-tasks-use t('errors.messages.siret_not_found') # i18n-tasks-use t('errors.messages.siret_not_found')

View file

@ -9,6 +9,12 @@
- when :network_error - when :network_error
= t('errors.messages.siret_network_error') = t('errors.messages.siret_network_error')
- when :api_entreprise_down
= t('errors.messages.api_entreprise_down')
- else - else
- if siret.present? && siret == etablissement&.siret - if siret.present?
= render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement) - if siret == etablissement&.siret && raison_sociale_or_name(etablissement).present?
= render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement)
- else
Ce SIRET existe, nous en récupérons les informations.

View file

@ -371,6 +371,7 @@ fr:
siret_unknown: 'Désolé, nous navons pas trouvé détablissement enregistré correspondant à ce numéro SIRET.' siret_unknown: 'Désolé, nous navons 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_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.'
siret_not_found: 'Nous navons pas trouvé détablissement correspondant à ce numéro de SIRET.' siret_not_found: 'Nous navons pas trouvé détablissement correspondant à ce numéro de SIRET.'
api_entreprise_down: 'Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.'
# etablissement_fail: 'Désolé, nous navons pas réussi à enregistrer létablissement correspondant à ce numéro SIRET' # etablissement_fail: 'Désolé, nous navons pas réussi à enregistrer létablissement correspondant à ce numéro SIRET'
france_connect: france_connect:
connexion: "Erreur lors de la connexion à France Connect." connexion: "Erreur lors de la connexion à France Connect."

View file

@ -66,10 +66,14 @@ describe Champs::SiretController, type: :controller do
end end
end end
context 'when the API is unavailable' do context 'when the API is unavailable due to network error' do
let(:siret) { '82161143100015' } let(:siret) { '82161143100015' }
let(:api_etablissement_status) { 503 } let(:api_etablissement_status) { 503 }
before do
expect(APIEntrepriseService).to receive(:api_up?).and_return(true)
end
subject! { get :show, params: params, format: :turbo_stream } subject! { get :show, params: params, format: :turbo_stream }
it 'clears the etablissement and SIRET on the model' do it 'clears the etablissement and SIRET on the model' do
@ -83,6 +87,28 @@ describe Champs::SiretController, type: :controller do
end end
end end
context 'when the API is unavailable due to an api maintenance or pb' do
let(:siret) { '82161143100015' }
let(:api_etablissement_status) { 502 }
before do
expect(APIEntrepriseService).to receive(:api_up?).and_return(false)
end
subject! { get :show, params: params, format: :turbo_stream }
it 'saves the etablissement in degraded mode and SIRET on the model' do
champ.reload
expect(champ.value).to eq(siret)
expect(champ.etablissement.siret).to eq(siret)
expect(champ.etablissement.as_degraded_mode?).to be true
end
it 'displays a “API entreprise down” error message' do
expect(response.body).to include('Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.')
end
end
context 'when the SIRET is valid but unknown' do context 'when the SIRET is valid but unknown' do
let(:siret) { '00000000000000' } let(:siret) { '00000000000000' }
let(:api_etablissement_status) { 404 } let(:api_etablissement_status) { 404 }