2018-05-03 18:05:29 +02:00
from unittest import mock
2022-09-29 15:29:51 +02:00
2018-05-03 18:05:29 +02:00
import pytest
2018-05-25 15:57:09 +02:00
from requests . exceptions import ConnectionError
2018-05-03 18:05:29 +02:00
2022-03-18 09:46:37 +01:00
import tests . utils
2018-05-03 18:05:29 +02:00
from passerelle . contrib . teamnet_axel . models import Link , TeamnetAxel
from passerelle . utils . jsonresponse import APIError
@pytest.fixture
def setup ( db ) :
2022-03-18 09:46:37 +01:00
return tests . utils . make_resource (
2018-05-25 15:57:09 +02:00
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 ' ,
2021-02-20 16:26:01 +01:00
} ,
} ,
2018-05-25 15:57:09 +02:00
)
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 > 8336 A < / 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()
2018-05-03 18:05:29 +02:00
def test_authentication_failed ( app , setup ) :
2018-06-14 14:54:06 +02:00
with mock . patch ( ' passerelle.contrib.teamnet_axel.models.TeamnetAxel.get_family_id ' ) as mocked :
2018-05-03 18:05:29 +02:00
mocked . side_effect = APIError ( ' authentication failed ' )
2018-05-11 07:20:10 +02:00
NameID = ' abcd ' * 8
resp = app . get ( ' /teamnet-axel/test/family/ ' , params = { ' NameID ' : NameID } )
2018-05-03 18:05:29 +02:00
assert resp . json [ ' err ' ] == 1
assert resp . json [ ' err_desc ' ] == ' authentication failed '
2018-05-04 15:50:16 +02:00
def test_missing_name_id ( app , setup ) :
resp = app . get ( ' /teamnet-axel/test/family/ ' , params = { } , status = 400 )
assert resp . json [ ' err ' ] == 1
2018-05-11 07:20:10 +02:00
assert resp . json [ ' err_desc ' ] == " missing parameters: ' NameID ' . "
2018-05-25 15:57:09 +02:00
@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 ( )
2022-03-18 14:35:33 +01:00
assert link . login == ' foo '
assert link . pwd == ' bar '
assert link . nameid == ' abcd ' * 8
2018-05-25 15:57:09 +02:00
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
2022-03-17 16:54:24 +01:00
assert resp . json [ ' data ' ] [ ' family ' ] == ' 8336 '
2018-05-25 15:57:09 +02:00
# 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 )
2018-06-13 17:58:40 +02:00
assert resp . json [ ' data ' ] is True