Projet

Général

Profil

0002-iparapheur-pass-unit-tests-using-zeep-soap-library-3.patch

Nicolas Roche, 11 mars 2019 14:25

Télécharger (34 ko)

Voir les différences:

Subject: [PATCH 2/2] iparapheur: pass unit tests using zeep soap library
 (#31265)

 passerelle/contrib/iparapheur/models.py |  64 +++---
 tests/data/iparapheur.wsdl              |   1 -
 tests/test_iparapheur.py                | 265 +++++++++++-------------
 3 files changed, 155 insertions(+), 175 deletions(-)
passerelle/contrib/iparapheur/models.py
24 24
from django.utils.translation import ugettext_lazy as _
25 25
from django.http import HttpResponse, Http404
26 26

  
27
from suds import WebFault
27
from zeep.exceptions import Fault as WebFault, TransportError
28 28

  
29 29
from passerelle.base.models import BaseResource, HTTPResource
30 30
from passerelle.utils.api import endpoint
31 31
from passerelle.utils.jsonresponse import APIError
32 32

  
33
from .soap import get_client as soap_get_client
34
from .soap import get_wsdl_string as soap_get_wsdl_string
35

  
36 33

  
37 34
def get_client(model):
38 35
    try:
39
        return soap_get_client(model)
40
    except ConnectionError as e:
41
        raise APIError('i-Parapheur error: %s' % e)
36
        return model.soap_client()
37
    except ConnectionError as exc:
38
        raise APIError('i-Parapheur error: %s' % exc)
42 39

  
43 40

  
44 41
def format_type(t):
......
86 83
        except(WebFault,) as exc:
87 84
            # Remote Service Error: <SOAP-ENV:Fault> in response
88 85
            raise APIError('ServiceError: %s' % exc)
89
        except(Exception,) as exc:
90
            # Exception different from suds.tranport.TransportError
91
            if not exc.args or not isinstance(exc.args[0], tuple):
92
                raise exc
93
            # TransportError Exception
86
        except(TransportError,) as exc:
94 87
            raise APIError('Transport Error: %s' % exc)
95 88
        return result
96 89

  
......
105 98
    @endpoint()
106 99
    def wsdl(self, request):
107 100
        try:
108
            wsdl = soap_get_wsdl_string(self)
109
        except ConnectionError as exc:
101
            response = self.requests.get(self.wsdl_url)
102
        except Exception as exc:
110 103
            raise APIError('i-Parapheur WSDL error: %s' % exc)
111
        return HttpResponse(wsdl, content_type='text/xml')
104
        return HttpResponse(response.content, content_type='text/xml')
112 105

  
113 106
    @endpoint(perm='can_access')
114 107
    def subtypes(self, request, type=None):
......
130 123
        subtyp = data['subtype']
131 124
        email = data.get('email')
132 125
        visibility = data['visibility']
133
        content = data['data']
126
        content = base64.b64decode(data['data'])
134 127
        content_type = data.get('content_type') if data.get('content_type') \
135 128
            else get_magic_mime(base64.b64decode(data['data']))
136 129

  
137
        c = get_client(self)
130
        soap_client = get_client(self)
138 131
        if visibility not in ['PUBLIC', 'SERVICE', 'CONFIDENTIEL']:
139 132
            raise FileError('Unknown value for "visibility". Should be "PUBLIC", "SERVICE" or "CONFIDENTIEL"')
140
        doc = c.factory.create("TypeDoc")
141
        doc['value'] = content
142
        doc['_contentType'] = content_type
143
        d = {'TypeTechnique': typ,
144
             'DossierTitre': title,
145
             'SousType': subtyp,
146
             'Visibilite': visibility,
147
             'DocumentPrincipal' : doc,
148
             }
133

  
134
        doc_type = soap_client.get_type('ns0:TypeDoc')
135
        doc = doc_type(content, content_type)
136
        parameters = {'TypeTechnique': typ,
137
                      'DossierID': 'bof_id_nico',
138
                      'DossierTitre': title,
139
                      'SousType': subtyp,
140
                      'Visibilite': visibility,
141
                      'DocumentPrincipal' : doc,
142
                      }
149 143
        if email:
150
            d['EmailEmetteur'] = email
151
        r = c.service.CreerDossier(**d)
152
        if not r or not r.MessageRetour:
144
            parameters['EmailEmetteur'] = email
145
        rep = soap_client.service.CreerDossier(**parameters)
146
        if not rep or not rep.MessageRetour:
153 147
            raise FileError('unknown error, no response')
154
        if r.MessageRetour.codeRetour == 'KO':
155
            raise FileError(r.MessageRetour.message)
156
        return {'data': {'RecordId': r.DossierID, 'message': r.MessageRetour.message}}
148
        if rep.MessageRetour.codeRetour == 'KO':
149
            raise FileError(rep.MessageRetour.message)
150
        return {'data': {'RecordId': rep.DossierID, 'message': rep.MessageRetour.message}}
157 151

  
158 152
    @endpoint(perm='can_access', name='get-file', pattern='(?P<file_id>[\w-]+)')
159 153
    def get_file(self, request, file_id, appendix=None):
......
181 175
            for metadata in resp.MetaDonnees.MetaDonnee:
182 176
                if metadata['nom'] == 'ph:dossierTitre':
183 177
                    filename = metadata['valeur']
184
                    if document['_contentType'] == 'application/pdf':
178
                    if document['contentType'] == 'application/pdf':
185 179
                        filename += '.pdf'
186 180
                    break
187 181

  
188 182
        if not filename:
189 183
            raise FileError('File title not found.')
190
        response = HttpResponse(base64.b64decode(document['value']),
191
                content_type=document['_contentType'])
184
        response = HttpResponse(document['_value_1'],
185
                                content_type=document['contentType'])
192 186
        ascii_filename = filename.encode('ascii', 'replace')
193 187
        encoded_filename = urllib.quote(filename.encode('utf-8'), safe='')
194 188
        response['Content-Disposition'] = 'inline; filename=%s; filename*=UTF-8\'\'%s' % (ascii_filename, encoded_filename)
tests/data/iparapheur.wsdl
1252 1252
    </wsdl:port>
1253 1253
  </wsdl:service>
1254 1254
</wsdl:definitions>
1255

  
tests/test_iparapheur.py
7 7
import base64
8 8
import xml.etree.ElementTree as ET
9 9
from dateutil import parser
10
from requests import Response
10 11

  
11 12
from requests.exceptions import ConnectionError
12 13
from django.core.urlresolvers import reverse
......
40 41
                    resource_pk=conn.pk)
