Projet

Général

Profil

0001-solis_afi_mss-add-2-new-children-endpoints-51012.patch

Nicolas Roche, 10 février 2021 18:07

Télécharger (9,32 ko)

Voir les différences:

Subject: [PATCH] solis_afi_mss: add 2 new children endpoints (#51012)

 passerelle/contrib/solis_afi_mss/models.py | 69 +++++++++++++++++
 tests/test_solis_afi_mss.py                | 87 ++++++++++++++++++++++
 2 files changed, 156 insertions(+)
passerelle/contrib/solis_afi_mss/models.py
9 9
# This program is distributed in the hope that it will be useful,
10 10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 12
# GNU Affero General Public License for more details.
13 13
#
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from datetime import datetime
18
from dateutil.relativedelta import relativedelta
17 19
from urllib.parse import urljoin
18 20

  
19 21
from django.db import models
22
from django.utils import timezone
23
from django.utils.dateparse import parse_date
20 24
from django.utils.translation import ugettext_lazy as _
21 25

  
22 26
from passerelle.base.models import BaseResource, HTTPResource
23 27
from passerelle.utils.api import endpoint
24 28
from passerelle.utils.jsonresponse import APIError
25 29

  
26 30
TAX_SCHEMA = {
27 31
    '$schema': 'http://json-schema.org/draft-04/schema#',
......
193 197
        description=_('Retrieve children from family composition'),
194 198
        parameters={
195 199
            'email': {'description': _("Agent's email address")},
196 200
        })
197 201
    def children(self, request, email):
198 202
        children = self.search_from_email(email)[2]
199 203
        return {'data': children}
200 204

  
205
    @staticmethod
206
    def get_age(birthday_date_string, now_date_string=None):
207
        if now_date_string:
208
            try:
209
                now_date = parse_date(now_date_string)
210
            except ValueError as exc:
211
                raise APIError('input is well formatted but not a valid date: %s' % exc)
212
            if not now_date:
213
                raise APIError(
214
                    "input isn't well formatted, YYYY-MM-DD expected: %s" % birthday_date_string)
215
        try:
216
            birthday_date = parse_date(birthday_date_string)
217
        except ValueError as exc:
218
            birthday_date = None
219
        if not birthday_date:
220
            return None
221

  
222
        birthday_datetime = timezone.make_aware(
223
            datetime.combine(birthday_date, datetime.min.time()))
224
        if now_date_string:
225
            now_datetime = timezone.make_aware(datetime.combine(now_date, datetime.min.time()))
226
        else:
227
            now_datetime = timezone.now()
228
        return relativedelta(now_datetime, birthday_datetime)
229

  
230
    @endpoint(
231
        display_category=_('Agent'), display_order=5,
232
        perm='can_access', methods=['get'],
233
        description=_('Retrieve younger children from family composition'),
234
        name='children-younger',
235
        parameters={
236
            'email': {'description': _("Agent's email address")},
237
            'age': {'description': _("Integer to select childreen younger than this age")},
238
            'now': {'description': _("Reference date use to compute age")},
239
        })
240
    def children_younger(self, request, email, age, now=None):
241
        """also get childreen having no dateNaissance defined"""
242
        children = self.search_from_email(email)[2]
243
        data = []
244
        for child in children:
245
            child_age = self.get_age(child.get('dateNaissance'), now)
246
            if child_age is None or child_age.years < int(age):
247
                data.append(child)
248
        return {'data': data}
249

  
250
    @endpoint(
251
        display_category=_('Agent'), display_order=6,
252
        perm='can_access', methods=['get'],
253
        description=_('Retrieve older children from family composition'),
254
        name='children-older',
255
        parameters={
256
            'email': {'description': _("Agent's email address")},
257
            'age': {'description': _("Integer to select childreen older or equal than this age")},
258
            'now': {'description': _("Reference date use to compute age")},
259
        })
260
    def children_older(self, request, email, age, now=None):
261
        """also get childreen having no dateNaissance defined"""
262
        children = self.search_from_email(email)[2]
263
        data = []
264
        for child in children:
265
            child_age = self.get_age(child.get('dateNaissance'), now)
266
            if child_age is None or child_age.years >= int(age):
267
                data.append(child)
268
        return {'data': data}
269

  
201 270
    @endpoint(
202 271
        display_category=_('Budget'), display_order=1,
203 272
        perm='can_access', methods=['get'],
204 273
        description=_('Retrieve the list of charges for an agent'),
205 274
        parameters={
206 275
            'email': {'description': _("Agent's email address")},
207 276
            'year': {'description': _('Year of taxation (YYYY)')},
208 277
        })
tests/test_solis_afi_mss.py
265 265
def test_children(mocked_get, app, connector, response1, children):
266 266
    mocked_get.side_effect = [response1]
267 267
    endpoint = get_endpoint('children') + '?email=foo@dummy.org'
268 268
    resp = app.get(endpoint)
269 269
    assert not resp.json['err']
270 270
    assert [(x['id'], x['text']) for x in resp.json['data']] == children
271 271

  
272 272

  
273
@pytest.mark.parametrize('index, name, birthday, age', [
274
    (123456, 'Nico', '1978-05-11', 42),
275
    (389229, 'Lola ROUSSEAU', '1995-07-25', 25),
276
    (389230, 'Nicolas ROUSSEAU', '1990-05-04', 30),
277
    (389231, 'Mélina ROUSSEAU', '1992-06-10', 28),
278
    (388413, 'KEVIN PIED', '1997-04-26', 23),
279
    (388407, 'Camille HUREL', '1991-08-24', 29),
280
    (388408, 'Valentin HUREL', '1996-08-05', 24),
281
])
282
def test_get_age(connector, index, name, birthday, age):
283
    assert connector.get_age(birthday, '2021-02-10').years == age
284

  
285

  
286
@mock.patch('passerelle.utils.Request.get')
287
@pytest.mark.parametrize('response1, children', [
288
    (RECHERCHE_PAR_EMAIL_1, []),
289
    (RECHERCHE_PAR_EMAIL_2, [
290
        (388413, 'KEVIN PIED'),
291
    ]),
292
    (RECHERCHE_PAR_EMAIL_3, []),
293
    (RECHERCHE_PAR_EMAIL_4, [
294
        (388408, 'Valentin HUREL'),
295
    ]),
296
])
297
def test_children_younger(mocked_get, freezer, app, connector, response1, children):
298
    freezer.move_to('2021-02-10')
299
    mocked_get.side_effect = [response1]
300
    endpoint = get_endpoint('children-younger') + '?email=foo@dummy.org&age=25'
301
    resp = app.get(endpoint)
302
    assert not resp.json['err']
303
    assert [(x['id'], x['text']) for x in resp.json['data']] == children
304

  
305

  
306
@mock.patch('passerelle.utils.Request.get')
307
@pytest.mark.parametrize('response1, children', [
308
    (RECHERCHE_PAR_EMAIL_1, [
309
        (389229, 'Lola ROUSSEAU'),
310
        (389230, 'Nicolas ROUSSEAU'),
311
        (389231, 'Mélina ROUSSEAU'),
312
    ]),
313
    (RECHERCHE_PAR_EMAIL_2, []),
314
    (RECHERCHE_PAR_EMAIL_3, []),
315
    (RECHERCHE_PAR_EMAIL_4, [
316
        (388407, 'Camille HUREL'),
317
    ]),
318
])
319
def test_children_older(mocked_get, app, connector, response1, children):
320
    mocked_get.side_effect = [response1]
321
    endpoint = get_endpoint('children-older') + '?email=foo@dummy.org&age=25&now=2021-02-10'
322
    resp = app.get(endpoint)
323
    assert not resp.json['err']
324
    assert [(x['id'], x['text']) for x in resp.json['data']] == children
325

  
326

  
327
@mock.patch('passerelle.utils.Request.get')
328
@pytest.mark.parametrize('now, err_desc', [
329
    ('2012-02-30', 'not a valid date'),
330
    ('10/02/2012', 'YYYY-MM-DD expected'),
331
    ('tomorrow', 'YYYY-MM-DD expected'),
332
])
333
def test_children_younger_api_error(mocked_get, app, connector, now, err_desc):
334
    mocked_get.side_effect = [RECHERCHE_PAR_EMAIL_2]
335
    endpoint = get_endpoint('children-younger') + '?email=foo@dummy.org&age=25&now=%s' % now
336
    resp = app.get(endpoint)
337
    assert resp.json['err']
338
    assert err_desc in resp.json['err_desc']
339

  
340

  
341
@mock.patch('passerelle.utils.Request.get')
342
@pytest.mark.parametrize('birthday, nb_selected', [
343
    ('2012-02-30', 1),
344
    ('10/02/2012', 1),
345
    ('tomorrow', 1),
346
    ('2012-02-10', 0),
347
])
348
def test_children_older_data_error(mocked_get, freezer, app, connector, birthday, nb_selected):
349
    freezer.move_to('2021-02-10')
350
    with open(os.path.join(TEST_BASE_DIR, "%s.json" % 'rechercherParEmail_388412')) as fd:
351
        content = json.load(fd)
352
    content['enfantsAgent'][0]['dateNaissance'] = birthday
353
    mocked_get.side_effect = [response(200, json.dumps(content))]
354
    endpoint = get_endpoint('children-older') + '?email=foo@dummy.org&age=99'
355
    resp = app.get(endpoint)
356
    assert not resp.json['err']
357
    assert len(resp.json['data']) == nb_selected
358

  
359

  
273 360
@mock.patch('passerelle.utils.Request.get')
274 361
@pytest.mark.parametrize('response1, response2, taxes', [
275 362
    (RECHERCHE_PAR_EMAIL_4, GET_IMPOSITION_PAR_AGENT_4,
276 363
     [(2018, '2018: 15000'), (2019, '2019: 1000')])
277 364
])
278 365
def test_taxes(mocked_get, app, connector, response1, response2, taxes):
279 366
    mocked_get.side_effect = [response1, response2]
280 367
    endpoint = get_endpoint('taxes') + '?email=foo@dummy.org'
281
-