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):