soap: activer api_error=True sur Parsifal (#73411) #96

Merged
nroche merged 2 commits from wip/73411-maelis-manage-soap-error into main 2023-02-08 10:15:02 +01:00
6 changed files with 78 additions and 28 deletions

View File

@ -230,7 +230,7 @@ def test_create_family(conn, create_data, update_data):
res = resp.json()
assert res['err'] == 1
assert 'Il existe déjà un Responsable Légal correspondant' in res['err_desc']
assert res['err_class'] == 'passerelle.utils.jsonresponse.APIError'
assert res['err_class'] == 'passerelle.utils.soap.SOAPFault'
# RL1 already exists (on update_data, as RL2) error
payload['rl1']['firstname'] = 'Homer'
@ -240,7 +240,7 @@ def test_create_family(conn, create_data, update_data):
res = resp.json()
assert res['err'] == 1
assert 'Il existe déjà un Responsable Légal correspondant' in res['err_desc']
assert res['err_class'] == 'passerelle.utils.jsonresponse.APIError'
assert res['err_class'] == 'passerelle.utils.soap.SOAPFault'
def test_is_rl_exists(conn, update_data):
@ -431,28 +431,18 @@ def test_create_child(conn, create_data, update_data):
resp = requests.post(url, json=payload)
resp.raise_for_status()
res = resp.json()
assert 'Il existe déjà un enfant correspondant' in res['err_desc']
res['err_desc'] = 'N/A'
assert res == {
'err': 1,
'err_class': 'passerelle.utils.jsonresponse.APIError',
'err_desc': 'N/A',
'data': None,
}
assert res['err'] == 1
assert res['err_class'] == 'passerelle.utils.soap.SOAPFault'
assert 'E65 : Il existe déjà un enfant correspondant' in res['err_desc']
# child already exists error (Lisa form update_data)
payload['lastname'] = 'Simpson'
resp = requests.post(url, json=payload)
resp.raise_for_status()
res = resp.json()
assert 'Il existe déjà un enfant correspondant' in res['err_desc']
res['err_desc'] = 'N/A'
assert res == {
'err': 1, # error is return into childErrorList
'err_class': 'passerelle.utils.jsonresponse.APIError',
'err_desc': 'N/A',
'data': None,
}
assert res['err'] == 1
assert res['err_class'] == 'passerelle.utils.jsonresponse.APIError'
assert 'E65a : Il existe déjà un enfant correspondant' in res['err_desc']
def test_update_child(conn, update_data, create_data):

View File

@ -34,12 +34,9 @@ def test_link(conn, update_data):
resp = requests.post(url, json=payload)
resp.raise_for_status()
res = resp.json()
assert res == {
'err': 1,
'err_class': 'passerelle.utils.jsonresponse.APIError',
'err_desc': 'E02 : Le dossier numéro [999999] ne correspond à aucune famille',
'data': None,
}
assert res['err'] == 1
assert res['err_class'] == 'passerelle.utils.soap.SOAPFault'
assert "E02 : Le dossier numéro [999999] ne correspond à aucune famille" in res['err_desc']
# wrong DUI firstname
payload = {

View File

@ -70,7 +70,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
wsdl_name = wsdl_short_name + 'Service?wsdl'
wsdl_url = urljoin(self.base_wsdl_url, wsdl_name)
settings = zeep.Settings(strict=False, xsd_ignore_sequence_order=True)
return self.soap_client(wsdl_url=wsdl_url, wsse=wsse, settings=settings)
return self.soap_client(wsdl_url=wsdl_url, wsse=wsse, settings=settings, api_error=True)
def call(self, wsdl_short_name, service, **kwargs):
client = self.get_client(wsdl_short_name)

View File

@ -16,6 +16,7 @@
from urllib import parse as urlparse
from lxml import etree
from requests import RequestException
from zeep import Client
from zeep.cache import InMemoryCache
@ -48,10 +49,13 @@ class SOAPFault(SOAPError):
log_error = False
def __init__(self, client, fault):
dico = fault.__dict__
if isinstance(dico.get('detail'), etree._Element):
dico['detail'] = etree.tostring(dico['detail']).decode()
super().__init__(
f'SOAP service at {client.wsdl.location} returned an error "{fault.message or fault.code}"',
data={
'soap_fault': fault.__dict__,
'soap_fault': dico,
},
)

View File

@ -0,0 +1,14 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>E19 : La voie est obligatoire</faultstring>
<detail>
<ns1:MaelisSiteException xmlns:ns1="site.ws.maelis.sigec.com">
<message xmlns:ns2="site.ws.maelis.sigec.com">E19 : La voie est obligatoire</message>
<code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="site.ws.maelis.sigec.com" xsi:nil="true"/>
</ns1:MaelisSiteException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>

View File

@ -231,6 +231,15 @@ def test_call_with_wrong_credentials(family_service, con):
'err': 1,
'log_error': False,
'http_status': 200,
'data': {
'soap_fault': {
'message': 'The security token could not be authenticated or authorized',
'code': 'ns1:FailedAuthentication',
'actor': None,
'detail': None,
'subcodes': None,
}
},
}
@ -3721,7 +3730,10 @@ def test_add_rl1_direct_debit_order_soap_error(family_service, invoice_service,
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
assert (
resp.json['err_desc']
== 'SOAP service at https://example.org/InvoiceService?wsdl returned an error "E520 : La REGIE CS [{0}] n\'\'existe pas dans la base Maelis"'
)
def test_get_rl1_direct_debit_order(family_service, invoice_service, con, app):
@ -3797,7 +3809,10 @@ def test_get_rl1_direct_debit_order_soap_error(family_service, invoice_service,
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
assert (
resp.json['err_desc']
== 'SOAP service at https://example.org/InvoiceService?wsdl returned an error "E520 : La REGIE CS [{0}] n\'\'existe pas dans la base Maelis"'
)
def test_read_school_year_list(con, app):
@ -4608,6 +4623,36 @@ def test_read_school_list_address_and_level(site_service, con, app):
assert 'text' in item
def test_read_school_list_address_and_level_soap_error(site_service, con, app):
site_service.add_soap_response(
'readSchoolForAdressAndLevel',
get_xml_file('R_read_school_for_adress_and_level_soap_error.xml'),
status=500,
)
url = get_endpoint('read-schools-for-address-and-level')
resp = app.get(url, params={'id_street': '', 'num': '', 'year': ''})
assert resp.json['err'] == 1
assert (
resp.json['err_desc']
== 'SOAP service at https://example.org/SiteService?wsdl returned an error "E19 : La voie est obligatoire"'
)
assert resp.json['data'] == {
'soap_fault': {
'message': 'E19 : La voie est obligatoire',
'code': 'soap:Server',
'actor': None,
'detail': '<detail xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
+ '\n <ns1:MaelisSiteException xmlns:ns1="site.ws.maelis.sigec.com">'
+ '\n <message xmlns:ns2="site.ws.maelis.sigec.com">E19 : La voie est obligatoire</message>'
+ '\n <code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
+ ' xmlns:ns2="site.ws.maelis.sigec.com" xsi:nil="true"/>'
+ '\n </ns1:MaelisSiteException>\n </detail>'
+ '\n ',
'subcodes': None,
}
}
def test_read_school_list_child_and_level(family_service, con, app):
family_service.add_soap_response(
'readSchoolForChildAndLevel', get_xml_file('R_read_school_for_child_and_level.xml')