Projet

Général

Profil

0001-toulouse_axel-possible-days-and-prefill-for-a-period.patch

Lauréline Guérin, 09 avril 2020 12:05

Télécharger (30,4 ko)

Voir les différences:

Subject: [PATCH] toulouse_axel: possible days and prefill for a period
 (#41453)

 passerelle/contrib/toulouse_axel/models.py |  99 ++++++++---
 tests/test_toulouse_axel.py                | 190 +++++++++++++++++----
 2 files changed, 227 insertions(+), 62 deletions(-)
passerelle/contrib/toulouse_axel/models.py
26 26
from django.core.cache import cache
27 27
from django.db import models
28 28
from django.http import HttpResponse
29
from django.utils.dates import WEEKDAYS
29
from django.utils import dateformat
30
from django.utils.dates import WEEKDAYS_REV
30 31
from django.utils.encoding import force_text
31 32
from django.utils.translation import ugettext_lazy as _
32 33

  
......
55 56
    'required': ['transaction_date', 'transaction_id']
56 57
}
57 58

  
59
WEEKDAYS = {v: k for k, v in WEEKDAYS_REV.items()}
60

  
58 61

  
59 62
class AxelSchema(JSONSchemaFromXMLSchema):
60 63
    type_map = {
......
1064 1067
        return {child_id: bool(child.get('ACTIVITE', [])) for child_id, child in children_activities.items()}
1065 1068

  
1066 1069
    def get_booking_data(self, dui, child_id, booking_date, activity_types=None):
1070
        cache_key = 'toulouse-axel-%s-possible-days-%s-%s-%s-%s' % (
1071
            self.pk, dui, child_id, booking_date.isoformat(), '-'.join(activity_types or []))
1072
        result = cache.get(cache_key)
1073
        if result is not None:
1074
            return result
1075

  
1067 1076
        reference_year = utils.get_reference_year_from_date(booking_date)
1068 1077

  
1069 1078
        # first get activities information for the child
......
1137 1146
            activity['annee_reference_label'] = '{}/{}'.format(reference_year, reference_year + 1)
1138 1147
            activity['booking'] = booking_days.get(activity['IDACTIVITE'], {})
1139 1148

  
1149
        cache.set(cache_key, child_activities, 3600)  # 1 hour
1140 1150
        return child_activities
1141 1151

  
1142 1152
    @endpoint(
......
1168 1178
            'idpersonne': {'description': _('Child ID')},
1169 1179
            'booking_date': {'description': _('Booking date')},
1170 1180
        })
1171
    def clae_booking_info(self, request, NameID, idpersonne, booking_date, activity_types=None):
1181
    def clae_booking_info(self, request, NameID, idpersonne, booking_date):
1172 1182
        link = self.get_link(NameID)
1173 1183
        try:
1174 1184
            booking_date = datetime.datetime.strptime(booking_date, utils.json_date_format)
1175 1185
        except ValueError:
1176 1186
            raise APIError('bad date format, should be YYYY-MM-DD', err_code='bad-request', http_status=400)
1177 1187

  
1178
        booking_data = self.get_booking_data(dui=link.dui, child_id=idpersonne, booking_date=booking_date, activity_types=activity_types)
1188
        booking_data = self.get_booking_data(dui=link.dui, child_id=idpersonne, booking_date=booking_date)
1179 1189

  
1180 1190
        return {'data': booking_data}
1181 1191

  
......
1187 1197
            'idpersonne': {'description': _('Child ID')},
1188 1198
            'booking_date': {'description': _('Booking date')},
1189 1199
        })
1190
    def clae_booking_activities_info(self, request, NameID, idpersonne, booking_date, activity_types=None):
1191
        return {'data': self.clae_booking_info(
1192
            request, NameID, idpersonne, booking_date, activity_types=activity_types)['data'].get('ACTIVITE', [])}
1200
    def clae_booking_activities_info(self, request, NameID, idpersonne, booking_date):