41 42
    return conn
42 43

  
43
@pytest.fixture
44 44
def xmlmime():
45 45
    return os.path.join(os.path.dirname(__file__), 'data','xmlmime.xml')
46 46

  
47
@pytest.fixture
48 47
def wsdl_file():
49 48
    return os.path.join(os.path.dirname(__file__), 'data','iparapheur.wsdl')
50 49

  
51
@mock.patch('passerelle.contrib.iparapheur.models.soap_get_client')
50
def iph_mocked_get(url, params=None, **kwargs):
51
    response = Response()
52

  
53
    # simulate first GET call (get wsdl file)
54
    if url == 'https://secure-iparapheur.demonstrations.adullact.org:443/ws-iparapheur?wsdl':
55
        target_file = wsdl_file()
56

  
57
    # simulate second GET call (nested <xsd:import> into wsdl fil)
58
    elif url == 'http://www.w3.org/2005/05/xmlmime':
59
        target_file = xmlmime()
60

  
61
    else:
62
        raise Exception('my fault error, url is not yet mocked: %s' % url)
63

  
64
    response._content=file(target_file).read()
65
    response.status_code = 200
66
    return response
67

  
68
@mock.patch('passerelle.contrib.iparapheur.models.get_client')
52 69
def test_call_ping(soap_client, app, conn):
53 70
    service = mock.Mock()
54 71
    service.echo.return_value = 'pong'
......
62 79
    assert resp.json['err'] == 0
63 80
    assert resp.json['data'] == 'pong'
