iparapheur: add a field to override endpoint location on wsdl (#30258)

This commit is contained in:
Nicolas Roche 2019-03-12 18:16:40 +01:00
parent 00211a4cc8
commit 0b82a19d0c
3 changed files with 54 additions and 4 deletions

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.18 on 2019-03-12 17:32
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('iparapheur', '0006_use_http_resource'),
]
operations = [
migrations.AddField(
model_name='iparapheur',
name='wsdl_endpoint_location',
field=models.CharField(blank=True, help_text='override WSDL endpoint location', max_length=256, verbose_name='WSDL endpoint location'),
),
]

View File

@ -33,7 +33,17 @@ from passerelle.utils.jsonresponse import APIError
def get_client(model):
try:
return model.soap_client()
soap_client = model.soap_client()
# overrides the service port address URL defined in the WSDL.
if model.wsdl_endpoint_location:
soap_client.overridden_service = soap_client.create_service(
# picks the first binding in the WSDL as the default
soap_client.wsdl.bindings.keys()[0],
model.wsdl_endpoint_location)
else:
soap_client.overridden_service = soap_client.service
return soap_client
except ConnectionError as exc:
raise APIError('i-Parapheur error: %s' % exc)
@ -67,6 +77,9 @@ class IParapheur(BaseResource, HTTPResource):
wsdl_url = models.CharField(max_length=128, blank=False,
verbose_name=_('WSDL URL'),
help_text=_('WSDL URL'))
wsdl_endpoint_location = models.CharField(max_length=256, blank=True,
verbose_name=_('WSDL endpoint location'),
help_text=_('override WSDL endpoint location'))
category = _('Business Process Connectors')
class Meta:
@ -79,7 +92,7 @@ class IParapheur(BaseResource, HTTPResource):
def call(self, service_name, *args, **kwargs):
client = get_client(self)
try:
result = getattr(client.service, service_name)(*args, **kwargs)
result = getattr(client.overridden_service, service_name)(*args, **kwargs)
except WebFault as exc:
# Remote Service Error: <SOAP-ENV:Fault> in response
raise APIError('ServiceError: %s' % exc)
@ -144,7 +157,7 @@ class IParapheur(BaseResource, HTTPResource):
}
if email:
parameters['EmailEmetteur'] = email
resp = soap_client.service.CreerDossier(**parameters)
resp = soap_client.overridden_service.CreerDossier(**parameters)
if not resp or not resp.MessageRetour:
raise FileError('unknown error, no response')
if resp.MessageRetour.codeRetour == 'KO':

View File

@ -70,7 +70,7 @@ def iph_mocked_get(url, params=None, **kwargs):
def test_call_ping(soap_client, app, conn):
service = mock.Mock()
service.echo.return_value = 'pong'
mocked_client = mock.Mock(service=service)
mocked_client = mock.Mock(overridden_service=service)
soap_client.return_value = mocked_client
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
'endpoint': 'ping', 'slug': conn.slug})
@ -541,3 +541,20 @@ def test_subtypes(mocked_post, mocked_get, app, conn):
resp = app.get(url)
assert resp.json['err'] == 0
assert resp.json['data'] == []
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
def test_call_ping_overrinding_endpoint_url(mocked_post, mocked_get, app, conn):
response = Response()
response.status_code = 200
soap_response = 'no importance'
response._content = soap_response
mocked_post.return_value = response
conn.wsdl_endpoint_location = 'http://www.new.location.com'
conn.save()
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
'endpoint': 'ping', 'slug': conn.slug})
url += '?apikey=%s' % API_KEY
app.get(url)
assert mocked_post.call_args[0][0] == 'http://www.new.location.com'