1201
        return {'data': self.clae_booking_info(request, NameID, idpersonne, booking_date)['data'].get('ACTIVITE', [])}
1193 1202

  
1194 1203
    @endpoint(
1195
        description=_("Get list of possible days for an activity"),
1204
        description=_("Get possible days to book an activity of a child, for a period"),
1196 1205
        perm='can_access',
1197 1206
        parameters={
1198 1207
            'NameID': {'description': _('Publik ID')},
1199 1208
            'idpersonne': {'description': _('Child ID')},
1200 1209
            'activity_type': {'description': _('Activity type (MAT, MIDI, SOIR, GARD)')},
1201
            'booking_date': {'description': _('Booking date')},
1210
            'start_date': {'description': _('Start date of the period')},
1211
            'end_date': {'description': _('End date of the period')},
1202 1212
        })
1203
    def clae_booking_activity_possible_days(self, request, NameID, idpersonne, activity_type, booking_date):
1213
    def clae_booking_activity_possible_days(self, request, NameID, idpersonne, activity_type, start_date, end_date):
1214
        link = self.get_link(NameID)
1215
        try:
1216
            start_date = datetime.datetime.strptime(start_date, utils.json_date_format).date()
1217
            end_date = datetime.datetime.strptime(end_date, utils.json_date_format).date()
1218
        except ValueError:
1219
            raise APIError('bad date format, should be YYYY-MM-DD', err_code='bad-request', http_status=400)
1204 1220
        if activity_type not in ['MAT', 'MIDI', 'SOIR', 'GARD']:
1205 1221
            raise APIError('bad activity_type, should be MAT, MIDI, SOIR or GARD', err_code='bad-request', http_status=400)
1206
        activities = self.clae_booking_activities_info(request, NameID, idpersonne, booking_date, activity_types=[activity_type])['data']
1207
        if not activities:
1208
            return {'data': []}
1209
        activity = activities[0]
1222

  
1223
        today = datetime.date.today()
1224
        # be sure that start_date is after today + 8 days
1225
        start_date = max(start_date, today + datetime.timedelta(days=8))
1226
        # but if start_date is a saturday or a sunday, jump to the next monday
1227
        if start_date.weekday() > 4:
1228
            start_date = start_date + datetime.timedelta(days=7 - start_date.weekday())
1229

  
1230
        # if end_date is not a friday: jump to next or previous friday
1231
        if end_date.weekday() < 4:
1232
            # next friday
1233
            end_date = end_date + datetime.timedelta(4 - end_date.weekday())
1234
        elif end_date.weekday() > 4:
1235
            # previous friday
1236
            end_date = end_date - datetime.timedelta(end_date.weekday() - 4)
1237

  
1238
        def get_activity_days_for_week(week_start_date, week_end_date):
1239
            # ask Axel for the booking of a week (starts may be a monday, ends a friday)
1240
            activities = self.get_booking_data(
1241
                dui=link.dui, child_id=idpersonne, booking_date=week_start_date, activity_types=[activity_type]).get('ACTIVITE', [])
1242
            if not activities:
1243
                return
1244
            activity = activities[0]
1245
            day_date = week_start_date
1246
            while day_date <= week_end_date:
1247
                day = WEEKDAYS[day_date.weekday()]
1248
                activity_day = {
1249
                    'id': '{}-{}-{}-{}'.format(idpersonne, activity_type, activity['id'], day_date.strftime(utils.json_date_format)),
1250
                    'text': dateformat.format(day_date, 'l j F Y'),
1251
                    'disabled': activity['booking']['days'][day] is None,
1252
                    'prefill': activity['booking']['days'][day],
1253
                    'details': activity,
1254
                }
1255
                day_date = day_date + datetime.timedelta(days=1)
1256
                yield activity_day
1257

  
1258
        # find the first week from start_date
1259
        week_start_date, week_end_date = utils.get_week_dates_from_date(start_date)
1210 1260
        activity_days = []
1211
        for i, day in enumerate(['monday', 'tuesday', 'wednesday', 'thursday', 'friday']):