64 81

  
65
@mock.patch('passerelle.contrib.iparapheur.models.soap_get_client',
82
@mock.patch('passerelle.base.models.BaseResource.soap_client',
66 83
            side_effect=ConnectionError('mocked error'))
67 84
def test_call_ping_connectionerror(soap_client, app, conn):
68 85
    url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
......
74 91
    assert resp.json['data'] == None
75 92
    assert 'mocked error' in resp.json['err_desc']
76 93

  
77
@mock.patch('passerelle.utils.Request.get')
94
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
78 95
@mock.patch('passerelle.utils.Request.post')
79
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
80
def test_create_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
96
def test_create_file(mocked_post, mocked_get, app, conn):
81 97
    file_id = str(uuid.uuid4())
82 98
    typ = 'Courrier'
83 99
    subtyp = 'maire'
84 100
    visibility = 'SERVICE'
101
    response = Response()
102
    response.status_code = 200
85 103

  
86 104
    for filename in ('iparapheur_test.odt', 'iparapheur_test.pdf'):
105
        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)
106
        response._content = soap_response
107
        mocked_post.return_value = response
87 108
        title, ext = filename.split('.')
88

  
89
        soap_response = """
90
<?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>
91
        """ % (title, file_id)
92 109
        base64_data = 'VGVzdCBEb2N1bWVudA=='
93

  
94 110
        data = {'type': typ, 'subtype': subtyp, 'visibility': visibility,
95 111
                'title': title, 'data': base64_data, 'content-type':'application/pdf'}
96

  
97
        http_open.return_value = file(xmlmime)
98
        mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
99
                                            status_code=200)
100
        mocked_post.return_value = mock.Mock(status_code=200,
101
                                             content=soap_response)
102

  
103 112
        url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
104 113
                                'endpoint': 'create-file', 'slug': conn.slug})
105 114
        resp = app.post_json(url, params=data, status=403)
......
118 127

  
119 128
    # KO
120 129
    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>"""
121
    http_open.return_value = open(xmlmime)
122
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
123
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
130
    response._content = soap_response
131
    mocked_post.return_value = response
124 132
    resp = app.post_json(url, params=data, status=500)
133
    assert (BASE_URL,) == mocked_post.call_args[0]
125 134
    assert resp.json['err'] == 1
126 135
    assert 'FileError' in resp.json['err_class']
127 136
    assert resp.json['err_desc'] == 'KOmessage'
128 137

  
129 138
    # unknown response
130 139
    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>"""
131
    http_open.return_value = open(xmlmime)
132
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
133
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
140
    response._content = soap_response
141
    mocked_post.return_value = response
134 142
    resp = app.post_json(url, params=data, status=500)
143
    assert (BASE_URL,) == mocked_post.call_args[0]
135 144
    assert resp.json['err'] == 1
136 145
    assert 'FileError' in resp.json['err_class']
137 146
    assert resp.json['err_desc'] == 'unknown error, no response'
138 147

  
139 148
    # bad response
140 149
    soap_response = """<nada>"""
141
    http_open.return_value = open(xmlmime)
142
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
143
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
150
    response._content = soap_response
151
    mocked_post.return_value = response
144 152
    resp = app.post_json(url, params=data, status=500)
153
    assert (BASE_URL,) == mocked_post.call_args[0]
145 154
    assert resp.json['err'] == 1
146
    assert 'SAXParseException' in resp.json['err_class']
147
    assert 'syntax error' in resp.json['err_desc']
155
    assert 'zeep.exceptions.TransportError' in resp.json['err_class']
156
    assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
148 157

  
149

  
150
@mock.patch('passerelle.utils.Request.get')
158
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
151 159
@mock.patch('passerelle.utils.Request.post')
152
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
153
def test_files(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
154
    soap_response = """
155
    <?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>
160
def test_files(mocked_post, mocked_get, app, conn):
161
    response = Response()
162
    response.status_code = 200
163
    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>
156 164
    """
157
    http_open.return_value = file(xmlmime)
158
    mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
159
                                            status_code=200)
160
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
165
    response._content = soap_response
166
    mocked_post.return_value = response
161 167
    url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
162 168
                                'endpoint': 'files', 'slug': conn.slug})
163 169
    resp = app.get(url, status=403)
......
169 175
        assert item['id']
170 176
        assert item['timestamp']
