0001-api_particulier-dont-log-404-for-normal-caf-errors-4.patch
passerelle/apps/api_particulier/known_errors.py | ||
---|---|---|
1 |
# from https://github.com/betagouv/api-caf/blob/master/lib/client/errors.json |
|
2 | ||
3 |
KNOWN_ERRORS = { |
|
4 |
404: { |
|
5 |
'Absence ressources ou QF à 0 sur la période de référence. Le document ne peut être édité.', |
|
6 |
'Dossier allocataire inexistant. Le document ne peut être édité.', |
|
7 |
"Dossier en cours d'affiliation sur la période de référence. Le document ne peut être édité.", |
|
8 |
'Dossier radié au cours de la période de référence. Le document ne peut être édité.', |
|
9 |
'Dossier radié. Le document ne peut être édité.', |
|
10 |
'Dossier suspendu au cours de la période de référence. Le document ne peut être édité.', |
|
11 |
'Dossier suspendu. Le document ne peut être édité.', |
|
12 |
'Décès MON/MME. Le document ne peut être édité.', |
|
13 |
"Le dossier n'est pas éligible à la réduction sociale téléphonique - Pas de droit AAH ou RSA à la date de situation.", |
|
14 |
'Non droit. Le document ne peut être édité.', |
|
15 |
'Pas de droit sur la période demandée pour la prestation sélectionnée (entre début période et date du jour)', |
|
16 |
'Pas de droit sur la période demandée pour la prestation sélectionnée (entre début période et fin période)', |
|
17 |
'Pas de droit sur la période demandée pour la prestation sélectionnée et le bénéficiaire choisi', |
|
18 |
'Pas de droit sur la période demandée pour la prestation sélectionnée.', |
|
19 |
"Votre quotient familial (Qf) sur cette période est non disponible. Pour plus d'information, contactez-nous.", |
|
20 |
# API particulier error message not from the source above |
|
21 |
'Les paramètres fournis sont incorrects ou ne correspondent pas à un avis', |
|
22 |
}, |
|
23 |
400: { |
|
24 |
'Absence de code confidentiel. Le document ne peut être édité.', |
|
25 |
'Absence du nom du responsable dossier. Le document ne peut être édité.', |
|
26 |
'Allocataire non radié à la date de situation demandée', |
|
27 |
'Il existe au moins un enfant pour lequel il existe ou il a existé un droit sur le dossier', |
|
28 |
'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', |
|
29 |
'Il existe au moins un enfant pour lequel il existe un droit sur le dossier et/ou à la période demandée', |
|
30 |
'Il existe des droits pour la prestation sélectionnée sur le dossier et/ou la période demandée', |
|
31 |
'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)', |
|
32 |
'L’opérateurs téléphonique» ne propose pas de raccordement SMS avec un prestataire externe (raccordement avec un numéro court). ' |
|
33 |
}, |
|
34 |
500: { |
|
35 |
'Les informations souhaitées sont momentanément indisponibles. Merci de renouveler votre demande ultérieurement.', |
|
36 |
'Problème technique avec le service tiersi', |
|
37 |
'Problème technique avec le service trafic', |
|
38 |
"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.", |
|
39 |
"Votre demande n'a pu aboutir en raison d'un incident technique lié à l'appel au service IMC. Des paramètres manquent.", |
|
40 |
"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.", |
|
41 |
"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.", |
|
42 |
"Votre demande n'a pu aboutir en raison d'un incident technique momentané. Merci de renouveler votre demande ultérieurement.", |
|
43 |
"Votre demande n'a pu aboutir en raison d'une erreur fonctionnelle lié à l'appel au service IMC.", |
|
44 |
"Votre demande n'a pu aboutir en raison d'une erreur technique lié à l'appel au service IMC.", |
|
45 |
"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." |
|
46 |
} |
|
47 |
} |
passerelle/apps/api_particulier/models.py | ||
---|---|---|
37 | 37 |
from passerelle.utils.conversion import exception_to_text |
38 | 38 |
from passerelle.utils.jsonresponse import APIError |
39 | 39 | |
40 |
from .known_errors import KNOWN_ERRORS |
|
41 | ||
40 | 42 | |
41 | 43 |
class APIParticulier(BaseResource): |
42 | 44 |
PLATFORMS = [ |
... | ... | |
108 | 110 |
'content': content, |
109 | 111 |
}) |
110 | 112 |
if response.status_code != 200: |
111 |
# avoid logging 404 errors indicating no matching data was found |
|
112 |
if data.get('error') == 'not_found' and \ |
|
113 |
('incorrects ou ne correspondent' in data['message'] or |
|
114 |
'Dossier allocataire inexistant' in data['message']): |
|
113 |
# avoid logging http errors about non-transport failure |
|
114 |
message = data.get('message', '') |
|
115 |
if message in KNOWN_ERRORS.get(response.status_code, []): |
|
115 | 116 |
raise APIError( |
116 |
'No matching tax notice was found.',
|
|
117 |
message,
|
|
117 | 118 |
data={ |
118 |
'code': 'not-found', |
|
119 |
'code': data.get('error').remplace('_', '-'), |
|
120 |
'status_code': response.status_code, |
|
119 | 121 |
'platform': self.platform, |
120 | 122 |
'content': data, |
121 | 123 |
}) |
124 | ||
122 | 125 |
raise APIError( |
123 | 126 |
u'API-particulier platform "%s" returned a non 200 status %s: %s' % |
124 | 127 |
(self.platform, response.status_code, data), |
tests/test_api_particulier.py | ||
---|---|---|
135 | 135 |
}, request=request) |
136 | 136 | |
137 | 137 | |
138 |
@urlmatch(netloc=r'^particulier.*\.api\.gouv\.fr$') |
|
139 |
def api_particulier_error_not_found_deregistrated(url, request): |
|
140 |
return response(404, { |
|
141 |
'error': 'not_found', |
|
142 |
'message': 'Dossier radié. Le document ne peut être édité.' |
|
143 |
}, request=request) |
|
144 | ||
145 | ||
138 | 146 |
@pytest.yield_fixture |
139 | 147 |
def mock_api_particulier(): |
140 | 148 |
with HTTMock(api_particulier_v2_avis_imposition, api_particulier_v2_situation_familiale): |
... | ... | |
203 | 211 |
params=params) |
204 | 212 |
assert resp.status_code == 200 |
205 | 213 |
assert resp.json['err'] == 1 |
206 |
assert resp.json['err_desc'] == 'No matching tax notice was found.'
|
|
214 |
assert 'incorrects ou ne correspondent pas' in resp.json['err_desc']
|
|
207 | 215 |
assert resp.json['data']['code'] == 'not-found' |
208 | 216 |
for endpoints, params in vector: |
209 | 217 |
for endpoint in endpoints: |
... | ... | |
310 | 318 |
@pytest.mark.parametrize( |
311 | 319 |
'mock,should_log', [ |
312 | 320 |
(api_particulier_error_not_found, False), (api_particulier_error_500, True), |
313 |
(api_particulier_error_not_json, True), (api_particulier_error_not_found_caf, False) |
|
321 |
(api_particulier_error_not_json, True), (api_particulier_error_not_found_caf, False), |
|
322 |
(api_particulier_error_not_found_deregistrated, False) |
|
314 | 323 |
] |
315 | 324 |
) |
316 | 325 |
def test_api_particulier_dont_log_not_found(app, resource, mock, should_log): |
317 |
- |