1212
            activity_days.append({
1213
                'id': '{}-{}-{}-{}'.format(idpersonne, activity_type, activity['id'], day),
1214
                'text': WEEKDAYS[i],
1215
                'disabled': activity['booking']['days'][day] is None,
1216
                'prefill': activity['booking']['days'][day],
1217
                'details': activity,
1218
            })
1261
        # cross all weeks until end date
1262
        while week_end_date <= end_date:
1263
            activity_days += [d for d in get_activity_days_for_week(max(start_date, week_start_date), week_end_date)]
1264
            week_start_date = week_start_date + datetime.timedelta(days=7)
1265
            week_end_date = week_end_date + datetime.timedelta(days=7)
1266

  
1219 1267
        return {'data': activity_days}
1220 1268

  
1221 1269
    @endpoint(
1222
        description=_("Get list booked days for an activity"),
1270
        description=_("Get booked days for an activity of a child, for a period"),
1223 1271
        perm='can_access',
1224 1272
        parameters={
1225 1273
            'NameID': {'description': _('Publik ID')},
1226 1274
            'idpersonne': {'description': _('Child ID')},
1227 1275
            'activity_type': {'description': _('Activity type (MAT, MIDI, SOIR, GARD)')},
1228
            'booking_date': {'description': _('Booking date')},
1276
            'start_date': {'description': _('Start date of the period')},
1277
            'end_date': {'description': _('End date of the period')},
1229 1278
        })
1230
    def clae_booking_activity_prefill(self, request, NameID, idpersonne, activity_type, booking_date):
1231
        possible_days = self.clae_booking_activity_possible_days(request, NameID, idpersonne, activity_type, booking_date)
1279
    def clae_booking_activity_prefill(self, request, NameID, idpersonne, activity_type, start_date, end_date):
1280
        possible_days = self.clae_booking_activity_possible_days(request, NameID, idpersonne, activity_type, start_date, end_date)
1232 1281
        return {'data': [d['id'] for d in possible_days['data'] if d['prefill'] is True]}
1233 1282

  
1234 1283
    @endpoint(
tests/test_toulouse_axel.py
26 26
import os
27 27
import xml.etree.ElementTree as ET
28 28

  
29
from django.core.cache import cache
30

  
29 31
import freezegun
30 32
import pytest
31 33
import xmlschema
......
2326 2328
    }
2327 2329

  
2328 2330
    # test wrong and missing IDACTIVITE
2331
    cache.clear()
