From 85256615a62eee5fa7f201dd815f1ceb38284148 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 30 May 2022 15:39:34 +0200 Subject: [PATCH] dpark: add support for methods PLS_ENREG2 and PLS_NOTIFCB2 (#65777) --- passerelle/contrib/dpark/models.py | 47 ++++++---- tests/data/dpark.awws.wsdl | 75 ++++++++++++++- tests/test_dpark.py | 144 ++++++++++++++++++++++++++++- 3 files changed, 247 insertions(+), 19 deletions(-) diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py index e8c25b36..31592098 100644 --- a/passerelle/contrib/dpark/models.py +++ b/passerelle/contrib/dpark/models.py @@ -31,7 +31,7 @@ from zeep.helpers import serialize_object from passerelle.base.models import BaseResource from passerelle.utils.api import endpoint -from passerelle.utils.conversion import to_pdf +from passerelle.utils.conversion import any2bool, to_pdf from passerelle.utils.jsonresponse import APIError from passerelle.views import WrongParameter @@ -290,20 +290,21 @@ class DPark(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Register a subscription application')) def register(self, request, *args, **kwargs): data = json.loads(request.body) - is_erroneous( - data, - ( - 'application_id', - 'applicant_title', - 'applicant_lastname', - 'applicant_firstnames', - 'applicant_email', - 'address_sticode', - 'address_zipcode', - 'address_locality', - 'address_district', - ), - ) + double_plaque = any2bool(data.get('double_plaque')) + required_fields = [ + 'application_id', + 'applicant_title', + 'applicant_lastname', + 'applicant_firstnames', + 'applicant_email', + 'address_sticode', + 'address_zipcode', + 'address_locality', + 'address_district', + ] + if double_plaque: + required_fields.extend(['id_contexte', 'id_produit']) + is_erroneous(data, required_fields) application_id = data['application_id'] applicant = { 'Demandeur_Civilite': data['applicant_title'], @@ -339,7 +340,18 @@ class DPark(BaseResource): 'Demande_IBAN': data.get('application_bank_iban', ''), 'Demande_BIC': data.get('application_bank_bic', ''), } - reply = self.call('PLS_ENREG', application_id, applicant, address, application) + if double_plaque: + reply = self.call( + 'PLS_ENREG2', + application_id, + applicant, + address, + application, + data['id_produit'], + data['id_contexte'], + ) + else: + reply = self.call('PLS_ENREG', application_id, applicant, address, application) if filenumber: for pairing in Pairing.objects.filter(filenumber=filenumber): pairing.clear_cache() @@ -499,8 +511,9 @@ class DPark(BaseResource): total_amount = int(data['total_amount']) * 100 # in cents if not pairings: raise APIError(_('No pairing exists')) + double_plaque = any2bool(data.get('double_plaque')) self.call( - 'PLS_NOTIFCB', + 'PLS_NOTIFCB2' if double_plaque else 'PLS_NOTIFCB', data['application_external_id'], data['filenumber'], data['application_id'], diff --git a/tests/data/dpark.awws.wsdl b/tests/data/dpark.awws.wsdl index f9983371..73649ca8 100644 --- a/tests/data/dpark.awws.wsdl +++ b/tests/data/dpark.awws.wsdl @@ -360,6 +360,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -434,6 +469,18 @@ + + + + + + + + + + + + @@ -484,6 +531,14 @@ + + + + + + + + @@ -595,10 +650,28 @@ + + + + + + + + + + + + + + + + + + - + diff --git a/tests/test_dpark.py b/tests/test_dpark.py index 59ca29f6..20978d17 100644 --- a/tests/test_dpark.py +++ b/tests/test_dpark.py @@ -629,7 +629,9 @@ def test_registration(dpark, app, application_thirdparty_subscription): '%s' % repr(application_thirdparty_subscription).lower() ) - assert demande_abonnementtiers in force_text(dpark.mock_requests[0].body) + body = dpark.mock_requests[0].body.decode() + assert ':PLS_ENREG ' in body + assert demande_abonnementtiers in body assert resp.json['err'] == 1 assert resp.json['err_desc'] == 'Dossier incomplet' # with complete application @@ -766,3 +768,143 @@ def test_send_files(dpark, app, settings, freezer): base64.b64encode(to_pdf(JPEG_CONTENT)) ) assert base64.b64decode(pj_node.findall('Bloc_Fichiers')[3].find('Fichier').text).startswith(b'%PDF') + + +@pytest.mark.parametrize('application_thirdparty_subscription', [True, False]) +def test_registration_double_plaque(dpark, app, application_thirdparty_subscription): + url = '/dpark/test/register/' + params = { + "address_complement1": "", + "address_complement2": "", + "address_district": "PERI", + "address_locality": "Toulouse", + "address_sticode": "315553609651", + "address_streetext": "1", + "address_streetname": "", + "address_streetno": "16", + "address_zipcode": "31000", + "applicant_email": "sh@eggs.org", + "applicant_firstnames": "Spam Ham", + "applicant_lastname": "EGGS", + "applicant_mobilephone": "0655443322", + "applicant_phone": "", + "applicant_title": "1", + "application_car1_brand": "Peugeot", + "application_car1_exemption": "8", + "application_car1_model": "206", + "application_car1_plate": "AA777ZZ", + "application_id": "12-4", + "application_payment_type": "10", + "application_thirdparty_subscription": application_thirdparty_subscription, + "application_type": 1, + 'double_plaque': '1', + } + # with missing parameter + app.post_json(url, params=params, status=400) + params.update( + { + 'id_contexte': '1', + 'id_produit': '2', + } + ) + # with an imcplete application + dpark.mock_responses.append( + """ + + + + + + 02 + Dossier incomplet + + + +""" + ) + resp = app.post_json(url, params=params) + demande_abonnementtiers = ( + '%s' + % repr(application_thirdparty_subscription).lower() + ) + body = dpark.mock_requests[0].body.decode() + assert demande_abonnementtiers in body + assert ':PLS_ENREG2 ' in body + assert '1<' in body + assert '2<' in body + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'Dossier incomplet' + # with complete application + dpark.mock_responses.append( + """ + + + + + + 01 + + 22334 + 59492 + + + +""" + ) + resp = app.post_json(url, params=params) + body = dpark.mock_requests[1].body.decode() + assert demande_abonnementtiers in body + assert resp.json['data']['numerodossier'] == 22334 + assert resp.json['data']['numerodemande'] == 59492 + + +@pytest.mark.parametrize( + 'transaction_datetime,expected_date', + [ + ('20180611', '20180611'), + # UTC datetime should be converted to Europe/Paris date + ('2018-06-11T23:59:00', '20180612'), + ], +) +def test_payment_notification_double_plaque(dpark, app, transaction_datetime, expected_date): + operation = mock.Mock(name='PLS_NOTIFCB2') + service = mock.Mock(spec=['PLS_NOTIFCB2'], PLS_NOTIFCB2=operation) + create_service = mock.Mock(spec=[], return_value=service) + client = mock.NonCallableMock(spec=['create_service'], create_service=create_service) + with mock.patch('passerelle.contrib.dpark.models.get_client', return_value=client): + nameid = 'abcd' * 8 + filenumber = '1' * 9 + params = { + 'nameid': nameid, + 'filenumber': filenumber, + 'transaction_id': 'I123456789', + 'transaction_datetime': transaction_datetime, + 'total_amount': '125', + 'application_id': '61718', + 'application_external_id': 'E-8-N5UTAK6P', + 'double_plaque': '1', + } + url = '/dpark/test/notify-payment/' + resp = app.post_json(url, params=params) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'No pairing exists' + Pairing.objects.create( + resource=dpark, + **{ + 'nameid': nameid, + 'firstnames': 'spam eggs', + 'lastname': 'bar', + 'filenumber': filenumber, + 'badgenumber': '2' * 9, + }, + ) + operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu') + resp = app.post_json(url, params=params) + assert operation.call_args_list[-1].args[5] == expected_date + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'Dossier inconnu' + operation.return_value = mock.Mock(CodeRetour='01') + resp = app.post_json(url, params=params) + assert resp.json['data'] is True -- 2.35.1