iparapheur: pass unit tests using zeep soap library (#31265)

This commit is contained in:
Nicolas Roche 2019-03-06 16:13:27 +01:00
parent cc0cc0767d
commit ac5172e542
4 changed files with 157 additions and 265 deletions

View File

@ -24,21 +24,18 @@ from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponse, Http404
from suds import WebFault
from zeep.exceptions import Fault as WebFault, TransportError
from passerelle.base.models import BaseResource, HTTPResource
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
from .soap import get_client as soap_get_client
from .soap import get_wsdl_string as soap_get_wsdl_string
def get_client(model):
try:
return soap_get_client(model)
except ConnectionError as e:
raise APIError('i-Parapheur error: %s' % e)
return model.soap_client()
except ConnectionError as exc:
raise APIError('i-Parapheur error: %s' % exc)
def format_type(t):
@ -83,14 +80,10 @@ class IParapheur(BaseResource, HTTPResource):
client = get_client(self)
try:
result = getattr(client.service, service_name)(*args, **kwargs)
except(WebFault,) as exc:
except WebFault as exc:
# Remote Service Error: <SOAP-ENV:Fault> in response
raise APIError('ServiceError: %s' % exc)
except(Exception,) as exc:
# Exception different from suds.tranport.TransportError
if not exc.args or not isinstance(exc.args[0], tuple):
raise exc
# TransportError Exception
except TransportError as exc:
raise APIError('Transport Error: %s' % exc)
return result
@ -105,10 +98,10 @@ class IParapheur(BaseResource, HTTPResource):
@endpoint()
def wsdl(self, request):
try:
wsdl = soap_get_wsdl_string(self)
except ConnectionError as exc:
response = self.requests.get(self.wsdl_url)
except Exception as exc:
raise APIError('i-Parapheur WSDL error: %s' % exc)
return HttpResponse(wsdl, content_type='text/xml')
return HttpResponse(response.content, content_type='text/xml')
@endpoint(perm='can_access')
def subtypes(self, request, type=None):
@ -130,30 +123,31 @@ class IParapheur(BaseResource, HTTPResource):
subtyp = data['subtype']
email = data.get('email')
visibility = data['visibility']
content = data['data']
content = base64.b64decode(data['data'])
content_type = data.get('content_type') if data.get('content_type') \
else get_magic_mime(base64.b64decode(data['data']))
else get_magic_mime(content)
c = get_client(self)
soap_client = get_client(self)
if visibility not in ['PUBLIC', 'SERVICE', 'CONFIDENTIEL']:
raise FileError('Unknown value for "visibility". Should be "PUBLIC", "SERVICE" or "CONFIDENTIEL"')
doc = c.factory.create("TypeDoc")
doc['value'] = content
doc['_contentType'] = content_type
d = {'TypeTechnique': typ,
'DossierTitre': title,
'SousType': subtyp,
'Visibilite': visibility,
'DocumentPrincipal' : doc,
}
doc_type = soap_client.get_type('ns0:TypeDoc')
doc = doc_type(content, content_type)
parameters = {'TypeTechnique': typ,
'DossierID': 'bof_id_nico',
'DossierTitre': title,
'SousType': subtyp,
'Visibilite': visibility,
'DocumentPrincipal' : doc,
}
if email:
d['EmailEmetteur'] = email
r = c.service.CreerDossier(**d)
if not r or not r.MessageRetour:
parameters['EmailEmetteur'] = email
rep = soap_client.service.CreerDossier(**parameters)
if not rep or not rep.MessageRetour:
raise FileError('unknown error, no response')
if r.MessageRetour.codeRetour == 'KO':
raise FileError(r.MessageRetour.message)
return {'data': {'RecordId': r.DossierID, 'message': r.MessageRetour.message}}
if rep.MessageRetour.codeRetour == 'KO':
raise FileError(rep.MessageRetour.message)
return {'data': {'RecordId': rep.DossierID, 'message': rep.MessageRetour.message}}
@endpoint(perm='can_access', name='get-file', pattern='(?P<file_id>[\w-]+)')
def get_file(self, request, file_id, appendix=None):
@ -181,14 +175,14 @@ class IParapheur(BaseResource, HTTPResource):
for metadata in resp.MetaDonnees.MetaDonnee:
if metadata['nom'] == 'ph:dossierTitre':
filename = metadata['valeur']
if document['_contentType'] == 'application/pdf':
if document['contentType'] == 'application/pdf':
filename += '.pdf'
break
if not filename:
raise FileError('File title not found.')
response = HttpResponse(base64.b64decode(document['value']),
content_type=document['_contentType'])
response = HttpResponse(document['_value_1'],
content_type=document['contentType'])
ascii_filename = filename.encode('ascii', 'replace')
encoded_filename = urllib.quote(filename.encode('utf-8'), safe='')
response['Content-Disposition'] = 'inline; filename=%s; filename*=UTF-8\'\'%s' % (ascii_filename, encoded_filename)

View File

@ -1,87 +0,0 @@
# Passerelle - uniform access to data and services
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# borrowed from https://pypi.python.org/pypi/suds_requests
# and https://docs.oracle.com/cd/E50245_01/E50253/html/vmprg-soap-example-authentication-python.html
import StringIO
from suds.client import Client
from suds.transport.http import HttpAuthenticated
from suds.transport import Request, Reply, TransportError
from suds.plugin import MessagePlugin, DocumentPlugin
from requests.exceptions import RequestException
class Filter(MessagePlugin):
def marshalled(self, context):
context.envelope.set('xmlns:xm', 'http://www.w3.org/2005/05/xmlmime')
def received(self, context):
reply = context.reply
context.reply = reply[reply.find("<?xml version"):reply.rfind(">") + 1]
class Handlewsdl(DocumentPlugin):
def loaded(self, context):
# unknown types, so present them as strings
context.document = context.document.replace('type="iph:DossierID"', 'type="xsd:string"')
context.document = context.document.replace('type="iph:TypeTechnique"', 'type="xsd:string"')
class Transport(HttpAuthenticated):
def __init__(self, model, **kwargs):
self.model = model
HttpAuthenticated.__init__(self, **kwargs)
def open(self, request):
# only use our custom handler to fetch service resources, not schemas
# from other namespaces
if 'www.w3.org' in request.url:
return HttpAuthenticated.open(self, request)
resp = self.model.requests.get(request.url, headers=request.headers)
return StringIO.StringIO(resp.content)
def send(self, request):
request.message = request.message.replace("contentType", "xm:contentType")
self.addcredentials(request)
try:
resp = self.model.requests.post(request.url, data=request.message,
headers=request.headers)
except(RequestException,) as e:
raise TransportError(e.message.message, None)
if resp.status_code in (202, 204):
return None
elif not resp.ok:
raise TransportError(
resp.reason,
resp.status_code, fp=StringIO.StringIO(resp.content))
else:
return Reply(resp.status_code, resp.headers, resp.content)
def get_client(instance):
transport = Transport(instance)
return Client(instance.wsdl_url, transport=transport,
plugins=[Handlewsdl(), Filter()], cache=None)
def get_wsdl_string(instance):
'''download wsdl like suds's DocumentReader does it (but do not parse it)'''
transport = Transport(instance)
return transport.open(Request(instance.wsdl_url))

View File

@ -1252,4 +1252,3 @@ DemanderMiseAJourTdt : si "OUI", alors iParapheur initie une transaction de mise
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View File

@ -7,6 +7,7 @@ import os
import base64
import xml.etree.ElementTree as ET
from dateutil import parser
from requests import Response
from requests.exceptions import ConnectionError
from django.core.urlresolvers import reverse
@ -40,15 +41,31 @@ def conn():
resource_pk=conn.pk)
return conn
@pytest.fixture
def xmlmime():
return os.path.join(os.path.dirname(__file__), 'data','xmlmime.xml')
@pytest.fixture
def wsdl_file():
return os.path.join(os.path.dirname(__file__), 'data','iparapheur.wsdl')
@mock.patch('passerelle.contrib.iparapheur.models.soap_get_client')
def iph_mocked_get(url, params=None, **kwargs):
response = Response()
# simulate first GET call (get wsdl file)
if url == 'https://secure-iparapheur.demonstrations.adullact.org:443/ws-iparapheur?wsdl':
target_file = wsdl_file()
# simulate second GET call (nested <xsd:import> into wsdl fil)
elif url == 'http://www.w3.org/2005/05/xmlmime':
target_file = xmlmime()
else:
raise Exception('my fault error, url is not yet mocked: %s' % url)
response._content=file(target_file).read()
response.status_code = 200
return response
@mock.patch('passerelle.contrib.iparapheur.models.get_client')
def test_call_ping(soap_client, app, conn):
service = mock.Mock()
service.echo.return_value = 'pong'
@ -62,7 +79,7 @@ def test_call_ping(soap_client, app, conn):
assert resp.json['err'] == 0
assert resp.json['data'] == 'pong'
@mock.patch('passerelle.contrib.iparapheur.models.soap_get_client',
@mock.patch('passerelle.base.models.BaseResource.soap_client',
side_effect=ConnectionError('mocked error'))
def test_call_ping_connectionerror(soap_client, app, conn):
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
@ -74,32 +91,24 @@ def test_call_ping_connectionerror(soap_client, app, conn):
assert resp.json['data'] == None
assert 'mocked error' in resp.json['err_desc']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_create_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_create_file(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
typ = 'Courrier'
subtyp = 'maire'
visibility = 'SERVICE'
response = Response()
response.status_code = 200
for filename in ('iparapheur_test.odt', 'iparapheur_test.pdf'):
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><MessageRetour><codeRetour>OK</codeRetour><message>Dossier %s soumis dans le circuit</message><severite>INFO</severite></MessageRetour><DossierID>%s</DossierID></CreerDossierResponse></S:Body></S:Envelope>""" % (filename, file_id)
response._content = soap_response
mocked_post.return_value = response
title, ext = filename.split('.')
soap_response = """
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><MessageRetour><codeRetour>OK</codeRetour><message>Dossier %s soumis dans le circuit</message><severite>INFO</severite></MessageRetour><DossierID>%s</DossierID></CreerDossierResponse></S:Body></S:Envelope>
""" % (title, file_id)
base64_data = 'VGVzdCBEb2N1bWVudA=='
data = {'type': typ, 'subtype': subtyp, 'visibility': visibility,
'title': title, 'data': base64_data, 'content-type':'application/pdf'}
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200,
content=soap_response)
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
'endpoint': 'create-file', 'slug': conn.slug})
resp = app.post_json(url, params=data, status=403)
@ -118,46 +127,43 @@ def test_create_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsd
# KO
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><MessageRetour><codeRetour>KO</codeRetour><message>KOmessage</message><severite>INFO</severite></MessageRetour></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.post_json(url, params=data, status=500)
assert (BASE_URL,) == mocked_post.call_args[0]
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
assert resp.json['err_desc'] == 'KOmessage'
# unknown response
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.post_json(url, params=data, status=500)
assert (BASE_URL,) == mocked_post.call_args[0]
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
assert resp.json['err_desc'] == 'unknown error, no response'
# bad response
soap_response = """<nada>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.post_json(url, params=data, status=500)
assert (BASE_URL,) == mocked_post.call_args[0]
assert resp.json['err'] == 1
assert 'SAXParseException' in resp.json['err_class']
assert 'syntax error' in resp.json['err_desc']
assert 'zeep.exceptions.TransportError' in resp.json['err_class']
assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_files(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
soap_response = """
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><RechercherDossiersResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><LogDossier><timestamp>2015-10-29T15:42:08.732+01:00</timestamp><nom>test</nom><status>Lu</status><annotation></annotation><accessible>KO</accessible></LogDossier><LogDossier><timestamp>2015-10-29T15:52:42.167+01:00</timestamp><nom>Test2</nom><status>RejetSignataire</status><annotation></annotation><accessible>OK</accessible></LogDossier><LogDossier><timestamp>2015-11-25T12:13:30.830+01:00</timestamp><nom>6ceecfb7-67ee-4388-8943-35911c640031</nom><status>NonLu</status><annotation></annotation><accessible>Recuperable</accessible></LogDossier></RechercherDossiersResponse></S:Body></S:Envelope>
def test_files(mocked_post, mocked_get, app, conn):
response = Response()
response.status_code = 200
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><RechercherDossiersResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><LogDossier><timestamp>2015-10-29T15:42:08.732+01:00</timestamp><nom>test</nom><status>Lu</status><annotation></annotation><accessible>KO</accessible></LogDossier><LogDossier><timestamp>2015-10-29T15:52:42.167+01:00</timestamp><nom>Test2</nom><status>RejetSignataire</status><annotation></annotation><accessible>OK</accessible></LogDossier><LogDossier><timestamp>2015-11-25T12:13:30.830+01:00</timestamp><nom>6ceecfb7-67ee-4388-8943-35911c640031</nom><status>NonLu</status><annotation></annotation><accessible>Recuperable</accessible></LogDossier></RechercherDossiersResponse></S:Body></S:Envelope>
"""
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
'endpoint': 'files', 'slug': conn.slug})
resp = app.get(url, status=403)
@ -169,21 +175,17 @@ def test_files(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file
assert item['id']
assert item['timestamp']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_get_file_status(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_get_file_status(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
soap_response = """
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetHistoDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><LogDossier><timestamp>2016-04-05T17:57:03.893+02:00</timestamp><nom>webservices gru</nom><status>NonLu</status><annotation>Création de dossier</annotation></LogDossier><LogDossier><timestamp>2016-04-05T17:58:46.716+02:00</timestamp><nom>webservices gru</nom><status>NonLu</status><annotation>super</annotation></LogDossier><LogDossier><timestamp>2016-04-05T17:58:46.727+02:00</timestamp><nom>webservices gru</nom><status>Archive</status><annotation>Circuit terminé, dossier archivable</annotation></LogDossier><MessageRetour><codeRetour>OK</codeRetour><message></message><severite>INFO</severite></MessageRetour></GetHistoDossierResponse></S:Body></S:Envelope>
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetHistoDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><LogDossier><timestamp>2016-04-05T17:57:03.893+02:00</timestamp><nom>webservices gru</nom><status>NonLu</status><annotation>Création de dossier</annotation></LogDossier><LogDossier><timestamp>2016-04-05T17:58:46.716+02:00</timestamp><nom>webservices gru</nom><status>NonLu</status><annotation>super</annotation></LogDossier><LogDossier><timestamp>2016-04-05T17:58:46.727+02:00</timestamp><nom>webservices gru</nom><status>Archive</status><annotation>Circuit terminé, dossier archivable</annotation></LogDossier><MessageRetour><codeRetour>OK</codeRetour><message></message><severite>INFO</severite></MessageRetour></GetHistoDossierResponse></S:Body></S:Envelope>
"""
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
'endpoint': 'get-file-status', 'slug': conn.slug,
'rest': file_id})
@ -203,9 +205,8 @@ def test_get_file_status(http_open, mocked_post, mocked_get, app, conn, xmlmime,
# KO
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><MessageRetour><codeRetour>KO</codeRetour><message>KOmessage</message><severite>INFO</severite></MessageRetour></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.get(url, status=500)
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
@ -213,9 +214,8 @@ def test_get_file_status(http_open, mocked_post, mocked_get, app, conn, xmlmime,
# unknown response
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.get(url, status=500)
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
@ -223,28 +223,26 @@ def test_get_file_status(http_open, mocked_post, mocked_get, app, conn, xmlmime,
# bad response
soap_response = """<nada>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
resp = app.get(url, status=500)
response._content = soap_response
mocked_post.return_value = response
#resp = app.get(url, status=500)
resp = app.get(url)
assert resp.json['err'] == 1
assert 'SAXParseException' in resp.json['err_class']
assert 'syntax error' in resp.json['err_desc']
#assert 'zeep.exceptions.TransportError' in resp.json['err_class']
assert 'passerelle.utils.jsonresponse.APIError' in resp.json['err_class']
assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_get_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_get_file(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
soap_response = file(os.path.join(os.path.dirname(__file__),
'data/iparapheur_get_file_response.xml')).read()
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file',
@ -258,19 +256,19 @@ def test_get_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_f
# KO
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"><MessageRetour><codeRetour>KO</codeRetour><message>KOmessage</message><severite>INFO</severite></MessageRetour></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.get(url, status=500)
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
assert resp.json['err_desc'] == 'KOmessage'
#assert 'FileError' in resp.json['err_class']
#assert resp.json['err_desc'] == 'KOmessage'
assert 'zeep.exceptions.XMLParseError' in resp.json['err_class']
assert resp.json['err_desc'] == "Unexpected element u'{http://www.adullact.org/spring-ws/iparapheur/1.0}MessageRetour', expected u'{http://www.adullact.org/spring-ws/iparapheur/1.0}TypeTechnique'"
# unknown response
soap_response = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><CreerDossierResponse xmlns="http://www.adullact.org/spring-ws/iparapheur/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"></CreerDossierResponse></S:Body></S:Envelope>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
resp = app.get(url, status=500)
assert resp.json['err'] == 1
assert 'FileError' in resp.json['err_class']
@ -278,28 +276,26 @@ def test_get_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_f
# bad response
soap_response = """<nada>"""
http_open.return_value = open(xmlmime)
mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
resp = app.get(url, status=500)
response._content = soap_response
mocked_post.return_value = response
#resp = app.get(url, status=500)
resp = app.get(url)
assert resp.json['err'] == 1
assert 'SAXParseException' in resp.json['err_class']
assert 'syntax error' in resp.json['err_desc']
#assert 'zeep.exceptions.TransportError' in resp.json['err_class']
assert 'passerelle.utils.jsonresponse.APIError' in resp.json['err_class']
assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_get_file_invalid_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_get_file_invalid_appendix(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
soap_response = file(os.path.join(os.path.dirname(__file__),
'data/iparapheur_get_file_response.xml')).read()
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file',
@ -309,19 +305,17 @@ def test_get_file_invalid_appendix(http_open, mocked_post, mocked_get, app, conn
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'invalid appendix index'
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_get_file_not_found_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_get_file_not_found_appendix(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
soap_response = file(os.path.join(os.path.dirname(__file__),
'data/iparapheur_get_file_response.xml')).read()
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file',
@ -331,19 +325,17 @@ def test_get_file_not_found_appendix(http_open, mocked_post, mocked_get, app, co
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'unknown appendix'
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_get_file_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_get_file_appendix(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
soap_response = file(os.path.join(os.path.dirname(__file__),
'data/iparapheur_get_file_response.xml')).read()
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
response._content = soap_response
mocked_post.return_value = response
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file',
@ -355,39 +347,36 @@ def test_get_file_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmim
assert 'filename*=UTF-8\'\'iParapheur_impression_dossier.pdf' in resp.headers['Content-Disposition']
assert resp.body == 'Test Document Appendix'
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_invalid_response(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_invalid_response(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 502
soap_response = file(os.path.join(os.path.dirname(__file__),
'data/iparapheur_get_file_response.xml')).read()
response._content = '<p>Bad Gateway</p>'
response.raison = 'Bad Gateway'
mocked_post.return_value = response
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
mocked_post.return_value = mock.Mock(status_code=502,
content='<p>Bad Gateway</p>', reason='Bad Gateway', ok=False)
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file-status', 'rest': file_id})
url += '?apikey=%s' % API_KEY
resp = app.get(url)
assert resp.json['err_desc'] == "Transport Error: (502, u'Bad Gateway')"
assert resp.json['err_desc'] == "ServiceError: Unknown fault occured"
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
def test_webfault_response(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
def test_webfault_response(mocked_post, mocked_get, app, conn):
file_id = str(uuid.uuid4())
response = Response()
response.status_code = 200
url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'get-file-status', 'rest': file_id})
url += '?apikey=%s' % API_KEY
http_open.return_value = file(xmlmime)
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
webfault_response = """
<?xml version='1.0' encoding='UTF-8'?>
webfault_response = """<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
@ -398,15 +387,14 @@ def test_webfault_response(http_open, mocked_post, mocked_get, app, conn, xmlmim
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"""
response._content = webfault_response
mocked_post.return_value = response
mocked_post.return_value = mock.Mock(
status_code=200, content=webfault_response,
ok=True)
resp = app.get(url)
assert 'ServiceError' in resp.json['err_desc']
assert resp.json['err'] == 1
assert 'ServiceError:' in resp.json['err_desc']
assert 'Test server error' in resp.json['err_desc']
def test_get_magic_mime(tmpdir):
from PIL import Image
from passerelle.contrib.iparapheur.models import get_magic_mime
@ -423,16 +411,14 @@ def test_get_magic_mime(tmpdir):
with text_path.open() as f:
assert 'text/plain' == get_magic_mime(f.read())
@mock.patch('passerelle.utils.Request.get')
def test_call_wsdl(mocked_get, app, conn, wsdl_file):
mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
status_code=200)
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
def test_call_wsdl(mocked_get, app, conn):
url = reverse('generic-endpoint',
kwargs={'slug': conn.slug,
'connector': 'iparapheur', 'endpoint': 'wsdl'})
resp = app.get(url)
assert resp.headers['content-type'] == 'text/xml'
assert resp.content == file(wsdl_file).read()
assert resp.content == file(wsdl_file()).read()
@mock.patch('passerelle.utils.Request.get', side_effect=ConnectionError('mocked error'))
def test_call_wsdl_connectionerror(mocked_get, app, conn):