2329 2332
    content = """<PORTAIL>
2330 2333
  <DUI>
2331 2334
    <IDDUI>XXX</IDDUI>
......
2540 2543
    ]
2541 2544

  
2542 2545

  
2546
@freezegun.freeze_time('2019-09-01')
2543 2547
def test_clae_booking_activity_possible_days_endpoint_axel_error(app, resource):
2544 2548
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2545 2549
    with mock.patch('passerelle.contrib.toulouse_axel.models.enfants_activites') as operation:
2546 2550
        operation.side_effect = AxelError('FooBar')
2547
        resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2551
        resp = app.get(
2552
            '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2553
            '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2548 2554
    assert resp.json['err_desc'] == "Axel error: FooBar"
2549 2555
    assert resp.json['err'] == 'error'
2550 2556

  
......
2554 2560
    with mock_getdata(content, 'EnfantsActivites'):
2555 2561
        with mock.patch('passerelle.contrib.toulouse_axel.models.reservation_periode') as operation:
2556 2562
            operation.side_effect = AxelError('FooBar')
2557
            resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2563
            resp = app.get(
2564
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2565
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2558 2566
    assert resp.json['err_desc'] == "Axel error: FooBar"
2559 2567
    assert resp.json['err'] == 'error'
2560 2568

  
2561 2569

  
2570
@freezegun.freeze_time('2019-09-01')
2562 2571
@pytest.mark.parametrize('value', ['foo', '20/01/2020', '2020'])
2563 2572
def test_clae_booking_activity_possible_days_endpoint_bad_date_format(app, resource, value):
2564 2573
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2565
    resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=%s&activity_type=MAT' % value, status=400)
2574
    resp = app.get(
2575
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2576
        '&start_date=%s&end_date=2020-01-24&activity_type=MAT' % value, status=400)
2577
    assert resp.json['err_desc'] == "bad date format, should be YYYY-MM-DD"
2578
    assert resp.json['err'] == 'bad-request'
2579
    resp = app.get(
2580
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2581
        '&start_date=2020-02-20&end_date=%s&activity_type=MAT' % value, status=400)
2566 2582
    assert resp.json['err_desc'] == "bad date format, should be YYYY-MM-DD"
2567 2583
    assert resp.json['err'] == 'bad-request'
2568 2584

  
2569 2585

  
2586
@freezegun.freeze_time('2019-09-01')
2570 2587
def test_clae_booking_activity_possible_days_endpoint_activity_type(app, resource):
2571 2588
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2572
    resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=FOO', status=400)
2589
    resp = app.get(
2590
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2591
        '&start_date=2020-01-20&end_date=2020-01-24&activity_type=FOO', status=400)
2573 2592
    assert resp.json['err_desc'] == "bad activity_type, should be MAT, MIDI, SOIR or GARD"
2574 2593
    assert resp.json['err'] == 'bad-request'
2575 2594

  
2576 2595

  
2596
@freezegun.freeze_time('2019-09-01')
2577 2597
def test_clae_booking_activity_possible_days_endpoint_no_result(app, resource, child_activities_data):
2578
    resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2598
    resp = app.get(
2599
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2600
        '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2579 2601
    assert resp.json['err_desc'] == "Person not found"
2580 2602
    assert resp.json['err'] == 'not-found'
2581 2603

  
......
2586 2608
    with mock_getdata(content, 'EnfantsActivites'):
2587 2609
        with mock.patch('passerelle.contrib.toulouse_axel.models.reservation_periode') as operation:
2588 2610
            operation.side_effect = AxelError('FooBar')
2589
            resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=4242&booking_date=2020-01-20&activity_type=MAT')
2611
            resp = app.get(
2612
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=4242'
2613
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2590 2614
    assert resp.json['err_desc'] == "Child not found"
2591 2615
    assert resp.json['err'] == 'not-found'
2592 2616

  
......
2606 2630
    activities = child_activities_data['ENFANT'][0]
2607 2631
    with mock_getdata(content, 'ReservationPeriode'):
2608 2632
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2609
            resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2633
            resp = app.get(
2634
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2635
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2610 2636
    assert resp.json['err_desc'] == "Child not found"
2611 2637
    assert resp.json['err'] == 'not-found'
2612 2638

  
2613
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.clae_booking_activities_info') as activities_info:
2614
        activities_info.return_value = {'data': []}
2615
        resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2639
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_booking_data') as activities_info:
2640
        activities_info.return_value = {'ACTIVITE': []}
2641
        resp = app.get(
2642
            '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2643
            '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2616 2644
    assert resp.json['err'] == 0
2617 2645
    assert resp.json['data'] == []
2618 2646

  
2619 2647

  
2648
@freezegun.freeze_time('2019-09-01')
2620 2649
def test_clae_booking_activity_possible_days_endpoint(app, resource, child_activities_data):
2621 2650
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2622 2651
    content = """<PORTAIL>
......
2635 2664
    activities = child_activities_data['ENFANT'][0]
2636 2665
    with mock_getdata(content, 'ReservationPeriode'):
