From 84b97e33ef7703f18f6bec5e0a298a5fd1d0f8f1 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 28 Jul 2020 12:03:05 +0200 Subject: [PATCH] api_particulier: dont log 404 for normal caf errors (#44318) --- .../apps/api_particulier/known_errors.py | 47 +++++++++++++++++++ passerelle/apps/api_particulier/models.py | 12 +++-- tests/test_api_particulier.py | 13 ++++- 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 passerelle/apps/api_particulier/known_errors.py diff --git a/passerelle/apps/api_particulier/known_errors.py b/passerelle/apps/api_particulier/known_errors.py new file mode 100644 index 00000000..e456b38a --- /dev/null +++ b/passerelle/apps/api_particulier/known_errors.py @@ -0,0 +1,47 @@ +# from https://github.com/betagouv/api-caf/blob/master/lib/client/errors.json + +KNOWN_ERRORS = { + 404: { + 'Absence ressources ou QF à 0 sur la période de référence. Le document ne peut être édité.', + 'Dossier allocataire inexistant. Le document ne peut être édité.', + "Dossier en cours d'affiliation sur la période de référence. Le document ne peut être édité.", + 'Dossier radié au cours de la période de référence. Le document ne peut être édité.', + 'Dossier radié. Le document ne peut être édité.', + 'Dossier suspendu au cours de la période de référence. Le document ne peut être édité.', + 'Dossier suspendu. Le document ne peut être édité.', + 'Décès MON/MME. Le document ne peut être édité.', + "Le dossier n'est pas éligible à la réduction sociale téléphonique - Pas de droit AAH ou RSA à la date de situation.", + 'Non droit. Le document ne peut être édité.', + 'Pas de droit sur la période demandée pour la prestation sélectionnée (entre début période et date du jour)', + 'Pas de droit sur la période demandée pour la prestation sélectionnée (entre début période et fin période)', + 'Pas de droit sur la période demandée pour la prestation sélectionnée et le bénéficiaire choisi', + 'Pas de droit sur la période demandée pour la prestation sélectionnée.', + "Votre quotient familial (Qf) sur cette période est non disponible. Pour plus d'information, contactez-nous.", + # API particulier error message not from the source above + 'Les paramètres fournis sont incorrects ou ne correspondent pas à un avis', + }, + 400: { + 'Absence de code confidentiel. Le document ne peut être édité.', + 'Absence du nom du responsable dossier. Le document ne peut être édité.', + 'Allocataire non radié à la date de situation demandée', + 'Il existe au moins un enfant pour lequel il existe ou il a existé un droit sur le dossier', + 'Il existe au moins un enfant pour lequel il existe un droit sur le dossier et/ou après la date de situation demandée', + 'Il existe au moins un enfant pour lequel il existe un droit sur le dossier et/ou à la période demandée', + 'Il existe des droits pour la prestation sélectionnée sur le dossier et/ou la période demandée', + 'Il existe des droits pour la prestation sélectionnée sur le dossier et/ou la période demandée (après date du jour)', + 'L’opérateurs téléphonique» ne propose pas de raccordement SMS avec un prestataire externe (raccordement avec un numéro court). ' + }, + 500: { + 'Les informations souhaitées sont momentanément indisponibles. Merci de renouveler votre demande ultérieurement.', + 'Problème technique avec le service tiersi', + 'Problème technique avec le service trafic', + "Votre demande n'a pu aboutir car le numéro de téléphone mentionné ne fait pas partie de la liste des numéros autorisés.", + "Votre demande n'a pu aboutir en raison d'un incident technique lié à l'appel au service IMC. Des paramètres manquent.", + "Votre demande n'a pu aboutir en raison d'un incident technique lié à l'appel au service IMC. La taille du message ne doit pas être supérieure à 160 caractères.", + "Votre demande n'a pu aboutir en raison d'un incident technique lié à l'appel au service IMC. Le SMS a été envoyé mais l'acquittement n'a pas été reçu.", + "Votre demande n'a pu aboutir en raison d'un incident technique momentané. Merci de renouveler votre demande ultérieurement.", + "Votre demande n'a pu aboutir en raison d'une erreur fonctionnelle lié à l'appel au service IMC.", + "Votre demande n'a pu aboutir en raison d'une erreur technique lié à l'appel au service IMC.", + "Votre demande n’a pu aboutir en raison d'un problème technique lié aux données entrantes du webservice. Merci de renouveler votre demande ultérieurement." + } +} diff --git a/passerelle/apps/api_particulier/models.py b/passerelle/apps/api_particulier/models.py index 5bd04de0..6f401fc1 100644 --- a/passerelle/apps/api_particulier/models.py +++ b/passerelle/apps/api_particulier/models.py @@ -37,6 +37,8 @@ from passerelle.utils.api import endpoint from passerelle.utils.conversion import exception_to_text from passerelle.utils.jsonresponse import APIError +from .known_errors import KNOWN_ERRORS + class APIParticulier(BaseResource): PLATFORMS = [ @@ -108,17 +110,17 @@ class APIParticulier(BaseResource): 'content': content, }) if response.status_code != 200: - # avoid logging 404 errors indicating no matching data was found - if data.get('error') == 'not_found' and \ - ('incorrects ou ne correspondent' in data['message'] or - 'Dossier allocataire inexistant' in data['message']): + # avoid logging http errors about non-transport failure + message = data.get('message', '') + if message in KNOWN_ERRORS[response.status_code]: raise APIError( - 'No matching tax notice was found.', + message, data={ 'code': 'not-found', 'platform': self.platform, 'content': data, }) + raise APIError( u'API-particulier platform "%s" returned a non 200 status %s: %s' % (self.platform, response.status_code, data), diff --git a/tests/test_api_particulier.py b/tests/test_api_particulier.py index 3744d23b..9535a18d 100644 --- a/tests/test_api_particulier.py +++ b/tests/test_api_particulier.py @@ -135,6 +135,14 @@ def api_particulier_error_not_found_caf(url, request): }, request=request) +@urlmatch(netloc=r'^particulier.*\.api\.gouv\.fr$') +def api_particulier_error_not_found_deregistrated(url, request): + return response(404, { + 'error': 'not_found', + 'message': 'Dossier radié. Le document ne peut être édité.' + }, request=request) + + @pytest.yield_fixture def mock_api_particulier(): with HTTMock(api_particulier_v2_avis_imposition, api_particulier_v2_situation_familiale): @@ -203,7 +211,7 @@ def test_error(app, resource, mock_api_particulier): params=params) assert resp.status_code == 200 assert resp.json['err'] == 1 - assert resp.json['err_desc'] == 'No matching tax notice was found.' + assert 'incorrects ou ne correspondent pas' in resp.json['err_desc'] assert resp.json['data']['code'] == 'not-found' for endpoints, params in vector: for endpoint in endpoints: @@ -310,7 +318,8 @@ def test_detail_page(app, resource): @pytest.mark.parametrize( 'mock,should_log', [ (api_particulier_error_not_found, False), (api_particulier_error_500, True), - (api_particulier_error_not_json, True), (api_particulier_error_not_found_caf, False) + (api_particulier_error_not_json, True), (api_particulier_error_not_found_caf, False), + (api_particulier_error_not_found_deregistrated, False) ] ) def test_api_particulier_dont_log_not_found(app, resource, mock, should_log): -- 2.20.1