toulouse-maelis: manage XML soap fault detail content (#73411)
gitea-wip/passerelle/pipeline/pr-main This commit looks good Details

This commit is contained in:
Nicolas Roche 2023-01-13 20:09:08 +01:00
parent 47e0b644a5
commit 932907630b
2 changed files with 36 additions and 3 deletions

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,6 +49,8 @@ class SOAPFault(SOAPError):
log_error = False
def __init__(self, client, fault):
if hasattr(fault, 'detail') and isinstance(fault.detail, etree._Element):
fault.detail = etree.tostring(fault.detail).decode()
super().__init__(
f'SOAP service at {client.wsdl.location} returned an error "{fault.message or fault.code}"',
data={

View File

@ -193,6 +193,15 @@ def test_call_with_wrong_credentials(family_service, con):
'log_error': False,
'http_status': 200,
'err_code': 'Family-isWSRunning-ns1:FailedAuthentication',
'data': {
'soap_fault': {
'message': 'The security token could not be authenticated or authorized',
'code': 'ns1:FailedAuthentication',
'actor': None,
'detail': None,
'subcodes': None,
}
},
}
@ -4421,11 +4430,32 @@ def test_read_school_list_address_and_level(site_service, con, app):
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,
'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')
with pytest.raises(TypeError, match='Object of type _Element is not JSON serializable') as e:
resp = app.get(url, params={'id_street': '', 'num': '', 'year': ''})
resp = app.get(url, params={'id_street': '', 'num': '', 'year': ''})
assert resp.json['err'] == 'Site-readSchoolForAdressAndLevel-soap:Server'
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):