2637 2666
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2638
            resp = app.get('/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2667
            resp = app.get(
2668
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2669
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2639 2670
    assert resp.json['err'] == 0
2640 2671
    assert len(resp.json['data']) == 5
2641 2672
    assert set(resp.json['data'][0].keys()) == set(['id', 'text', 'disabled', 'prefill', 'details'])
2642
    assert resp.json['data'][0]['id'] == '3535-MAT-A19P1M1-monday'
2643
    assert resp.json['data'][1]['id'] == '3535-MAT-A19P1M1-tuesday'
2644
    assert resp.json['data'][2]['id'] == '3535-MAT-A19P1M1-wednesday'
2645
    assert resp.json['data'][3]['id'] == '3535-MAT-A19P1M1-thursday'
2646
    assert resp.json['data'][4]['id'] == '3535-MAT-A19P1M1-friday'
2647
    assert resp.json['data'][0]['text'] == 'Monday'
2648
    assert resp.json['data'][1]['text'] == 'Tuesday'
2649
    assert resp.json['data'][2]['text'] == 'Wednesday'
2650
    assert resp.json['data'][3]['text'] == 'Thursday'
2651
    assert resp.json['data'][4]['text'] == 'Friday'
2673
    assert resp.json['data'][0]['id'] == '3535-MAT-A19P1M1-2020-01-20'
2674
    assert resp.json['data'][1]['id'] == '3535-MAT-A19P1M1-2020-01-21'
2675
    assert resp.json['data'][2]['id'] == '3535-MAT-A19P1M1-2020-01-22'
2676
    assert resp.json['data'][3]['id'] == '3535-MAT-A19P1M1-2020-01-23'
2677
    assert resp.json['data'][4]['id'] == '3535-MAT-A19P1M1-2020-01-24'
2678
    assert resp.json['data'][0]['text'] == 'Monday 20 January 2020'
2679
    assert resp.json['data'][1]['text'] == 'Tuesday 21 January 2020'
2680
    assert resp.json['data'][2]['text'] == 'Wednesday 22 January 2020'
2681
    assert resp.json['data'][3]['text'] == 'Thursday 23 January 2020'
2682
    assert resp.json['data'][4]['text'] == 'Friday 24 January 2020'
2652 2683
    assert resp.json['data'][0]['disabled'] is False
2653 2684
    assert resp.json['data'][1]['disabled'] is False
2654 2685
    assert resp.json['data'][2]['disabled'] is True
......
2660 2691
    assert resp.json['data'][3]['prefill'] is False
2661 2692
    assert resp.json['data'][4]['prefill'] is True
2662 2693

  
2694
    with mock_getdata(content, 'ReservationPeriode'):
2695
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2696
            resp = app.get(
2697
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2698
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2663 2699

  
2700
    # again - data are in cache
2701
    resp = app.get(
2702
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2703
        '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2704
    assert resp.json['err'] == 0
2705
    assert len(resp.json['data']) == 5
2706

  
2707

  
2708
@pytest.mark.parametrize('today, start_date, first_date, end_date, last_date', [
2709
    # today is start date -> + 8 days
2710
    ('2020-03-26', '2020-03-26', '2020-04-03', '2020-04-17', '2020-04-17'),
2711
    # start date is a friday => starts friday
2712
    ('2020-03-26', '2020-04-03', '2020-04-03', '2020-04-17', '2020-04-17'),
2713
    # start date is a saturday => starts on next monday
2714
    ('2020-03-26', '2020-04-04', '2020-04-06', '2020-04-17', '2020-04-17'),
2715
    # start date is a sunday => starts on next monday
2716
    ('2020-03-26', '2020-04-05', '2020-04-06', '2020-04-17', '2020-04-17'),
2717
    # start date is a monday => starts on monday
2718
    ('2020-03-26', '2020-04-06', '2020-04-06', '2020-04-17', '2020-04-17'),
2719
    # start date is a tuesday => starts on tuesday
2720
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-17', '2020-04-17'),
2721
    # end date is a not a friday => ends on friday
2722
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-13', '2020-04-17'),
2723
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-14', '2020-04-17'),
2724
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-15', '2020-04-17'),
2725
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-16', '2020-04-17'),
2726
    # except if end date is saturday or sunday => ends on previous friday
2727
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-18', '2020-04-17'),
2728
    ('2020-03-26', '2020-04-07', '2020-04-07', '2020-04-19', '2020-04-17'),
2729
    # start date is after end date, same week
2730
    ('2020-03-26', '2020-04-16', '2020-04-16', '2020-04-15', '2020-04-17'),
2731
    # start date is after end date, not the same week => result is empty
2732
    ('2020-03-26', '2020-04-16', None, '2020-04-12', None),
2733
])
2734
def test_clae_booking_activity_possible_days_period(app, resource, child_activities_data, today, start_date, first_date, end_date, last_date):
2735
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2736

  
2737
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_booking_data') as activities_info:
2738
        activities_info.return_value = {'ACTIVITE': [{
2739
            'id': 'TOTO',
2740
            'booking': {'days': {'monday': True, 'tuesday': True, 'wednesday': True, 'thursday': True, 'friday': True}}
2741
        }]}
2742
        with freezegun.freeze_time(today):
2743
            resp = app.get(
2744
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2745
                '&start_date=%s&end_date=%s&activity_type=MAT' % (start_date, end_date))
2746
    if first_date is None:
2747
        assert resp.json['data'] == []
2748
    else:
2749
        assert resp.json['data'][0]['id'] == '3535-MAT-TOTO-%s' % first_date
2750
        assert resp.json['data'][-1]['id'] == '3535-MAT-TOTO-%s' % last_date
2751

  
2752

  
2753
@freezegun.freeze_time('2019-09-01')
2664 2754
def test_clae_booking_activity_prefill_endpoint_axel_error(app, resource):
2665 2755
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2666 2756
    with mock.patch('passerelle.contrib.toulouse_axel.models.enfants_activites') as operation:
2667 2757
        operation.side_effect = AxelError('FooBar')
2668
        resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2758
        resp = app.get(
2759
            '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2760
            '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2669 2761
    assert resp.json['err_desc'] == "Axel error: FooBar"
2670 2762
    assert resp.json['err'] == 'error'
2671 2763

  
......
2675 2767
    with mock_getdata(content, 'EnfantsActivites'):
2676 2768
        with mock.patch('passerelle.contrib.toulouse_axel.models.reservation_periode') as operation:
2677 2769
            operation.side_effect = AxelError('FooBar')
2678
            resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2770
            resp = app.get(
2771
                '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2772
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2679 2773
    assert resp.json['err_desc'] == "Axel error: FooBar"
2680 2774
    assert resp.json['err'] == 'error'
2681 2775

  
2682 2776

  
2777
@freezegun.freeze_time('2019-09-01')
2683 2778
@pytest.mark.parametrize('value', ['foo', '20/01/2020', '2020'])
2684 2779
def test_clae_booking_activity_prefill_endpoint_bad_date_format(app, resource, value):
2685 2780
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2686
    resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=%s&activity_type=MAT' % value, status=400)
2781
    resp = app.get(
2782
        '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2783
        '&start_date=%s&end_date=2020-01-24&activity_type=MAT' % value, status=400)
2784
    assert resp.json['err_desc'] == "bad date format, should be YYYY-MM-DD"
2785
    assert resp.json['err'] == 'bad-request'
2786
    resp = app.get(
2787
        '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2788
        '&start_date=2020-01-20&end_date=%s&activity_type=MAT' % value, status=400)
2687 2789
    assert resp.json['err_desc'] == "bad date format, should be YYYY-MM-DD"
2688 2790
    assert resp.json['err'] == 'bad-request'
2689 2791

  
2690 2792

  
2793
@freezegun.freeze_time('2019-09-01')
2691 2794
def test_clae_booking_activity_prefill_endpoint_activity_type(app, resource):
2692 2795
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2693
    resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=FOO', status=400)
2796
    resp = app.get(
2797
        '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2798
        '&start_date=2020-01-20&end_date=2020-01-24&activity_type=FOO', status=400)
2694 2799
    assert resp.json['err_desc'] == "bad activity_type, should be MAT, MIDI, SOIR or GARD"
2695 2800
    assert resp.json['err'] == 'bad-request'
2696 2801

  
2697 2802

  
2803
@freezegun.freeze_time('2019-09-01')
2698 2804
def test_clae_booking_activity_prefill_endpoint_no_result(app, resource, child_activities_data):
2699
    resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2805
    resp = app.get(
2806
        '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2807
        '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2700 2808
    assert resp.json['err_desc'] == "Person not found"
2701 2809
    assert resp.json['err'] == 'not-found'
2702 2810

  
......
2707 2815
    with mock_getdata(content, 'EnfantsActivites'):
2708 2816
        with mock.patch('passerelle.contrib.toulouse_axel.models.reservation_periode') as operation:
2709 2817
            operation.side_effect = AxelError('FooBar')
2710
            resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=4242&booking_date=2020-01-20&activity_type=MAT')
2818
            resp = app.get(
2819
                '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=4242'
2820
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2711 2821
    assert resp.json['err_desc'] == "Child not found"
2712 2822
    assert resp.json['err'] == 'not-found'
2713 2823

  
......
2727 2837
    activities = child_activities_data['ENFANT'][0]
2728 2838
    with mock_getdata(content, 'ReservationPeriode'):
2729 2839
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2730
            resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2840
            resp = app.get(
2841
                '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2842
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2731 2843
    assert resp.json['err_desc'] == "Child not found"
2732 2844
    assert resp.json['err'] == 'not-found'
2733 2845

  
2734 2846
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.clae_booking_activity_possible_days') as possible_days:
2735 2847
        possible_days.return_value = {'data': []}
2736
        resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2848
        resp = app.get(
2849
            '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2850
            '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2737 2851
    assert resp.json['err'] == 0
2738 2852
    assert resp.json['data'] == []
2739 2853

  
2740 2854

  
2741
def test_clae_booking_activity_prefill_endpoint(app, resource, child_activities_data):
2855
def test_clae_booking_activity_prefill_endpoint(app, resource):
2742 2856
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2743 2857
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.clae_booking_activity_possible_days') as possible_days:
2744 2858
        possible_days.return_value = {
2745 2859
            'data': [
2746 2860
                {
2747
                    'id': '3535-MAT-A19P1M1-monday',
2861
                    'id': '3535-MAT-A19P1M1-2020-01-20',
2748 2862
                    'prefill': True,
2749 2863
                },
2750 2864
                {
2751
                    'id': '3535-MAT-A19P1M1-tuesday',
2865
                    'id': '3535-MAT-A19P1M1-2020-01-21',
2752 2866
                    'prefill': False,
2753 2867
                },
2754 2868
                {
2755
                    'id': '3535-MAT-A19P1M1-wednesday',
2869
                    'id': '3535-MAT-A19P1M1-2020-01-22',
2756 2870
                    'prefill': None,
2757 2871
                },
2758 2872
                {
2759
                    'id': '3535-MAT-A19P1M1-thursday',
2873
                    'id': '3535-MAT-A19P1M1-2020-01-23',
2760 2874
                    'prefill': False,
2761 2875
                },
2762 2876
                {
2763
                    'id': '3535-MAT-A19P1M1-friday',
2877
                    'id': '3535-MAT-A19P1M1-2020-01-24',
2764 2878
                    'prefill': True,
2765 2879
                },
2766 2880
            ]
2767 2881
        }
2768
        resp = app.get('/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535&booking_date=2020-01-20&activity_type=MAT')
2882
        resp = app.get(
2883
            '/toulouse-axel/test/clae_booking_activity_prefill?NameID=yyy&idpersonne=3535'
2884
            '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2769 2885
    assert resp.json['err'] == 0
2770
    assert resp.json['data'] == ['3535-MAT-A19P1M1-monday', '3535-MAT-A19P1M1-friday']
2886
    assert resp.json['data'] == ['3535-MAT-A19P1M1-2020-01-20', '3535-MAT-A19P1M1-2020-01-24']
2771 2887

  
2772 2888

  
2773 2889
def test_are_children_registered_axel_error(resource):
2774
-