From a374e1e49a6a17a337d004d6f9b29137065779d9 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 20 Dec 2022 12:00:57 +0100 Subject: [PATCH 2/2] dpark: remove hardcoding of the service binding (#72638) --- passerelle/contrib/dpark/models.py | 16 +- tests/test_dpark.py | 1208 ++++++++++++++-------------- 2 files changed, 598 insertions(+), 626 deletions(-) diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py index 4c41b3db..11a30bc4 100644 --- a/passerelle/contrib/dpark/models.py +++ b/passerelle/contrib/dpark/models.py @@ -46,9 +46,6 @@ class Error: return False -SERVICE_BINDING = '{urn:Webservice_Residants}Webservice_ResidantsSOAPBinding' - - DOCUMENT_CODES = { 'justif_domicile': '2', 'assurance': '4', @@ -195,8 +192,12 @@ def get_address_params(data): } -def get_client(instance): - return instance.soap_client() +def get_service(instance): + client = instance.soap_client() + service_name = list(client.wsdl.services)[0] + port_name = list(client.wsdl.services[service_name].ports)[0] + binding_name = str(client.wsdl.services[service_name].ports[port_name].binding.name) + return client.create_service(binding_name, instance.operation_url) class DPark(BaseResource): @@ -224,11 +225,10 @@ class DPark(BaseResource): return '%s - %s' % (self.slug, self.wsdl_url) def call(self, operation, *args, **kwargs): - client = get_client(self) - proxy_service = client.create_service(SERVICE_BINDING, self.operation_url) + service = get_service(self) bypass_erroneous_reply = kwargs.pop('bypass_erroneous_reply', False) try: - reply = getattr(proxy_service, operation)(*args, **kwargs) + reply = getattr(service, operation)(*args, **kwargs) except (WebFault,) as exc: raise APIError('ServiceError: %s' % exc) except (Exception,) as exc: diff --git a/tests/test_dpark.py b/tests/test_dpark.py index d76b7f68..4bd7d0b8 100644 --- a/tests/test_dpark.py +++ b/tests/test_dpark.py @@ -3,19 +3,19 @@ import os import xml.etree.ElementTree as ET from unittest import mock -import httmock import pytest from django.utils.encoding import force_str from zeep.exceptions import Fault as WebFault from zeep.exceptions import TransportError from passerelle.contrib.dpark.models import DPark, Pairing +from passerelle.utils.conversion import to_pdf from passerelle.utils.jsonresponse import APIError -from tests.utils import make_resource +from tests.utils import ResponsesSoap, make_resource SLUG = 'test' WSDL_URL = 'https://example.net/dpark?wsdl' -OPERATIONAL_URL = 'https://example.net/dpark' +SERVICE_URL = 'https://example.net/dpark' with open(os.path.join(os.path.dirname(__file__), 'data/dpark.awws.wsdl')) as f: WSDL_CONTENT = f.read() @@ -52,24 +52,17 @@ def dpark(db): **{ 'slug': SLUG, 'wsdl_url': WSDL_URL, - 'operation_url': OPERATIONAL_URL, + 'operation_url': SERVICE_URL, }, ) - resource.mock_requests = [] - resource.mock_responses = [] + return resource - @httmock.urlmatch(scheme='https', netloc='example.net', path='/dpark', query='wsdl', method='GET') - def wsdl(url, request): - return WSDL_CONTENT - @httmock.urlmatch(scheme='https', netloc='example.net', path='/dpark', method='POST') - def request(url, request): - idx = len(resource.mock_requests) - resource.mock_requests.append(request) - return resource.mock_responses[idx] - - with httmock.HTTMock(wsdl, request): - yield resource +@pytest.fixture +def soap_mock(dpark): + responses_soap = ResponsesSoap(WSDL_URL, WSDL_CONTENT, address=SERVICE_URL) + with responses_soap() as soap_mock: + yield soap_mock class ReplyDataClass(dict): @@ -83,7 +76,7 @@ class WebFaultHavingLatin1(WebFault): class MockedService: - def __init__(self, success, error_class, replydata): + def __init__(self, success=True, error_class=None, replydata=None): self.success = success self.error_class = error_class self.replydata = replydata @@ -106,163 +99,176 @@ class MockedService: return self.return_response -def get_client(success=True, error_class=None, replydata=None): - service = MockedService(success, error_class, replydata) - - def create_service(binging, operation_endpoint): - return service +@pytest.fixture +def get_service(): + with mock.patch('passerelle.contrib.dpark.models.get_service') as get_service: + yield get_service + + +def test_call_service_error(dpark, app, get_service): + get_service.return_value = MockedService(error_class=WebFault) + resp = app.get('/dpark/test/ping/') + assert 'ServiceError: ' in resp.json['err_desc'] + get_service.return_value = MockedService(error_class=TransportError) + resp = app.get('/dpark/test/ping/') + assert 'Error: connection error occured' in resp.json['err_desc'] + get_service.return_value = MockedService(error_class=Exception) + resp = app.get('/dpark/test/ping/') + assert 'Error: random error' in resp.json['err_desc'] + get_service.return_value = MockedService(error_class=WebFaultHavingLatin1) + resp = app.get('/dpark/test/ping/') + assert 'ServiceError: éêè' in resp.json['err_desc'] + + +def test_ping(dpark, app, get_service): + get_service.return_value = MockedService(replydata={'Code_Retour': '01', 'Lib_Retour': 'whatever'}) + resp = app.get('/dpark/test/ping/') + assert resp.json['data'] is True - return mock.Mock(create_service=create_service, service=service) +def test_search(dpark, app, get_service): + params = { + 'lastname': 'bar', + 'firstnames': 'foo', + 'filenumber': '1' * 9, + 'cardnumber': '3' * 9, + } + # missing lastname + app.get('/dpark/test/search/', params={'firstnames': 'toto'}, status=400) + # unknown file + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'} + ) + resp = app.get('/dpark/test/search/', params=params) + assert resp.json['err'] == 1 + assert resp.json['code'] == 'unknown-file' + # invalid cardnumber + get_service.return_value = MockedService( + replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'} + ) + resp = app.get('/dpark/test/search/', params=params) + assert resp.json['err'] == 1 + assert resp.json['code'] == 'support-number-unknown' + # valid data + get_service.return_value = MockedService( + replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'} + ) + resp = app.get('/dpark/test/search/', params=params) + assert resp.json['err'] == 0 -def test_call_service_error(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - client.return_value = get_client(error_class=WebFault) - resp = app.get('/dpark/test/ping/') - assert 'ServiceError: ' in resp.json['err_desc'] - client.return_value = get_client(error_class=TransportError) - resp = app.get('/dpark/test/ping/') - assert 'Error: connection error occured' in resp.json['err_desc'] - client.return_value = get_client(error_class=Exception) - resp = app.get('/dpark/test/ping/') - assert 'Error: random error' in resp.json['err_desc'] - client.return_value = get_client(error_class=WebFaultHavingLatin1) - resp = app.get('/dpark/test/ping/') - assert 'ServiceError: éêè' in resp.json['err_desc'] +def test_link(dpark, app, get_service): + params = { + 'lastname': 'bar ', + 'firstnames': ' foo', + 'filenumber': ' ' + '1' * 9, + } + # missing nameid + app.post_json('/dpark/test/link/', params=params, status=400) + params['nameid'] = 'abcd' * 8 + # unknown file + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'} + ) + resp = app.post_json('/dpark/test/link/', params=params) + assert resp.json['err'] == 1 + assert resp.json['code'] == 'unknown-file' + # invalid cardnumber + get_service.return_value = MockedService( + replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'} + ) + resp = app.post_json('/dpark/test/link/', params=params) + assert resp.json['err'] == 1 + assert resp.json['code'] == 'support-number-unknown' + # valid data + get_service.return_value = MockedService( + replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'} + ) + resp = app.post_json('/dpark/test/link/', params=params) + assert resp.json['err'] == 0 + assert Pairing.objects.count() == 1 + pairing = Pairing.objects.get(resource=dpark) + assert pairing.nameid == 'abcd' * 8 + assert pairing.filenumber == '1' * 9 + assert pairing.firstnames == 'foo' + assert pairing.lastname == 'bar' + + +def test_unlink(dpark, app, get_service): + get_service.return_value = MockedService() + nameid = 'abcd' * 8 + params = {'nameid': nameid} + # missing nameid + app.post_json('/dpark/test/unlink/', params={}, status=400) + # no pairing exists + resp = app.post_json('/dpark/test/unlink/', params=params) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'No pairing exists' + # pairing exist + Pairing.objects.create( + resource=dpark, + nameid=nameid, + lastname='bar', + firstnames='foo', + filenumber='1' * 9, + badgenumber='2' * 9, + cardnumber='3' * 9, + ) + resp = app.post_json('/dpark/test/unlink/', params=params) + assert resp.json['data'] is True + assert Pairing.objects.count() == 0 -def test_ping(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - client.return_value = get_client(replydata={'Code_Retour': '01', 'Lib_Retour': 'whatever'}) - resp = app.get('/dpark/test/ping/') - assert resp.json['data'] is True +def test_address_eligibility(dpark, app, soap_mock): + # first response, will be removed from responses registry after first call + soap_mock.add_soap_response( + 'PLS_ELIGADR', + { + 'PLS_ELIGADRResult': { + 'CodeRetour': '99', + 'MessageRetour': 'Erreur extension', + 'Adresse_EtageEscalierAppartement': '', + 'Adresse_ImmeubleBatimentResidence': '', + 'Adresse_NumeroVoie': '', + 'Adresse_Extension': '', + 'Adresse_NomVoie': '', + 'Adresse_CodeSTI': '', + 'Adresse_BoitePostaleLieudit': '', + 'Adresse_CodePostal': '', + 'Adresse_Localite': '', + 'Adresse_Quartier': '', + } + }, + ) + soap_mock.add_soap_response( + 'PLS_ELIGADR', + { + 'PLS_ELIGADRResult': { + 'CodeRetour': '01', + 'MessageRetour': 'Elligible', + 'Adresse_EtageEscalierAppartement': '', + 'Adresse_ImmeubleBatimentResidence': '', + 'Adresse_NumeroVoie': '13', + 'Adresse_Extension': '1', + 'Adresse_NomVoie': 'Rue des Abeilles', + 'Adresse_CodeSTI': '315550016038', + 'Adresse_BoitePostaleLieudit': '', + 'Adresse_CodePostal': '31000', + 'Adresse_Localite': 'Toulouse', + 'Adresse_Quartier': 'Dupuy', + } + }, + ) -def test_search(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - params = { - 'lastname': 'bar', - 'firstnames': 'foo', - 'filenumber': '1' * 9, - 'cardnumber': '3' * 9, - } - # missing lastname - app.get('/dpark/test/search/', params={'firstnames': 'toto'}, status=400) - # unknown file - client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}) - resp = app.get('/dpark/test/search/', params=params) - assert resp.json['err'] == 1 - assert resp.json['code'] == 'unknown-file' - # invalid cardnumber - client.return_value = get_client( - replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'} - ) - resp = app.get('/dpark/test/search/', params=params) - assert resp.json['err'] == 1 - assert resp.json['code'] == 'support-number-unknown' - # valid data - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}) - resp = app.get('/dpark/test/search/', params=params) - assert resp.json['err'] == 0 - - -def test_link(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - params = { - 'lastname': 'bar ', - 'firstnames': ' foo', - 'filenumber': ' ' + '1' * 9, - } - # missing nameid - app.post_json('/dpark/test/link/', params=params, status=400) - params['nameid'] = 'abcd' * 8 - # unknown file - client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}) - resp = app.post_json('/dpark/test/link/', params=params) - assert resp.json['err'] == 1 - assert resp.json['code'] == 'unknown-file' - # invalid cardnumber - client.return_value = get_client( - replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'} - ) - resp = app.post_json('/dpark/test/link/', params=params) - assert resp.json['err'] == 1 - assert resp.json['code'] == 'support-number-unknown' - # valid data - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}) - resp = app.post_json('/dpark/test/link/', params=params) - assert resp.json['err'] == 0 - assert Pairing.objects.count() == 1 - pairing = Pairing.objects.get(resource=dpark) - assert pairing.nameid == 'abcd' * 8 - assert pairing.filenumber == '1' * 9 - assert pairing.firstnames == 'foo' - assert pairing.lastname == 'bar' - - -def test_unlink(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client', get_client()): - nameid = 'abcd' * 8 - params = {'nameid': nameid} - # missing nameid - app.post_json('/dpark/test/unlink/', params={}, status=400) - # no pairing exists - resp = app.post_json('/dpark/test/unlink/', params=params) - assert resp.json['err'] == 1 - assert resp.json['err_desc'] == 'No pairing exists' - # pairing exist - Pairing.objects.create( - resource=dpark, - nameid=nameid, - lastname='bar', - firstnames='foo', - filenumber='1' * 9, - badgenumber='2' * 9, - cardnumber='3' * 9, - ) - resp = app.post_json('/dpark/test/unlink/', params=params) - assert resp.json['data'] is True - assert Pairing.objects.count() == 0 - - -def test_address_eligibility(dpark, app): params = {'address_sticode': '315553637461', 'address_zipcode': '44000'} # missing required parameter app.get('/dpark/test/address-eligibility/', params=params, status=400) # not eligible - dpark.mock_responses.append( - make_response( - 'ELIGADR', - ( - ('CodeRetour', '99'), - ('MessageRetour', 'Erreur extension'), - ), - ) - ) params['address_locality'] = 'Nantes' resp = app.get('/dpark/test/address-eligibility/', params=params) assert resp.json['err'] == 1 assert resp.json['err_desc'] == 'Erreur extension' # eligible - dpark.mock_responses.append( - make_response( - 'ELIGADR', - ( - ('CodeRetour', '01'), - ('MessageRetour', 'Elligible'), - ('Adresse_EtageEscalierAppartement', ''), - ('Adresse_ImmeubleBatimentResidence', ''), - ('Adresse_NumeroVoie', '13'), - ('Adresse_Extension', '1'), - ('Adresse_NomVoie', 'Rue des Abeilles'), - ('Adresse_CodeSTI', '315550016038'), - ('Adresse_BoitePostaleLieudit', ''), - ('Adresse_CodePostal', '31000'), - ('Adresse_Localite', 'Toulouse'), - ('Adresse_Quartier', 'Dupuy'), - ), - ) - ) params['address_streetext'] = 1 resp = app.get('/dpark/test/address-eligibility/', params=params) content = resp.json @@ -271,261 +277,263 @@ def test_address_eligibility(dpark, app): assert content['address']['address_locality'] == 'Toulouse' -def test_subscriber_infos(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - nameid = 'abcd' * 8 - url = '/dpark/test/infos/%s/' % nameid - params = { - 'nameid': nameid, - 'firstnames': 'spam eggs', - 'lastname': 'bar', - 'filenumber': '1' * 9, - 'badgenumber': '2' * 9, - } - Pairing.objects.create(resource=dpark, **params) - # unknown subscriber - resp = app.get('/dpark/test/infos/toto/') - assert resp.json['data'] == [] - # unknown file - client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}) - resp = app.get(url) - assert resp.json['data'] == [] - # known file - replydata = { - 'CodeRetour': '01', - 'MessageRetour': 'Dossier existant', - "Adresse_BoitePostaleLieuDit": None, - "Adresse_CodePostal": "44000", - "Adresse_CodeSTI": "315553609651", - "Adresse_EtageEscalierAppartement": None, - "Adresse_Extension": 1, - "Adresse_ImmeubleBatimentResidence": None, - "Adresse_Localite": "Nantes", - "Adresse_NomVoie": "All\u00e9es Jean Jaur\u00e8s", - "Adresse_NumeroVoie": 80, - "Adresse_Quartier": "PERI", - "Demande_DateDebutAbo": "20180625", - "Demande_DateFinAbo": "20190624", - "Demande_DelaiAutorise": 30, - "Demande_ImmatVehicule1": "CX453AD", - "Demande_ImmatVehicule2": None, - "Demande_MarqueVehicule1": "CITROEN", - "Demande_MarqueVehicule2": None, - "Demande_ModeleVehicule1": "GS", - "Demande_ModeleVehicule2": None, - "Demande_NumeroDossier": 22952, - "Demandeur_Civilite": 1, - "Demandeur_Email": "spameggs@example.net", - "Demandeur_NomUsuel": "BAR", - "Demandeur_Prenom": "Foo Spam", - "Demandeur_TelephoneFixe": "0611111111", - "Demandeur_TelephonePortable": None, - } - client.return_value = get_client(replydata=replydata) - resp = app.get(url) - data = resp.json['data'] - assert data[0]['id'] == '22952' - assert data[0]['text'] == '22952 - BAR Foo Spam - CX453AD' - assert data[0]['adresse_codepostal'] == '44000' - assert data[0]['adresse_codesti'] == '315553609651' - assert data[0]['adresse_localite'] == 'Nantes' - assert data[0]['demande_numerodossier'] == 22952 - assert data[0]['demandeur_email'] == 'spameggs@example.net' - assert data[0]['demandeur_telephonefixe'] == '0611111111' - assert data[0]['demande_datedebutabo'] == '2018-06-25' - assert data[0]['demande_datefinabo'] == '2019-06-24' - - # mutiple pairing - Pairing.objects.create( - resource=dpark, - nameid=nameid, - firstnames='monty', - lastname='eggs', - filenumber='5' * 9, - badgenumber='6' * 9, - cardnumber='7' * 9, - ) - replydata2 = { - 'CodeRetour': '01', - 'MessageRetour': 'Dossier existant', - "Adresse_BoitePostaleLieuDit": None, - "Adresse_CodePostal": "94000", - "Adresse_CodeSTI": "315553609651", - "Adresse_EtageEscalierAppartement": None, - "Adresse_Extension": 1, - "Adresse_ImmeubleBatimentResidence": None, - "Adresse_Localite": "Creteil", - "Adresse_NomVoie": "Allée les sablons", - "Adresse_NumeroVoie": 5, - "Adresse_Quartier": "HOOLI", - "Demande_DateDebutAbo": "20180430", - "Demande_DateFinAbo": None, - "Demande_DelaiAutorise": 30, - "Demande_ImmatVehicule1": "AA555BB", - "Demande_ImmatVehicule2": "XX333YY", - "Demande_MarqueVehicule1": "FORD", - "Demande_MarqueVehicule2": "MERCEDES", - "Demande_ModeleVehicule1": "Fiesta", - "Demande_ModeleVehicule2": "Serie A", - "Demande_NumeroDossier": 22955, - "Demandeur_Civilite": 1, - "Demandeur_Email": "spameggs@example.net", - "Demandeur_NomUsuel": "EGGS", - "Demandeur_Prenom": "Monty", - "Demandeur_TelephoneFixe": "0611111111", - "Demandeur_TelephonePortable": None, - } - # there will be only one call as first pairing is now cached - client.side_effect = [get_client(replydata=replydata2)] - resp = app.get(url) - data = resp.json['data'] - assert len(data) == 2 - assert data[1]['id'] == '22955' - assert data[1]['text'] == '22955 - EGGS Monty - AA555BB/XX333YY' - assert data[1]['adresse_codepostal'] == '94000' - assert data[1]['adresse_codesti'] == '315553609651' - assert data[1]['adresse_localite'] == 'Creteil' - assert data[1]['demande_numerodossier'] == 22955 - assert data[1]['demandeur_email'] == 'spameggs@example.net' - assert data[1]['demandeur_telephonefixe'] == '0611111111' - assert data[1]['demande_datedebutabo'] == '2018-04-30' - assert data[1]['demande_datefinabo'] is None - - # filtering by filenumber - for pairing in Pairing.objects.all(): - pairing.clear_cache() - # we modify numerodossier to verify cache is not used - replydata['Demande_NumeroDossier'] = 22953 - client.side_effect = [ - get_client(replydata=replydata), - ] - resp = app.get(url, params={'filenumber': '1' * 9}) - data = resp.json['data'] - assert len(data) == 1 - assert data[0]['id'] == '22953' - assert data[0]['text'] == '22953 - BAR Foo Spam - CX453AD' - assert data[0]['adresse_codepostal'] == '44000' - assert data[0]['adresse_codesti'] == '315553609651' - assert data[0]['adresse_localite'] == 'Nantes' - assert data[0]['demande_numerodossier'] == 22953 - assert data[0]['demandeur_email'] == 'spameggs@example.net' - assert data[0]['demandeur_telephonefixe'] == '0611111111' - assert data[0]['demande_datedebutabo'] == '2018-06-25' - assert data[0]['demande_datefinabo'] == '2019-06-24' - - -def test_check_renewal_time(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - url = '/dpark/test/check-renewal-time/' - params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9} - client.return_value = get_client( - replydata={'CodeRetour': '02', 'MessageRetour': 'Renouvellement hors délai'} - ) - resp = app.get(url, params=params) - assert resp.json['data'] is False - assert resp.json['desc'] == 'Renouvellement hors délai' - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}) - resp = app.get(url, params=params) - assert resp.json['data'] is True - - -def test_check_renewal_duplicate(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - url = '/dpark/test/check-renewal-time/' - params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9} - client.return_value = get_client( - replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'} - ) - resp = app.get(url, params=params) - assert resp.json['data'] is False - assert resp.json['desc'] == 'Demande déjà en cours' - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'}) - resp = app.get(url, params=params) - assert resp.json['data'] is True - assert resp.json['err'] == 0 - - -def test_check_creation_duplicate(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - url = '/dpark/test/check-creation-duplicate/' - params = { - 'address_district': 'PERI', - 'address_locality': 'Toulouse', - 'address_sticode': '315553609651', - 'address_streetext': '1', - 'address_zipcode': '31000', - 'applicant_firstnames': 'Spam', - 'applicant_lastname': 'Ham', - } - client.return_value = get_client( - replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'} - ) - resp = app.get(url, params=params) - assert resp.json['data'] is False - assert resp.json['desc'] == 'Demande déjà en cours' - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''}) - resp = app.get(url, params=params) - assert resp.json['data'] is True - assert resp.json['err'] == 0 - - -def test_check_creation_not_renewal(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - url = '/dpark/test/check-creation-not-renewal/' - params = { - 'address_district': 'PERI', - 'address_locality': 'Toulouse', - 'address_sticode': '315553609651', - 'address_streetext': '1', - 'address_zipcode': '31000', - 'applicant_firstnames': 'Spam', - 'applicant_lastname': 'Ham', - } - client.return_value = get_client( - replydata={'CodeRetour': '02', 'MessageRetour': 'Usager existe déjà dans D-Park'} - ) - resp = app.get(url, params=params) - assert resp.json['data'] is False - assert resp.json['desc'] == 'Usager existe déjà dans D-Park' - client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''}) - resp = app.get(url, params=params) - assert resp.json['data'] is True - - -def test_get_payment_infos(dpark, app): - with mock.patch('passerelle.contrib.dpark.models.get_client') as client: - nameid = 'abcd' * 8 - url = '/dpark/test/payment-info/%s/' % nameid - resp = app.get(url) - assert resp.json['err'] == 1 - assert resp.json['err_desc'] == 'No pairing exists' - params = { - 'nameid': nameid, - 'firstnames': 'spam eggs', - 'lastname': 'bar', - 'filenumber': '1' * 9, - 'badgenumber': '2' * 9, - } - Pairing.objects.create(resource=dpark, **params) - client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'}) - resp = app.get(url) - assert resp.json['err'] == 0 - assert resp.json['data'] == [] - replydata = { - 'CodeRetour': '01', - 'MessageRetour': 'Demande acceptée', - 'NumeroDemande': '55555', - 'Montant': 12500, - 'TypePaiement': 10, - 'NumeroTeledossierPhase1': 'E-8-0AA666BB', - } - client.return_value = get_client(replydata=replydata) - resp = app.get(url) - data = resp.json['data'][0] - assert data['montant'] == 125 - assert data['typepaiement'] == 10 - assert data['typepaiement_text'] == 'Carte Bancaire via Internet' - assert data['numerodemande'] == '55555' +def test_subscriber_infos(dpark, app, get_service): + nameid = 'abcd' * 8 + url = '/dpark/test/infos/%s/' % nameid + params = { + 'nameid': nameid, + 'firstnames': 'spam eggs', + 'lastname': 'bar', + 'filenumber': '1' * 9, + 'badgenumber': '2' * 9, + } + Pairing.objects.create(resource=dpark, **params) + # unknown subscriber + resp = app.get('/dpark/test/infos/toto/') + assert resp.json['data'] == [] + # unknown file + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'} + ) + resp = app.get(url) + assert resp.json['data'] == [] + # known file + replydata = { + 'CodeRetour': '01', + 'MessageRetour': 'Dossier existant', + "Adresse_BoitePostaleLieuDit": None, + "Adresse_CodePostal": "44000", + "Adresse_CodeSTI": "315553609651", + "Adresse_EtageEscalierAppartement": None, + "Adresse_Extension": 1, + "Adresse_ImmeubleBatimentResidence": None, + "Adresse_Localite": "Nantes", + "Adresse_NomVoie": "All\u00e9es Jean Jaur\u00e8s", + "Adresse_NumeroVoie": 80, + "Adresse_Quartier": "PERI", + "Demande_DateDebutAbo": "20180625", + "Demande_DateFinAbo": "20190624", + "Demande_DelaiAutorise": 30, + "Demande_ImmatVehicule1": "CX453AD", + "Demande_ImmatVehicule2": None, + "Demande_MarqueVehicule1": "CITROEN", + "Demande_MarqueVehicule2": None, + "Demande_ModeleVehicule1": "GS", + "Demande_ModeleVehicule2": None, + "Demande_NumeroDossier": 22952, + "Demandeur_Civilite": 1, + "Demandeur_Email": "spameggs@example.net", + "Demandeur_NomUsuel": "BAR", + "Demandeur_Prenom": "Foo Spam", + "Demandeur_TelephoneFixe": "0611111111", + "Demandeur_TelephonePortable": None, + } + get_service.return_value = MockedService(replydata=replydata) + resp = app.get(url) + data = resp.json['data'] + assert data[0]['id'] == '22952' + assert data[0]['text'] == '22952 - BAR Foo Spam - CX453AD' + assert data[0]['adresse_codepostal'] == '44000' + assert data[0]['adresse_codesti'] == '315553609651' + assert data[0]['adresse_localite'] == 'Nantes' + assert data[0]['demande_numerodossier'] == 22952 + assert data[0]['demandeur_email'] == 'spameggs@example.net' + assert data[0]['demandeur_telephonefixe'] == '0611111111' + assert data[0]['demande_datedebutabo'] == '2018-06-25' + assert data[0]['demande_datefinabo'] == '2019-06-24' + + # mutiple pairing + Pairing.objects.create( + resource=dpark, + nameid=nameid, + firstnames='monty', + lastname='eggs', + filenumber='5' * 9, + badgenumber='6' * 9, + cardnumber='7' * 9, + ) + replydata2 = { + 'CodeRetour': '01', + 'MessageRetour': 'Dossier existant', + "Adresse_BoitePostaleLieuDit": None, + "Adresse_CodePostal": "94000", + "Adresse_CodeSTI": "315553609651", + "Adresse_EtageEscalierAppartement": None, + "Adresse_Extension": 1, + "Adresse_ImmeubleBatimentResidence": None, + "Adresse_Localite": "Creteil", + "Adresse_NomVoie": "Allée les sablons", + "Adresse_NumeroVoie": 5, + "Adresse_Quartier": "HOOLI", + "Demande_DateDebutAbo": "20180430", + "Demande_DateFinAbo": None, + "Demande_DelaiAutorise": 30, + "Demande_ImmatVehicule1": "AA555BB", + "Demande_ImmatVehicule2": "XX333YY", + "Demande_MarqueVehicule1": "FORD", + "Demande_MarqueVehicule2": "MERCEDES", + "Demande_ModeleVehicule1": "Fiesta", + "Demande_ModeleVehicule2": "Serie A", + "Demande_NumeroDossier": 22955, + "Demandeur_Civilite": 1, + "Demandeur_Email": "spameggs@example.net", + "Demandeur_NomUsuel": "EGGS", + "Demandeur_Prenom": "Monty", + "Demandeur_TelephoneFixe": "0611111111", + "Demandeur_TelephonePortable": None, + } + # there will be only one call as first pairing is now cached + get_service.side_effect = [MockedService(replydata=replydata2)] + resp = app.get(url) + data = resp.json['data'] + assert len(data) == 2 + assert data[1]['id'] == '22955' + assert data[1]['text'] == '22955 - EGGS Monty - AA555BB/XX333YY' + assert data[1]['adresse_codepostal'] == '94000' + assert data[1]['adresse_codesti'] == '315553609651' + assert data[1]['adresse_localite'] == 'Creteil' + assert data[1]['demande_numerodossier'] == 22955 + assert data[1]['demandeur_email'] == 'spameggs@example.net' + assert data[1]['demandeur_telephonefixe'] == '0611111111' + assert data[1]['demande_datedebutabo'] == '2018-04-30' + assert data[1]['demande_datefinabo'] is None + + # filtering by filenumber + for pairing in Pairing.objects.all(): + pairing.clear_cache() + # we modify numerodossier to verify cache is not used + replydata['Demande_NumeroDossier'] = 22953 + get_service.side_effect = [ + MockedService(replydata=replydata), + ] + resp = app.get(url, params={'filenumber': '1' * 9}) + data = resp.json['data'] + assert len(data) == 1 + assert data[0]['id'] == '22953' + assert data[0]['text'] == '22953 - BAR Foo Spam - CX453AD' + assert data[0]['adresse_codepostal'] == '44000' + assert data[0]['adresse_codesti'] == '315553609651' + assert data[0]['adresse_localite'] == 'Nantes' + assert data[0]['demande_numerodossier'] == 22953 + assert data[0]['demandeur_email'] == 'spameggs@example.net' + assert data[0]['demandeur_telephonefixe'] == '0611111111' + assert data[0]['demande_datedebutabo'] == '2018-06-25' + assert data[0]['demande_datefinabo'] == '2019-06-24' + + +def test_check_renewal_time(dpark, app, get_service): + url = '/dpark/test/check-renewal-time/' + params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9} + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Renouvellement hors délai'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is False + assert resp.json['desc'] == 'Renouvellement hors délai' + get_service.return_value = MockedService( + replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is True + + +def test_check_renewal_duplicate(dpark, app, get_service): + url = '/dpark/test/check-renewal-time/' + params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9} + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is False + assert resp.json['desc'] == 'Demande déjà en cours' + get_service.return_value = MockedService( + replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is True + assert resp.json['err'] == 0 + + +def test_check_creation_duplicate(dpark, app, get_service): + url = '/dpark/test/check-creation-duplicate/' + params = { + 'address_district': 'PERI', + 'address_locality': 'Toulouse', + 'address_sticode': '315553609651', + 'address_streetext': '1', + 'address_zipcode': '31000', + 'applicant_firstnames': 'Spam', + 'applicant_lastname': 'Ham', + } + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is False + assert resp.json['desc'] == 'Demande déjà en cours' + get_service.return_value = MockedService(replydata={'CodeRetour': '01', 'MessageRetour': ''}) + resp = app.get(url, params=params) + assert resp.json['data'] is True + assert resp.json['err'] == 0 + + +def test_check_creation_not_renewal(dpark, app, get_service): + url = '/dpark/test/check-creation-not-renewal/' + params = { + 'address_district': 'PERI', + 'address_locality': 'Toulouse', + 'address_sticode': '315553609651', + 'address_streetext': '1', + 'address_zipcode': '31000', + 'applicant_firstnames': 'Spam', + 'applicant_lastname': 'Ham', + } + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Usager existe déjà dans D-Park'} + ) + resp = app.get(url, params=params) + assert resp.json['data'] is False + assert resp.json['desc'] == 'Usager existe déjà dans D-Park' + get_service.return_value = MockedService(replydata={'CodeRetour': '01', 'MessageRetour': ''}) + resp = app.get(url, params=params) + assert resp.json['data'] is True + + +def test_get_payment_infos(dpark, app, get_service): + nameid = 'abcd' * 8 + url = '/dpark/test/payment-info/%s/' % nameid + resp = app.get(url) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'No pairing exists' + params = { + 'nameid': nameid, + 'firstnames': 'spam eggs', + 'lastname': 'bar', + 'filenumber': '1' * 9, + 'badgenumber': '2' * 9, + } + Pairing.objects.create(resource=dpark, **params) + get_service.return_value = MockedService( + replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'} + ) + resp = app.get(url) + assert resp.json['err'] == 0 + assert resp.json['data'] == [] + replydata = { + 'CodeRetour': '01', + 'MessageRetour': 'Demande acceptée', + 'NumeroDemande': '55555', + 'Montant': 12500, + 'TypePaiement': 10, + 'NumeroTeledossierPhase1': 'E-8-0AA666BB', + } + get_service.return_value = MockedService(replydata=replydata) + resp = app.get(url) + data = resp.json['data'][0] + assert data['montant'] == 125 + assert data['typepaiement'] == 10 + assert data['typepaiement_text'] == 'Carte Bancaire via Internet' + assert data['numerodemande'] == '55555' @pytest.mark.parametrize( @@ -536,49 +544,72 @@ def test_get_payment_infos(dpark, app): ('2018-06-11T23:59:00', '20180612'), ], ) -def test_payment_notification(dpark, app, transaction_datetime, expected_date): +def test_payment_notification(dpark, app, transaction_datetime, expected_date, get_service): operation = mock.Mock(name='PLS_NOTIFCB') service = mock.Mock(spec=['PLS_NOTIFCB'], PLS_NOTIFCB=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 = { + get_service.return_value = service + + 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', + } + 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, - 'transaction_id': 'I123456789', - 'transaction_datetime': transaction_datetime, - 'total_amount': '125', - 'application_id': '61718', - 'application_external_id': 'E-8-N5UTAK6P', - } - 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 + '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 @pytest.mark.parametrize('application_thirdparty_subscription', [True, False]) -def test_registration(dpark, app, application_thirdparty_subscription): +def test_registration(dpark, app, application_thirdparty_subscription, soap_mock): + soap_mock.add_soap_response( + 'PLS_ENREG', + { + 'PLS_ENREGResult': { + 'CodeRetour': '02', + 'MessageRetour': 'Dossier incomplet', + 'NumeroDossier': 0, + 'NumeroDemande': 0, + } + }, + ) + + soap_mock.add_soap_response( + 'PLS_ENREG', + { + 'PLS_ENREGResult': { + 'CodeRetour': '01', + 'MessageRetour': '', + 'NumeroDossier': 22334, + 'NumeroDemande': 59492, + } + }, + ) + url = '/dpark/test/register/' params = { "address_complement1": "", @@ -607,60 +638,30 @@ def test_registration(dpark, app, application_thirdparty_subscription): # with missing parameter app.post_json(url, params=params, status=400) params['address_district'] = "PERI" - # with an imcplete application - dpark.mock_responses.append( - """ - - - - - - 02 - Dossier incomplet - - - -""" - ) + + # with an incomplete application resp = app.post_json(url, params=params) - demande_abonnementtiers = ( - '%s' - % repr(application_thirdparty_subscription).lower() - ) - 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' + + soap_request = soap_mock.soap_requests[0] + assert type(soap_request).__name__ == 'tPLS_ENREG' + assert soap_request.Entree_Demande.Demande_AbonnementTiers is application_thirdparty_subscription + # with complete application - dpark.mock_responses.append( - """ - - - - - - 01 - - 22334 - 59492 - - - -""" - ) resp = app.post_json(url, params=params) - assert demande_abonnementtiers in force_str(dpark.mock_requests[1].body) + soap_request = soap_mock.soap_requests[1] assert resp.json['data']['numerodossier'] == 22334 assert resp.json['data']['numerodemande'] == 59492 + assert type(soap_request).__name__ == 'tPLS_ENREG' + assert soap_request.Entree_Demande.Demande_AbonnementTiers is application_thirdparty_subscription + # we need to freeze_time as Pillow (used by to_pdf()) embed the current time in # the produced PDF, so to get some deterministic behaviour it's needed to # freeze the time. -def test_send_files(dpark, app, settings, freezer): +def test_send_files(dpark, app, soap_mock, settings, freezer): params = {'application_external_id': 'E-8-N5UTAK6P'} with mock.patch('passerelle.contrib.dpark.models.DPark.call') as soap_call: url = '/dpark/test/send-files/' @@ -716,61 +717,44 @@ def test_send_files(dpark, app, settings, freezer): # add custom document type settings.DPARK_DOCUMENT_CODES = {'toto': '73'} - response = """ - - - - - - 01 - - - - -""" - - dpark.mock_responses.append(response) + soap_mock.add_soap_response( + 'PLS_ENVOIPJ', + { + 'PLS_ENVOIPJResult': { + 'CodeRetour': '01', + 'MessageRetour': '', + } + }, + ) resp = app.post_json(url, params=params) assert resp.json['err'] == 0 assert resp.json['data'] is True - assert len(dpark.mock_requests) == 1 - root = ET.fromstring(dpark.mock_requests[0].body) - pj_node = root.find( - '{http://schemas.xmlsoap.org/soap/envelope/}Body/{urn:Webservice_Residants}PLS_ENVOIPJ' - ) - assert pj_node.find('NumeroTeledossier').text == 'E-8-N5UTAK6P' - assert pj_node.find('NumeroDossier').text == '61718' - assert pj_node.find('NbFichier').text == '4' - assert len(pj_node.findall('Bloc_Fichiers')) == 4 - assert pj_node.findall('Bloc_Fichiers')[0].find('TypeDocument').text == '6' - assert pj_node.findall('Bloc_Fichiers')[0].find('NomFichier').text == 'cartegrise.pdf' - assert pj_node.findall('Bloc_Fichiers')[0].find('Fichier').text == force_str( - base64.b64encode(b'%PDF carte grise 1') - ) - assert pj_node.findall('Bloc_Fichiers')[1].find('TypeDocument').text == '6' - assert pj_node.findall('Bloc_Fichiers')[1].find('NomFichier').text == 'cartegrise2.pdf' - assert pj_node.findall('Bloc_Fichiers')[1].find('Fichier').text == force_str( - base64.b64encode(b'%PDF carte grise 2') - ) - assert pj_node.findall('Bloc_Fichiers')[2].find('TypeDocument').text == '2' - assert pj_node.findall('Bloc_Fichiers')[2].find('NomFichier').text == 'address_proof.pDf' - assert pj_node.findall('Bloc_Fichiers')[2].find('Fichier').text == force_str( - base64.b64encode(b'%PDF this is my proof of address') - ) + assert len(soap_mock.soap_requests) == 1 - assert pj_node.findall('Bloc_Fichiers')[3].find('TypeDocument').text == '73' - from passerelle.utils.conversion import to_pdf + soap_request = soap_mock.soap_requests[0] + assert soap_request.NumeroTeledossier == 'E-8-N5UTAK6P' + assert soap_request.NumeroDossier == 61718 + assert soap_request.NbFichier == 4 + assert soap_request.Bloc_Fichiers[0].TypeDocument == '6' + assert soap_request.Bloc_Fichiers[0].NomFichier == 'cartegrise.pdf' + assert soap_request.Bloc_Fichiers[0].Fichier == b'%PDF carte grise 1' - assert pj_node.findall('Bloc_Fichiers')[3].find('NomFichier').text == 'cartegrisetoto.jpg.pdf' - assert pj_node.findall('Bloc_Fichiers')[3].find('Fichier').text == force_str( - base64.b64encode(to_pdf(JPEG_CONTENT)) - ) - assert base64.b64decode(pj_node.findall('Bloc_Fichiers')[3].find('Fichier').text).startswith(b'%PDF') + assert soap_request.Bloc_Fichiers[1].TypeDocument == '6' + assert soap_request.Bloc_Fichiers[1].NomFichier == 'cartegrise2.pdf' + assert soap_request.Bloc_Fichiers[1].Fichier == b'%PDF carte grise 2' + + assert soap_request.Bloc_Fichiers[2].TypeDocument == '2' + assert soap_request.Bloc_Fichiers[2].NomFichier == 'address_proof.pDf' + assert soap_request.Bloc_Fichiers[2].Fichier == b'%PDF this is my proof of address' + + assert soap_request.Bloc_Fichiers[3].TypeDocument == '73' + assert soap_request.Bloc_Fichiers[3].NomFichier == 'cartegrisetoto.jpg.pdf' + assert soap_request.Bloc_Fichiers[3].Fichier == to_pdf(JPEG_CONTENT) + assert soap_request.Bloc_Fichiers[3].Fichier.startswith(b'%PDF') @pytest.mark.parametrize('application_thirdparty_subscription', [True, False]) -def test_registration_double_plaque(dpark, app, application_thirdparty_subscription): +def test_registration_double_plaque(dpark, app, soap_mock, application_thirdparty_subscription): url = '/dpark/test/register/' params = { "address_complement1": "", @@ -807,57 +791,46 @@ def test_registration_double_plaque(dpark, app, application_thirdparty_subscript } ) # with an imcplete application - dpark.mock_responses.append( - """ - - - - - - 02 - Dossier incomplet - - - -""" + soap_mock.add_soap_response( + 'PLS_ENREG2', + { + 'PLS_ENREG2Result': { + 'CodeRetour': '02', + 'MessageRetour': 'Dossier incomplet', + 'NumeroDossier': 0, + 'NumeroDemande': 0, + } + }, ) - resp = app.post_json(url, params=params) - demande_abonnementtiers = ( - '%s' - % repr(application_thirdparty_subscription).lower() + soap_mock.add_soap_response( + 'PLS_ENREG2', + { + 'PLS_ENREG2Result': { + 'CodeRetour': '01', + 'MessageRetour': '', + 'NumeroDossier': 22334, + 'NumeroDemande': 59492, + } + }, ) - 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 + + # result is incomplete application + resp = app.post_json(url, params=params) assert resp.json['err'] == 1 assert resp.json['err_desc'] == 'Dossier incomplet' - # with complete application - dpark.mock_responses.append( - """ - - - - - - 01 - - 22334 - 59492 - - - -""" - ) + + soap_request = soap_mock.soap_requests[0] + assert soap_request.ID_CONTEXTE == 1 + assert soap_request.ID_PRODUIT == 2 + + # with is ok 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 + soap_request = soap_mock.soap_requests[0] + assert soap_request.Entree_Demande.Demande_AbonnementTiers is application_thirdparty_subscription + @pytest.mark.parametrize( 'transaction_datetime,expected_date', @@ -867,43 +840,42 @@ def test_registration_double_plaque(dpark, app, application_thirdparty_subscript ('2018-06-11T23:59:00', '20180612'), ], ) -def test_payment_notification_double_plaque(dpark, app, transaction_datetime, expected_date): +def test_payment_notification_double_plaque(dpark, app, transaction_datetime, expected_date, get_service): 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 = { + get_service.return_value = service + + 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, - '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 + '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.37.2