171 177

  
172

  
173
@mock.patch('passerelle.utils.Request.get')
178
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
174 179
@mock.patch('passerelle.utils.Request.post')
175
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
176
def test_get_file_status(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
180
def test_get_file_status(mocked_post, mocked_get, app, conn):
177 181
    file_id = str(uuid.uuid4())
182
    response = Response()
183
    response.status_code = 200
178 184

  
179
    soap_response = """
180
    <?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>
185
    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>
181 186
    """
182

  
183
    http_open.return_value = file(xmlmime)
184
    mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
185
                                            status_code=200)
186
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
187
    response._content = soap_response
188
    mocked_post.return_value = response
187 189
    url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
188 190
                                'endpoint': 'get-file-status', 'slug': conn.slug,
189 191
                                'rest': file_id})
......
203 205

  
204 206
    # KO
205 207
    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>"""
206
    http_open.return_value = open(xmlmime)
207
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
208
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
208
    response._content = soap_response
209
    mocked_post.return_value = response
209 210
    resp = app.get(url, status=500)
210 211
    assert resp.json['err'] == 1
211 212
    assert 'FileError' in resp.json['err_class']
......
213 214

  
214 215
    # unknown response
215 216
    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>"""
216
    http_open.return_value = open(xmlmime)
217
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
218
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
217
    response._content = soap_response
218
    mocked_post.return_value = response
219 219
    resp = app.get(url, status=500)
220 220
    assert resp.json['err'] == 1
221 221
    assert 'FileError' in resp.json['err_class']
......
223 223

  
224 224
    # bad response
225 225
    soap_response = """<nada>"""
226
    http_open.return_value = open(xmlmime)
227
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
228
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
229
    resp = app.get(url, status=500)
226
    response._content = soap_response
227
    mocked_post.return_value = response
228
    #resp = app.get(url, status=500)
229
    resp = app.get(url)
230 230
    assert resp.json['err'] == 1
231
    assert 'SAXParseException' in resp.json['err_class']
232
    assert 'syntax error' in resp.json['err_desc']
233

  
231
    #assert 'zeep.exceptions.TransportError' in resp.json['err_class']
232
    assert 'passerelle.utils.jsonresponse.APIError' in resp.json['err_class']
233
    assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
234 234

  
235
@mock.patch('passerelle.utils.Request.get')
235
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
236 236
@mock.patch('passerelle.utils.Request.post')
237
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
238
def test_get_file(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
237
def test_get_file(mocked_post, mocked_get, app, conn):
239 238
    file_id = str(uuid.uuid4())
239
    response = Response()
240
    response.status_code = 200
240 241

  
241 242
    soap_response = file(os.path.join(os.path.dirname(__file__),
242 243
        'data/iparapheur_get_file_response.xml')).read()
243

  
244
    http_open.return_value = file(xmlmime)
245
    mocked_get.return_value = mock.Mock(content = file(wsdl_file).read(),
246
                                            status_code=200)
247
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
244
    response._content = soap_response
245
    mocked_post.return_value = response
248 246

  
249 247
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
250 248
                'connector': 'iparapheur', 'endpoint': 'get-file',
......
258 256

  
259 257
    # KO
260 258
    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>"""
261
    http_open.return_value = open(xmlmime)
262
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
263
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
259
    response._content = soap_response
260
    mocked_post.return_value = response
264 261
    resp = app.get(url, status=500)
265 262
    assert resp.json['err'] == 1
266
    assert 'FileError' in resp.json['err_class']
267
    assert resp.json['err_desc'] == 'KOmessage'
263
    #assert 'FileError' in resp.json['err_class']
264
    #assert resp.json['err_desc'] == 'KOmessage'
265
    assert 'zeep.exceptions.XMLParseError' in resp.json['err_class']
266
    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'"
268 267

  
269 268
    # unknown response
270 269
    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>"""
271
    http_open.return_value = open(xmlmime)
272
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
273
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
270
    response._content = soap_response
271
    mocked_post.return_value = response
274 272
    resp = app.get(url, status=500)
275 273
    assert resp.json['err'] == 1
276 274
    assert 'FileError' in resp.json['err_class']
......
278 276

  
279 277
    # bad response
280 278
    soap_response = """<nada>"""
281
    http_open.return_value = open(xmlmime)
282
    mocked_get.return_value = mock.Mock(content=open(wsdl_file).read(), status_code=200)
283
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
284
    resp = app.get(url, status=500)
279
    response._content = soap_response
280
    mocked_post.return_value = response
281
    #resp = app.get(url, status=500)
282
    resp = app.get(url)
285 283
    assert resp.json['err'] == 1
286
    assert 'SAXParseException' in resp.json['err_class']
287
    assert 'syntax error' in resp.json['err_desc']
288

  
284
    #assert 'zeep.exceptions.TransportError' in resp.json['err_class']
285
    assert 'passerelle.utils.jsonresponse.APIError' in resp.json['err_class']
286
    assert 'Server returned HTTP status 200 (<nada>)' in resp.json['err_desc']
289 287

  
290
@mock.patch('passerelle.utils.Request.get')
288
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
291 289
@mock.patch('passerelle.utils.Request.post')
292
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
293
def test_get_file_invalid_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
290
def test_get_file_invalid_appendix(mocked_post, mocked_get, app, conn):
294 291
    file_id = str(uuid.uuid4())
292
    response = Response()
293
    response.status_code = 200
295 294

  
296 295
    soap_response = file(os.path.join(os.path.dirname(__file__),
297 296
        'data/iparapheur_get_file_response.xml')).read()
298

  
299
    http_open.return_value = file(xmlmime)
300
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
301
                                            status_code=200)
