Projet

Général

Profil

0001-api_particulier-dont-log-404-for-normal-caf-errors-4.patch

Valentin Deniaud, 28 juillet 2020 12:04

Télécharger (8,1 ko)

Voir les différences:

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
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[response.status_code]:
115 116
                raise APIError(
116
                    'No matching tax notice was found.',
117
                    message,
117 118
                    data={
118 119
                        'code': 'not-found',
119 120
                        'platform': self.platform,
120 121
                        'content': data,
121 122
                    })
123

  
122 124
            raise APIError(
123 125
                u'API-particulier platform "%s" returned a non 200 status %s: %s' %
124 126
                (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
-