diff --git a/functests/toulouse_maelis/conftest.py b/functests/toulouse_maelis/conftest.py index bbc22ae1..24008303 100644 --- a/functests/toulouse_maelis/conftest.py +++ b/functests/toulouse_maelis/conftest.py @@ -437,6 +437,8 @@ def create_data(request, conn): 'lastname': lastname, 'rl1_num': data['RL1']['num'], 'bart_num': data['childList'][0]['num'], + 'maggie_num': data['childList'][1]['num'], + 'hugo_num': data['childList'][2]['num'], 'data': data, } @@ -508,3 +510,131 @@ def update_data(request, conn): 'maggie_num': data['childList'][2]['num'], 'data': data, } + + +@pytest.fixture(scope='session') +def reference_year(): + some_date = datetime.date.today() + if some_date.month <= 8: + # between january and august, reference year is the year just before + return some_date.year - 1 + return some_date.year + + +def get_subscription_info(nature, activity_text, unit_text, place_text, con, name_id, person_id, year): + def select_item(resp, text): + item = None + for item in resp.json()['data']: + if item['text'] == text: + break + else: + raise Exception("do not find '%s'" % text) + return item + + # select activity + url = con + '/get-person-activity-list' + params = { + 'NameID': name_id, + 'person_id': person_id, + 'start_date': '%s-09-01' % year, + 'end_date': '%s-08-31' % (year + 1), + 'nature': nature, + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) > 0 + activity = select_item(resp, activity_text) + + # select unit + url = con + '/get-person-unit-list' + params = { + 'NameID': name_id, + 'person_id': person_id, + 'start_date': '%s-09-01' % year, + 'end_date': '%s-08-31' % (year + 1), + 'activity_id': activity['id'], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) > 0 + unit = select_item(resp, unit_text) + + # select place + url = con + '/get-person-place-list' + params = { + 'NameID': name_id, + 'person_id': person_id, + 'start_date': '%s-09-01' % year, + 'end_date': '%s-08-31' % (year + 1), + 'activity_id': activity['id'], + 'unit_id': unit['id'], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) > 0 + place = select_item(resp, place_text) + assert place['capacityInfo']['controlOK'] is True + + # check subscription info + url = con + '/get-person-subscription-info' + params = { + 'NameID': name_id, + 'person_id': person_id, + 'activity_id': activity['id'], + 'unit_id': unit['id'], + 'place_id': place['id'], + 'ref_date': datetime.date.today().strftime('%Y-%m-%d'), + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + info = resp.json()['data'] + assert info['controlResult']['controlOK'] is True + return { + 'activity': activity, + 'unit': unit, + 'place': place, + 'info': info, + } + + +@pytest.fixture(scope='session') +def extrasco_subscribe_info(conn, create_data, reference_year): + unlink(conn, create_data['name_id']) + link(conn, create_data) + + return get_subscription_info( + 'EXTRASCO', + # Sigec made this extra-sco activity available for functests + 'ADL ELEMENTAIRE Maourine Avril 2023', + 'ADL ELEMENTAIRE Maourine Avril 2023', + 'MAOURINE (la) ELEMENTAIRE', + conn, + create_data['name_id'], + create_data['bart_num'], + reference_year, + ) + + +@pytest.fixture(scope='session') +def perisco_subscribe_info(conn, create_data, reference_year): + '''This fixture is a configuration trick from Sigec + as peri-sco should not be available for subscription + and as a consequence, should not be displayed from catalogs''' + unlink(conn, create_data['name_id']) + link(conn, create_data) + + return get_subscription_info( + None, + # Sigec made this peri-sco activity available for functests + 'TEMPS DU MIDI 22/23', + 'TEMPS DU MIDI 22/23', + 'DOLTO FRANCOISE MATERNELLE', + conn, + create_data['name_id'], + create_data['bart_num'], + reference_year, + ) diff --git a/functests/toulouse_maelis/test_03_perisco.py b/functests/toulouse_maelis/test_03_perisco.py new file mode 100644 index 00000000..744c9600 --- /dev/null +++ b/functests/toulouse_maelis/test_03_perisco.py @@ -0,0 +1,174 @@ +import datetime + +import requests + + +def test_perisco(perisco_subscribe_info): + assert perisco_subscribe_info['info']['activity']['libelle1'] == 'TEMPS DU MIDI 22/23' + + +def test_perisco_agenda(conn, create_data, perisco_subscribe_info): + # subscription + url = conn + '/add-person-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': perisco_subscribe_info['activity']['id'], + 'unit_id': perisco_subscribe_info['unit']['id'], + 'place_id': perisco_subscribe_info['place']['id'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + # find first available booking + url = conn + '/read-child-agenda?NameID=%s' % create_data['name_id'] + params = { + 'child_id': create_data['bart_num'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) > 0 + booking = None + for booking in resp.json()['data']: + if booking['disabled'] is False: + break + else: + raise Exception("no booking available") + assert booking['details']['activity_id'] == perisco_subscribe_info['activity']['id'] + assert booking['prefill'] is False + + # book activity + url = conn + '/update-child-agenda?NameID=%s' % create_data['name_id'] + payload = { + 'child_id': create_data['bart_num'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + 'booking_list': [booking['id']], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json() == { + 'updated': True, + 'count': 1, + 'changes': [ + { + 'booked': True, + 'activity_id': booking['details']['activity_id'], + 'activity_label': 'Restauration scolaire', + 'day': booking['details']['day_str'], + } + ], + 'err': 0, + } + + # check booking + url = conn + '/read-child-agenda?NameID=%s' % create_data['name_id'] + params = { + 'child_id': create_data['bart_num'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert [x['prefill'] for x in resp.json()['data'] if x['id'] == booking['id']][0] is True + + +def test_perisco_recurrent_week(conn, create_data, perisco_subscribe_info, reference_year): + # no subscribed activity + url = conn + '/read-subscribe-activity-list?NameID=%s' % create_data['name_id'] + params = { + 'person_id': create_data['maggie_num'], + 'nature': 'PERISCO', + 'school_year': '%s-%s' % (reference_year, reference_year + 1), + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) == 0 + + # subscription + url = conn + '/add-person-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['maggie_num'], + 'activity_id': perisco_subscribe_info['activity']['id'], + 'unit_id': perisco_subscribe_info['unit']['id'], + 'place_id': perisco_subscribe_info['place']['id'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + url = conn + '/read-subscribe-activity-list?NameID=%s' % create_data['name_id'] + params = { + 'person_id': create_data['maggie_num'], + 'nature': 'PERISCO', + 'school_year': '%s-%s' % (reference_year, reference_year + 1), + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert len(resp.json()['data']) == 1 + assert resp.json()['data'][0]['id'] == perisco_subscribe_info['activity']['id'] + + # get recurent-week gabarit + url = conn + '/get-recurrent-week?NameID=%s' % create_data['name_id'] + params = { + 'person_id': create_data['maggie_num'], + 'activity_id': perisco_subscribe_info['activity']['id'], + 'ref_date': datetime.date.today().strftime('%Y-%m-%d'), + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert [(x['id'], x['day']) for x in resp.json()['data']] == [ + ('1-X', 'Lundi'), + ('2-X', 'Mardi'), + ('4-X', 'Jeudi'), + ('5-X', 'Vendredi'), + ] + + # no booking + url = conn + '/read-child-agenda?NameID=%s' % create_data['name_id'] + params = { + 'child_id': create_data['maggie_num'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert not any(x['prefill'] for x in resp.json()['data']) + + # set recurent-week gabarit + url = conn + '/update-recurrent-week?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['maggie_num'], + 'activity_id': perisco_subscribe_info['activity']['id'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + 'recurrent_week': ['1-X', '2-X'], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['data'] == 'ok' + + # there is now some bookings + url = conn + '/read-child-agenda?NameID=%s' % create_data['name_id'] + params = { + 'child_id': create_data['maggie_num'], + 'start_date': perisco_subscribe_info['unit']['dateStart'][:10], + 'end_date': perisco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert any(x['prefill'] for x in resp.json()['data']) diff --git a/functests/toulouse_maelis/test_04_loisirs.py b/functests/toulouse_maelis/test_04_loisirs.py new file mode 100644 index 00000000..80e34f22 --- /dev/null +++ b/functests/toulouse_maelis/test_04_loisirs.py @@ -0,0 +1,21 @@ +import datetime + +import requests + +from .conftest import link, unlink + +# LOISIR is a subset of EXTRACO, we only test the genaral catalog cell here + + +def test_catalog_general_loisirs(conn, update_data): + unlink(conn, update_data['name_id']) + link(conn, update_data) + url = conn + '/read-activity-list' + params = {'ref_date': datetime.date.today().strftime('%Y-%m-%d')} + + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + # still not nature code defined on LOISIR activities + assert len(resp.json()['data']) == 0 diff --git a/functests/toulouse_maelis/test_05_extrasco.py b/functests/toulouse_maelis/test_05_extrasco.py new file mode 100644 index 00000000..29eb996c --- /dev/null +++ b/functests/toulouse_maelis/test_05_extrasco.py @@ -0,0 +1,198 @@ +import requests + + +def test_catalog_personnalise_extrasco(extrasco_subscribe_info): + assert extrasco_subscribe_info['info']['activity']['libelle1'] == 'ADL ELEMENTAIRE Maourine Avril 2023' + assert extrasco_subscribe_info['info']['calendarGeneration']['code'] == 'REQUIRED' + assert extrasco_subscribe_info['info']['billingInformation'] == { + 'modeFact': 'PRESENCE', + 'quantity': None, + 'unitPrice': 43.0, + } + + +def test_direct_subscribe(conn, create_data, extrasco_subscribe_info, reference_year): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + + url = conn + '/add-person-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['hugo_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + # no idIns provided to remove subscription later + assert resp.json()['data'] == {'controlOK': True, 'message': None} + + +def test_subscribe_with_conveyance(conn, create_data, extrasco_subscribe_info): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + + assert extrasco_subscribe_info['info']['conveyance'] is not None + morning = [ + x['id'] for x in extrasco_subscribe_info['info']['conveyance']['morningJourney']['depositPlaceList'] + ] + afternoon = [ + x['id'] for x in extrasco_subscribe_info['info']['conveyance']['afternoonJourney']['depositPlaceList'] + ] + assert len(morning) > 0 + assert len(afternoon) > 0 + + url = conn + '/add-person-basket-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'conveyanceSubscribe/idPlaceMorning': morning[0], + 'conveyanceSubscribe/idPlaceAfternoon': afternoon[0], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + basket_id = resp.json()['data']['basket']['id'] + + # remove subscription + url = conn + '/delete-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + +def test_subscribe_with_recurrent_week(conn, create_data, extrasco_subscribe_info): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + assert [(x['id'], x['day']) for x in extrasco_subscribe_info['info']['recurrent_week']] == [ + ('1-C', 'Lundi'), + ('1-B', 'Lundi'), + ('2-C', 'Mardi'), + ('2-B', 'Mardi'), + ('3-C', 'Mercredi'), + ('3-B', 'Mercredi'), + ('4-C', 'Jeudi'), + ('4-B', 'Jeudi'), + ('5-C', 'Vendredi'), + ('5-B', 'Vendredi'), + ] + + url = conn + '/add-person-basket-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'recurrent_week': ['1-B', '2-C'], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + basket_id = resp.json()['data']['basket']['id'] + + # there is now some bookings + url = conn + '/read-activity-agenda?NameID=%s' % create_data['name_id'] + params = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert any(x['prefill'] for x in resp.json()['data']) + + # remove subscription + url = conn + '/delete-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + + +def test_subscribe_with_agenda(conn, create_data, extrasco_subscribe_info): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + + def get_bookings(): + url = conn + '/read-activity-agenda?NameID=%s' % create_data['name_id'] + params = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + return resp.json()['data'] + + # subscribe witout providing calandar + url = conn + '/add-person-basket-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + basket_id = resp.json()['data']['basket']['id'] + + # no booking + assert not any(x['prefill'] for x in get_bookings()) + + # book using info calendar gabarit (booking registered from w.c.s. form) + assert len(extrasco_subscribe_info['info']['agenda']) > 0 + assert not any(x['prefill'] for x in extrasco_subscribe_info['info']['agenda']) + slots = [x['id'] for x in extrasco_subscribe_info['info']['agenda'] if x['disabled'] is False] + url = conn + '/update-activity-agenda/?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'booking_list': [slots[0], slots[-1]], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['updated'] is True + assert [x['booked'] for x in resp.json()['changes']] == [True, True] + + # there is now 2 bookings + assert len([x['prefill'] for x in get_bookings() if x['prefill'] is True]) == 2 + + # unbook slots + url = conn + '/update-activity-agenda/?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'booking_list': [], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['updated'] is True + assert [x['booked'] for x in resp.json()['changes']] == [False, False] + assert not any(x['prefill'] for x in get_bookings()) + + # remove subscription + url = conn + '/delete-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 diff --git a/functests/toulouse_maelis/test_06_basket.py b/functests/toulouse_maelis/test_06_basket.py new file mode 100644 index 00000000..09a27b26 --- /dev/null +++ b/functests/toulouse_maelis/test_06_basket.py @@ -0,0 +1,190 @@ +import requests + + +def test_basket_subscribe(conn, create_data, extrasco_subscribe_info, reference_year): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + + def get_baskets(): + url = conn + '/get-baskets?NameID=%s' % create_data['name_id'] + resp = requests.get(url) + resp.raise_for_status() + assert resp.json()['err'] == 0 + return resp.json()['data'] + + def subscribe(person_id): + url = conn + '/add-person-basket-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': person_id, + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + return resp + + def subscriptions(person_id): + url = conn + '/read-subscribe-activity-list?NameID=%s' % create_data['name_id'] + params = { + 'person_id': person_id, + 'nature': 'EXTRASCO', + 'school_year': '%s-%s' % (reference_year, reference_year + 1), + } + resp = requests.get(url, params=params) + resp.raise_for_status() + assert resp.json()['err'] == 0 + return resp.json()['data'] + + # no subscription + assert subscriptions(create_data['bart_num']) == [] + assert subscriptions(create_data['maggie_num']) == [] + + # empty basket + assert get_baskets() == [] + + # subscribe Bart + resp = subscribe(create_data['bart_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert data['basket']['codeRegie'] == 105 + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 1 + assert len({x['idIns'] for x in data['basket']['lignes']}) == 3 + + assert len(subscriptions(create_data['bart_num'])) == 1 + assert subscriptions(create_data['maggie_num']) == [] + + # basket + data = get_baskets() + assert len(data) == 1 + assert data[0]['codeRegie'] == 105 + assert data[0]['text'] == 'ENFANCE LOISIRS ET PE' + assert len(data[0]['lignes']) == 3 + assert len({x['personneInfo']['numPerson'] for x in data[0]['lignes']}) == 1 + + # get 3 idIns because we subscribe a generic unit + assert len({x['idIns'] for x in data[0]['lignes']}) == 3 + basket_id = data[0]['id'] + + # cannot subscribe Bart twice + resp = subscribe(create_data['bart_num']) + assert resp.json()['err'] == 1 + # assert 'E1019' in resp.json()['err_desc'] #2206 + assert len(get_baskets()) == 1 + + # delete basket + # should be call by user or by cron job + url = conn + '/delete-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['data'] == 'ok' + assert get_baskets() == [] + assert subscriptions(create_data['bart_num']) == [] + + # subscribe Bart + resp = subscribe(create_data['bart_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 1 + assert len(subscriptions(create_data['bart_num'])) == 1 + + # subscribe Maggie + resp = subscribe(create_data['maggie_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 2 + assert len(subscriptions(create_data['maggie_num'])) == 1 + + # delete (generic) basket line for Bart + data = get_baskets() + assert len(data) == 1 + assert len(data[0]['lignes']) == 6 + basket_id = data[0]['id'] + # idIns for the generic unit + line_id = [ + y['id'] + for x in data + for y in x['lignes'] + if y['personneInfo']['numPerson'] == int(create_data['bart_num']) + if y['inscription']['idUnit'] == extrasco_subscribe_info['unit']['id'] + ][0] + url = conn + '/delete-basket-line?NameID=%s' % create_data['name_id'] + payload = { + 'basket_id': basket_id, + 'line_id': line_id, + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['codeRegie'] == None # #2207 + assert len({x['personneInfo']['numPerson'] for x in data['lignes']}) == 1 + assert len({x['idIns'] for x in data['lignes']}) == 3 + data = get_baskets() + assert len(data) == 1 + assert len(get_baskets()) == 1 + assert len(data[0]['lignes']) == 3 + assert subscriptions(create_data['bart_num']) == [] + assert len(subscriptions(create_data['maggie_num'])) == 1 + + # re-subscribe Bart + resp = subscribe(create_data['bart_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 2 + assert len(subscriptions(create_data['bart_num'])) == 1 + + # add bookings to Bart + slots = [x['id'] for x in extrasco_subscribe_info['info']['agenda'] if x['disabled'] is False] + url = conn + '/update-activity-agenda/?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['bart_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'booking_list': [slots[0], slots[-1]], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['updated'] is True + assert [x['booked'] for x in resp.json()['changes']] == [True, True] + + # add bookings to Maggie + slots = [':'.join([create_data['maggie_num']] + x.split(':')[1:]) for x in slots] + url = conn + '/update-activity-agenda/?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': create_data['maggie_num'], + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + 'booking_list': [slots[0], slots[-1]], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + assert resp.json()['updated'] is True + assert [x['booked'] for x in resp.json()['changes']] == [True, True] + + # validate basket + url = conn + '/validate-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert len(data['idInsLst']) == 6 + assert len(data['factureLst']) == 0 # No invoice #2187 + assert get_baskets() == [] + + assert len(subscriptions(create_data['bart_num'])) == 1 + assert len(subscriptions(create_data['maggie_num'])) == 1 + + # call cancelInvoiceAndDeleteSubscribeList de remove subscriptions diff --git a/functests/toulouse_maelis/test_07_invoice.py b/functests/toulouse_maelis/test_07_invoice.py index 06c106b7..3fafb467 100644 --- a/functests/toulouse_maelis/test_07_invoice.py +++ b/functests/toulouse_maelis/test_07_invoice.py @@ -1,3 +1,4 @@ +import pytest import requests from .conftest import diff, link, unlink @@ -34,3 +35,75 @@ def test_direct_debit_order(conn, create_data): res = resp.json() res['data']['numPerson'] = 'N/A' assert diff(res['data'], 'test_get_rl1_direct_debit_order.json') + + +@pytest.mark.xfail(run=False) +def test_basket_subscribe(conn, create_data, extrasco_subscribe_info, reference_year): + assert extrasco_subscribe_info['info']['controlResult']['controlOK'] is True + + def get_baskets(): + url = conn + '/get-baskets?NameID=%s' % create_data['name_id'] + resp = requests.get(url) + resp.raise_for_status() + assert resp.json()['err'] == 0 + return resp.json()['data'] + + def subscribe(person_id): + url = conn + '/add-person-basket-subscription?NameID=%s' % create_data['name_id'] + payload = { + 'person_id': person_id, + 'activity_id': extrasco_subscribe_info['activity']['id'], + 'unit_id': extrasco_subscribe_info['unit']['id'], + 'place_id': extrasco_subscribe_info['place']['id'], + 'start_date': extrasco_subscribe_info['unit']['dateStart'][:10], + 'end_date': extrasco_subscribe_info['unit']['dateEnd'][:10], + } + resp = requests.post(url, json=payload) + resp.raise_for_status() + return resp + + # empty basket + assert get_baskets() == [] + + # subscribe Bart + resp = subscribe(create_data['bart_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert data['basket']['codeRegie'] == 105 + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 1 + assert len({x['idIns'] for x in data['basket']['lignes']}) == 3 + + # subscribe Maggie + resp = subscribe(create_data['maggie_num']) + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert data['controlResult'] == {'controlOK': True, 'message': None} + assert len({x['personneInfo']['numPerson'] for x in data['basket']['lignes']}) == 2 + + # basket + data = get_baskets() + assert len(data) == 1 + assert data[0]['codeRegie'] == 105 + assert data[0]['text'] == 'ENFANCE LOISIRS ET PE' + assert len(data[0]['lignes']) == 3 + assert len({x['personneInfo']['numPerson'] for x in data[0]['lignes']}) == 1 + + # get 3 idIns because we subscribe a generic unit + assert len({x['idIns'] for x in data[0]['lignes']}) == 3 + basket_id = data[0]['id'] + + # validate basket + url = conn + '/validate-basket?NameID=%s' % create_data['name_id'] + payload = {'basket_id': basket_id} + resp = requests.post(url, json=payload) + resp.raise_for_status() + assert resp.json()['err'] == 0 + data = resp.json()['data'] + assert len(data['idInsLst']) == 6 + assert len(data['factureLst']) == 0 + assert get_baskets() == [] + + # to continue : + # cancelInvoiceAndDeleteSubscribeList + # payInvoice