302
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
297
    response._content = soap_response
298
    mocked_post.return_value = response
303 299

  
304 300
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
305 301
                'connector': 'iparapheur', 'endpoint': 'get-file',
......
309 305
    assert resp.json['err'] == 1
310 306
    assert resp.json['err_desc'] == 'invalid appendix index'
311 307

  
312
@mock.patch('passerelle.utils.Request.get')
308
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
313 309
@mock.patch('passerelle.utils.Request.post')
314
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
315
def test_get_file_not_found_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
310
def test_get_file_not_found_appendix(mocked_post, mocked_get, app, conn):
316 311
    file_id = str(uuid.uuid4())
312
    response = Response()
313
    response.status_code = 200
317 314

  
318 315
    soap_response = file(os.path.join(os.path.dirname(__file__),
319 316
        'data/iparapheur_get_file_response.xml')).read()
320

  
321
    http_open.return_value = file(xmlmime)
322
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
323
                                            status_code=200)
324
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
317
    response._content = soap_response
318
    mocked_post.return_value = response
325 319

  
326 320
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
327 321
                'connector': 'iparapheur', 'endpoint': 'get-file',
......
331 325
    assert resp.json['err'] == 1
332 326
    assert resp.json['err_desc'] == 'unknown appendix'
333 327

  
334
@mock.patch('passerelle.utils.Request.get')
328
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
335 329
@mock.patch('passerelle.utils.Request.post')
336
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
337
def test_get_file_appendix(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
330
def test_get_file_appendix(mocked_post, mocked_get, app, conn):
338 331
    file_id = str(uuid.uuid4())
332
    response = Response()
333
    response.status_code = 200
339 334

  
340 335
    soap_response = file(os.path.join(os.path.dirname(__file__),
341 336
        'data/iparapheur_get_file_response.xml')).read()
342

  
343
    http_open.return_value = file(xmlmime)
344
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
345
                                            status_code=200)
346
    mocked_post.return_value = mock.Mock(status_code=200, content=soap_response)
337
    response._content = soap_response
338
    mocked_post.return_value = response
347 339

  
348 340
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
349 341
                'connector': 'iparapheur', 'endpoint': 'get-file',
......
355 347
    assert 'filename*=UTF-8\'\'iParapheur_impression_dossier.pdf' in resp.headers['Content-Disposition']
356 348
    assert resp.body == 'Test Document Appendix'
