passerelle/tests/test_teamnet_axel.py

364 lines
15 KiB
Python

from unittest import mock
import pytest
from requests.exceptions import ConnectionError
import tests.utils
from passerelle.contrib.teamnet_axel.models import Link, TeamnetAxel
from passerelle.utils.jsonresponse import APIError
@pytest.fixture
def setup(db):
return tests.utils.make_resource(
TeamnetAxel,
**{
'slug': 'test',
'wsdl_url': 'http://example.net/AXEL_WS/AxelWS.php?wsdl',
'billing_regies': {
'11': 'EN2-CLASSE',
'27': 'EN10-FM',
'37': 'EN3-DONS',
'31': 'EN31-C.V.',
'42': 'EN29-RESTC',
'43': 'EN32-ENFAN',
'38': 'EN30-PRODD',
},
},
)
AUTH_RESPONSE = '''
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE PORTAIL>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>ConnexionCompteFamille</TYPE>
<STATUS>OK</STATUS>
<DATE>20/01/2018 17:47:25</DATE>
<COMMENTAIRES><![CDATA[]]></COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL>
<UTILISATEUR>
<LOGIN>8336A</LOGIN>
<ESTIDENTIFIE>{}</ESTIDENTIFIE>
<ESTBLOQUE>false</ESTBLOQUE>
<ESTCHANGEMENT_MDP_REQUIS>false</ESTCHANGEMENT_MDP_REQUIS>
<NBECHEC>0</NBECHEC>
<IDFAMILLE>8336</IDFAMILLE>
<IDPERSONNE>25239</IDPERSONNE>
</UTILISATEUR>
</PORTAIL>
</DATA>
</PORTAILSERVICE>
'''.strip()
FAMILY_DATA_RESPONSE = '''
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE PORTAIL>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>DonneesFamille</TYPE>
<STATUS>OK</STATUS>
<DATE>20/01/2015 17:47:25</DATE>
<COMMENTAIRES><![CDATA[]]>
</COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL>
<INDIVIDUS IDFAMILLE="8336" INDTYPE="1" IDINDIVIDU="25239"
CIVILITE="Monsieur" NOM="FONTAINE" PRENOM="Hugo" NAISSANCE="17/04/1991"
SEXE="M" TELPORTABLE="" TELFIXE="0123456789" MAIL="h.fontaine3@teamnet.fr"
TELBUREAUFIXE="" POSTEBUREAUFIXE="" NORUE="39" VOIE="AVENUE J. BREL"
ETAGE="1" RESIDENCE="" COMPLEMENT="" CODEPOSTAL="94550" VILLE="CHEVILLY LARUE"
EDIT="" DEMAT="N" ECOLE="" NIVEAU="" IDECOLE="" IDNIVEAU=""
SOUSCRIPTION="N" CSP="" NOMJF="" EMPNORUE="" EMPVOIE="" EMPETAGE=""
EMPRESIDENCE="" EMPCOMPLEMENT="" EMPCODEPOSTAL="" EMPVILLE=""
TELPORTBUREAU="" NBREENFANTS="" SITUATION="" NUMALLOC="" ORGAALLOC=""
AUTRE="" CAF="0" IDPAYS="77" IDENTTYPEFAMILLE="" ANNEE="2014" />
<INDIVIDUS IDFAMILLE="8336" INDTYPE="3" IDINDIVIDU="25278"
CIVILITE="" NOM="FONTAINE" PRENOM="Javou" NAISSANCE="04/12/2014"
SEXE="M" TELPORTABLE="" TELFIXE="" MAIL="" TELBUREAUFIXE=""
POSTEBUREAUFIXE="" NORUE="" VOIE="" ETAGE="" RESIDENCE=""
COMPLEMENT="" CODEPOSTAL="" VILLE="" EDIT="N" DEMAT="N" ECOLE=""
NIVEAU="" IDECOLE="" IDNIVEAU="" SOUSCRIPTION="" CSP="" NOMJF=""
EMPNORUE="" EMPVOIE="" EMPETAGE="" EMPRESIDENCE="" EMPCOMPLEMENT=""
EMPCODEPOSTAL="" EMPVILLE="" TELPORTBUREAU="" NBREENFANTS=""
SITUATION="" NUMALLOC="" ORGAALLOC="" AUTRE="" CAF="0" IDPAYS="77"
IDENTTYPEFAMILLE="" ANNEE="2014" />
</PORTAIL>
</DATA>
</PORTAILSERVICE>
'''.strip()
INVOICE_RESPONSE = '''
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE PORTAIL>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>FacturesApayerRegie</TYPE>
<STATUS>OK</STATUS>
<DATE>02/01/2019 16:31:09</DATE>
<COMMENTAIRES></COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL>
<FACTURES FEMISSION="02/02/2019" FECHEANCE="02/02/2019" FNUMERO="6456"
IDFACTURE="456" FLIBELLE="" FMONTANT="101" FENCAISSE="0" FPDF="O"
NOFACTURE="F201901456" RESTEAPAYER="0"/>
<FACTURES FEMISSION="02/01/2019" FECHEANCE="02/01/2019" FNUMERO="6470"
IDFACTURE="470" FLIBELLE="" FMONTANT="75" FENCAISSE="0" FPDF="O"
NOFACTURE="F201902470" RESTEAPAYER="0"/>
</PORTAIL>
</DATA>
</PORTAILSERVICE>
'''.strip()
INVOICE_HISTORY_RESPONSE = '''
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE PORTAIL>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>HistoriqueFacturesRegie</TYPE>
<STATUS>OK</STATUS>
<DATE>13/06/2018 11:38:19</DATE>
<COMMENTAIRES><![CDATA[]]></COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL>
<FACTURES FEMISSION="10/02/2018" FECHEANCE="22/12/2017" NOFACTURE="1080167" IDFACTURE="1080167" FLIBELLE="Restauration et Centre de loisirs Novembre 2017" FMONTANT="84.61" FENCAISSE="84.61" FPDF="O" RESTEAPAYER="0"/>
<FACTURES FEMISSION="10/03/2018" FECHEANCE="27/02/2018" NOFACTURE="1089973" IDFACTURE="1089973" FLIBELLE="Restauration et Centre de loisirs Janvier 2018" FMONTANT="93.52" FENCAISSE="93.52" FPDF="O" RESTEAPAYER="0"/>
<FACTURES FEMISSION="07/05/2018" FECHEANCE="28/04/2018" NOFACTURE="1099885" IDFACTURE="1099885" FLIBELLE="Restauration et Centre de loisirs Mars 2018" FMONTANT="106.82" FENCAISSE="106.82" FPDF="O" RESTEAPAYER="0"/>
<FACTURES FEMISSION="09/06/2017" FECHEANCE="29/06/2017" NOFACTURE="1051741" IDFACTURE="1051741" FLIBELLE="Restauration et Centre de loisirs Mai 2017" FMONTANT="103.7" FENCAISSE="103.7" FPDF="O" RESTEAPAYER="0"/>
</PORTAIL>
</DATA>
</PORTAILSERVICE>
'''.strip()
INVOICE_PDF_RESPONSE = '''
<?xml version="1.0"?>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>FacturesPDF</TYPE>
<STATUS>OK</STATUS>
<DATE>13/06/2018 13:37:02</DATE>
<COMMENTAIRES><![CDATA[]]></COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL>
<PDF NOFACTURE="F201901456" FILE="dGhpcyBpcyBzaW1wbGUgZmlsZQ=="/>
</PORTAIL>
</DATA>
</PORTAILSERVICE>
'''.strip()
INVOICE_PAYMENT_RESPONSE = '''
<?xml version="1.0"?>
<PORTAILSERVICE>
<RESULTAT>
<TYPE>PaiementFactures</TYPE>
<STATUS>OK</STATUS>
<DATE>10/06/2018 20:44:58</DATE>
<COMMENTAIRES><![CDATA[]]></COMMENTAIRES>
</RESULTAT>
<DATA>
<PORTAIL/>
</DATA>
</PORTAILSERVICE>
'''.strip()
def test_authentication_failed(app, setup):
with mock.patch('passerelle.contrib.teamnet_axel.models.TeamnetAxel.get_family_id') as mocked:
mocked.side_effect = APIError('authentication failed')
NameID = 'abcd' * 8
resp = app.get('/teamnet-axel/test/family/', params={'NameID': NameID})
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'authentication failed'
def test_missing_name_id(app, setup):
resp = app.get('/teamnet-axel/test/family/', params={}, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "missing parameters: 'NameID'."
@mock.patch('passerelle.contrib.teamnet_axel.soap.get_client')
def test_endpoint_ping(soap_client, app, setup):
soap_client.return_value = mock.Mock()
resp = app.get('/teamnet-axel/test/ping/')
assert resp.json['data']['ping'] == 'pong'
@mock.patch(
'passerelle.contrib.teamnet_axel.soap.get_client',
side_effect=ConnectionError('Mocked Request ConnectionError'),
)
def test_endpoint_ping_with_connection_error(soap_client, app, setup):
resp = app.get('/teamnet-axel/test/ping/')
assert resp.json['err_desc'] == 'Client Error: Mocked Request ConnectionError'
def get_client(authenticated=True):
return mock.Mock(service=MockedService(authenticated=authenticated))
class MockedService(mock.Mock):
def getData(self, streamId, xmlParams, user):
if streamId == 'ConnexionCompteFamille':
return AUTH_RESPONSE.format(str(self.authenticated).lower())
elif streamId == 'DonneesFamille':
return FAMILY_DATA_RESPONSE
elif streamId == 'FacturesApayerRegie':
return INVOICE_RESPONSE
elif streamId == 'FacturesPDF':
return INVOICE_PDF_RESPONSE
elif streamId == 'HistoriqueFacturesRegie':
return INVOICE_HISTORY_RESPONSE
else:
return INVOICE_PAYMENT_RESPONSE
def test_endpoint_auth(app, setup):
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar'}
# test authentication failure
client.return_value = get_client(authenticated=False)
resp = app.get('/teamnet-axel/test/auth/', params=params)
assert resp.json['data'] is False
# tests authentication success
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/auth/', params=params)
assert resp.json['data']['estidentifie'] is True
assert resp.json['data']['idfamille'] == '8336'
def test_endpoint_family_link(app, setup):
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar'}
# test without nameid
resp = app.get('/teamnet-axel/test/family/link/', params=params, status=400)
params['NameID'] = 'abcd' * 8
# test authentication failure
client.return_value = get_client(authenticated=False)
resp = app.get('/teamnet-axel/test/family/link/', params=params)
assert resp.json['err_desc'] == 'authentication failed'
# tests authentication success
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/family/link/', params=params)
assert resp.json['data']['estidentifie'] is True
assert resp.json['data']['idfamille'] == '8336'
assert Link.objects.count() == 1
link = Link.objects.get()
assert link.login == 'foo'
assert link.pwd == 'bar'
assert link.nameid == 'abcd' * 8
def test_endpoint_family_unlink(app, setup):
params = {'login': 'foo', 'password': 'bar'}
# test without nameid
resp = app.get('/teamnet-axel/test/family/unlink/', params=params, status=400)
nameid = 'abcd' * 8
params['NameID'] = nameid
# test unlinking success
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
resp = app.get('/teamnet-axel/test/family/unlink/', params=params)
assert resp.json['data']['login_was'][0] == 'foo'
def test_endpoint_family_view(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar'}
# test without nameid
app.get('/teamnet-axel/test/family/', params=params, status=400)
params['NameID'] = 'abcd' * 8
# test multiple links error
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
Link.objects.create(resource=setup, login='spam', pwd='ham', nameid=nameid)
resp = app.get('/teamnet-axel/test/family/', params=params)
assert resp.json['err_desc'] == 'multiple links'
# test unsuccesful authentication
Link.objects.get(resource=setup, login='spam', pwd='ham', nameid=nameid).delete()
client.return_value = get_client(authenticated=False)
resp = app.get('/teamnet-axel/test/family/', params=params)
assert resp.json['err_desc'] == 'authentication failed'
# test with successful authentication
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/family/', params=params)
assert len(resp.json['data']['adults']) == 1
assert len(resp.json['data']['children']) == 1
assert resp.json['data']['family'] == '8336'
# test filtering
resp = app.get('/teamnet-axel/test/family/adults/', params=params)
data = resp.json['data']
assert data[0]['address'] == '39, AVENUE J. BREL, 94550 CHEVILLY LARUE'
assert data[0]['idfamille'] == '8336'
def test_endpoint_invoices(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar', 'NameID': nameid}
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/regie/42/invoices/', params=params)
data = resp.json['data']
assert len(data) == 2
assert data[0]['id'] == '8336-F201901456'
assert data[0]['IDFACTURE'] == '456'
assert data[0]['total_amount'] == '101'
assert data[0]['has_pdf'] is True
def test_endpoint_invoices_history(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar', 'NameID': nameid}
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/regie/42/invoices/history/', params=params)
data = resp.json['data']
assert len(data) == 4
def test_endpoint_invoice_id(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar', 'NameID': nameid}
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/regie/42/invoice/8336-F201901456/', params=params)
data = resp.json['data']
assert data['id'] == '8336-F201901456'
assert data['IDFACTURE'] == '456'
assert data['total_amount'] == '101'
assert data['has_pdf'] is True
def test_endpoint_invoice_pdf(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'login': 'foo', 'password': 'bar', 'NameID': nameid}
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
client.return_value = get_client(authenticated=True)
resp = app.get('/teamnet-axel/test/regie/42/invoice/8336-F201901456/pdf/', params=params)
assert resp.headers['Content-Disposition'] == 'attachment; filename="8336-F201901456.pdf"'
def test_endpoint_pay_invoice(app, setup):
nameid = 'abcd' * 8
with mock.patch('passerelle.contrib.teamnet_axel.soap.Client') as client:
params = {'transaction_id': '1234' * 8, 'transaction_date': '2018-06-13T11:43:12'}
Link.objects.create(resource=setup, login='foo', pwd='bar', nameid=nameid)
client.return_value = get_client(authenticated=True)
# test with an invalid invoice id
resp = app.post_json('/teamnet-axel/test/regie/42/invoice/ham-egg/pay/', params=params)
assert resp.json['data'] is False
# test with a valid invoice id
resp = app.post_json('/teamnet-axel/test/regie/42/invoice/8336-F201901456/pay/', params=params)
assert resp.json['data'] is True