From a20835e1187d6a3e462d7f1c132474fe23f6d109 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sun, 23 Apr 2023 17:40:16 +0200 Subject: [PATCH] dpark: convert soap errors to APIError (#76903) --- passerelle/contrib/dpark/models.py | 2 +- passerelle/utils/soap.py | 11 ++++++-- tests/test_dpark.py | 44 ++++++++++++------------------ 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py index e8812fcf..e05d3cdd 100644 --- a/passerelle/contrib/dpark/models.py +++ b/passerelle/contrib/dpark/models.py @@ -192,7 +192,7 @@ def get_address_params(data): def get_service(instance): - client = instance.soap_client() + client = instance.soap_client(api_error=True) 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) diff --git a/passerelle/utils/soap.py b/passerelle/utils/soap.py index 9698c3ea..a9155998 100644 --- a/passerelle/utils/soap.py +++ b/passerelle/utils/soap.py @@ -108,9 +108,14 @@ class SOAPClient(Client): ) super().__init__(wsdl_url, transport=transport, **kwargs) - @property - def service(self): - service = super().service + def bind(self, *args, **kwargs): + service = super().bind(*args, **kwargs) + if self.api_error: + service.__class__ = ServiceProxyWrapper + return service + + def create_service(self, *args, **kwargs): + service = super().create_service(*args, **kwargs) if self.api_error: service.__class__ = ServiceProxyWrapper return service diff --git a/tests/test_dpark.py b/tests/test_dpark.py index dd8ed54a..3764ab36 100644 --- a/tests/test_dpark.py +++ b/tests/test_dpark.py @@ -1,15 +1,15 @@ import base64 import os -import xml.etree.ElementTree as ET from unittest import mock import pytest +import requests +import responses from django.utils.encoding import force_str from passerelle.contrib.dpark.models import DPark, Pairing from passerelle.utils.conversion import to_pdf from passerelle.utils.jsonresponse import APIError -from passerelle.utils.soap import SOAPError from tests.utils import ResponsesSoap, make_resource SLUG = 'test' @@ -23,27 +23,6 @@ with open(os.path.join(os.path.dirname(__file__), 'data/small.jpg'), 'rb') as f: JPEG_CONTENT = f.read() -def make_response(name, items): - base = ''' - - - - -''' - root = ET.fromstring(base) - body = root.find('{http://schemas.xmlsoap.org/soap/envelope/}Body') - response_tag_name = '{urn:Webservice_Residants}PLS_%sResponse' % name - result_tag_name = 'PLS_%sResult' % name - response = ET.SubElement(body, response_tag_name) - result = ET.SubElement(response, result_tag_name) - for key, value in items: - elt = ET.SubElement(result, key) - if value: - elt.text = value - return ET.tostring(root) - - @pytest.fixture def dpark(db): resource = make_resource( @@ -94,10 +73,23 @@ def get_service(): yield get_service -def test_call_service_error(dpark, app, get_service): - get_service.return_value = MockedService(error_class=SOAPError('boom!')) +@responses.activate +def test_call_service_error(dpark, app): + responses.add(responses.GET, WSDL_URL, body=WSDL_CONTENT.encode()) + responses.add(responses.POST, SERVICE_URL, body=requests.ConnectionError()) resp = app.get('/dpark/test/ping/') - assert 'boom!' in resp.json['err_desc'] + assert 'is unreachable' in resp.json['err_desc'] + soap_fault = ''' + + + soap:Client + Unmarshalling Error: Not a number: abc + + +''' + responses.add(responses.POST, SERVICE_URL, body=soap_fault.encode()) + resp = app.get('/dpark/test/ping/') + assert 'Unmarshalling' in resp.json['err_desc'] def test_ping(dpark, app, get_service):