Projet

Général

Profil

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

Valentin Deniaud, 28 juillet 2020 11:56

Télécharger (7,99 ko)

Voir les différences:

Subject: [PATCH] api_particulier: dont log 404 for normal caf errors (#44318)

 passerelle/apps/api_particulier/caf_errors.py | 45 +++++++++++++++++++
 passerelle/apps/api_particulier/models.py     | 13 +++---
 tests/test_api_particulier.py                 | 13 +++++-
 3 files changed, 64 insertions(+), 7 deletions(-)
 create mode 100644 passerelle/apps/api_particulier/caf_errors.py
passerelle/apps/api_particulier/caf_errors.py
1
# from https://github.com/betagouv/api-caf/blob/master/lib/client/errors.json
2

  
3
CAF_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
    },
21
    400: {
22
        'Absence de code confidentiel. Le document ne peut être édité.',
23
        'Absence du nom du responsable dossier. Le document ne peut être édité.',
24
        'Allocataire non radié à la date de situation demandée',
25
        'Il existe au moins un enfant pour lequel il existe ou il a existé un droit sur le dossier',
26
        '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',
27
        'Il existe au moins un enfant pour lequel il existe un droit sur le dossier et/ou à la période demandée',
28
        'Il existe des droits pour la prestation sélectionnée sur le dossier et/ou la période demandée',
29
        '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)',
30
        'L’opérateurs téléphonique» ne propose pas de raccordement SMS avec un prestataire externe (raccordement avec un numéro court). '
31
    },
32
    500: {
33
        'Les informations souhaitées sont momentanément indisponibles. Merci de renouveler votre demande ultérieurement.',
34
        'Problème technique avec le service tiersi',
35
        'Problème technique avec le service trafic',
36
        "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.",
37
        "Votre demande n'a pu aboutir en raison d'un incident technique lié à l'appel au service IMC. Des paramètres manquent.",
38
        "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.",
39
        "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.",
40
        "Votre demande n'a pu aboutir en raison d'un incident technique momentané. Merci de renouveler votre demande ultérieurement.",
41
        "Votre demande n'a pu aboutir en raison d'une erreur fonctionnelle lié à l'appel au service IMC.",
42
        "Votre demande n'a pu aboutir en raison d'une erreur technique lié à l'appel au service IMC.",
43
        "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."
44
    }
45
}
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 .caf_errors import CAF_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 CAF_ERRORS[response.status_code] or \
116
                    'incorrects ou ne correspondent' in message:
115 117
                raise APIError(
116
                    'No matching tax notice was found.',
118
                    message,
117 119
                    data={
118 120
                        'code': 'not-found',
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
-