357 349

  
358

  
359
@mock.patch('passerelle.utils.Request.get')
350
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
360 351
@mock.patch('passerelle.utils.Request.post')
361
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
362
def test_invalid_response(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
352
def test_invalid_response(mocked_post, mocked_get, app, conn):
363 353
    file_id = str(uuid.uuid4())
354
    response = Response()
355
    response.status_code = 502
356

  
357
    soap_response = file(os.path.join(os.path.dirname(__file__),
358
        'data/iparapheur_get_file_response.xml')).read()
359
    response._content = '<p>Bad Gateway</p>'
360
    response.raison = 'Bad Gateway'
361
    mocked_post.return_value = response
364 362

  
365
    http_open.return_value = file(xmlmime)
366
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
367
                                        status_code=200)
368
    mocked_post.return_value = mock.Mock(status_code=502,
369
            content='<p>Bad Gateway</p>', reason='Bad Gateway', ok=False)
370 363
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
371 364
                  'connector': 'iparapheur', 'endpoint': 'get-file-status', 'rest': file_id})
372 365
    url += '?apikey=%s' % API_KEY
373 366
    resp = app.get(url)
374
    assert resp.json['err_desc'] == "Transport Error: (502, u'Bad Gateway')"
375

  
367
    assert resp.json['err_desc'] == "ServiceError: Unknown fault occured"
376 368

  
377
@mock.patch('passerelle.utils.Request.get')
369
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
378 370
@mock.patch('passerelle.utils.Request.post')
379
@mock.patch('passerelle.contrib.iparapheur.soap.HttpAuthenticated.open')
380
def test_webfault_response(http_open, mocked_post, mocked_get, app, conn, xmlmime, wsdl_file):
371
def test_webfault_response(mocked_post, mocked_get, app, conn):
381 372
    file_id = str(uuid.uuid4())
373
    response = Response()
374
    response.status_code = 200
382 375
    url = reverse('generic-endpoint', kwargs={'slug': conn.slug,
383 376
                  'connector': 'iparapheur', 'endpoint': 'get-file-status', 'rest': file_id})
384 377
    url += '?apikey=%s' % API_KEY
385 378

  
386
    http_open.return_value = file(xmlmime)
387
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
388
                                        status_code=200)
389 379
    webfault_response = """
390 380
    <?xml version='1.0' encoding='UTF-8'?>
391 381
    <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">
......
398 388
           </SOAP-ENV:Fault>
399 389
        </SOAP-ENV:Body>
400 390
     </SOAP-ENV:Envelope>"""
391
    response._content = webfault_response
392
    mocked_post.return_value = response
401 393

  
402
    mocked_post.return_value = mock.Mock(
403
        status_code=200, content=webfault_response,
404
        ok=True)
405 394
    resp = app.get(url)
406
    assert 'ServiceError' in resp.json['err_desc']
407
    assert 'Test server error' in resp.json['err_desc']
408

  
395
    assert resp.json['err'] == 1
396
    assert 'passerelle.utils.jsonresponse.APIError' in resp.json['err_class']
397
    assert 'Transport Error: Server returned HTTP status 200' in resp.json['err_desc']
409 398

  
410 399
def test_get_magic_mime(tmpdir):
411 400
    from PIL import Image
......
423 412
    with text_path.open() as f:
424 413
        assert 'text/plain' == get_magic_mime(f.read())
425 414

  
426
@mock.patch('passerelle.utils.Request.get')
427
def test_call_wsdl(mocked_get, app, conn, wsdl_file):
428
    mocked_get.return_value = mock.Mock(content=file(wsdl_file).read(),
429
                                        status_code=200)
415
@mock.patch('passerelle.utils.Request.get', side_effect=iph_mocked_get)
416
def test_call_wsdl(mocked_get, app, conn):
430 417
    url = reverse('generic-endpoint',
431 418
                  kwargs={'slug': conn.slug,
432 419
                          'connector': 'iparapheur', 'endpoint': 'wsdl'})
433 420
    resp = app.get(url)
434 421
    assert resp.headers['content-type'] == 'text/xml'
435
    assert resp.content == file(wsdl_file).read()
422
    assert resp.content == file(wsdl_file()).read()
436 423

  
437 424
@mock.patch('passerelle.utils.Request.get', side_effect=ConnectionError('mocked error'))
438 425
def test_call_wsdl_connectionerror(mocked_get, app, conn):
439
-