Projet

Général

Profil

0001-iparapheur-add-endpoint-to-display-raw-wsdl-30257.patch

Nicolas Roche, 28 février 2019 17:17

Télécharger (4,53 ko)

Voir les différences:

Subject: [PATCH] iparapheur: add endpoint to display raw wsdl (#30257)

 passerelle/contrib/iparapheur/models.py       |  9 +++++++++
 passerelle/contrib/iparapheur/soap.py         |  7 ++++++-
 .../iparapheur/iparapheur_detail.html         |  4 ++++
 tests/test_iparapheur.py                      | 20 +++++++++++++++++++
 4 files changed, 39 insertions(+), 1 deletion(-)
passerelle/contrib/iparapheur/models.py
31 31
from passerelle.utils.jsonresponse import APIError
32 32

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

  
35 36

  
36 37
def get_client(model):
......
111 112
    def ping(self, request):
112 113
        return {'data': self.call('echo', 'ping')}
113 114

  
115
    @endpoint()
116
    def wsdl(self, request):
117
        try:
118
            wsdl = soap_get_wsdl_string(self)
119
        except ConnectionError as exc:
120
            raise APIError('i-Parapheur WSDL error: %s' % exc)
121
        return HttpResponse(wsdl, content_type='text/xml')
122

  
114 123
    @endpoint(perm='can_access')
115 124
    def subtypes(self, request, type=None):
116 125
        if type:
passerelle/contrib/iparapheur/soap.py
22 22

  
23 23
from suds.client import Client
24 24
from suds.transport.http import HttpAuthenticated
25
from suds.transport import Reply, TransportError
25
from suds.transport import Request, Reply, TransportError
26 26
from suds.plugin import MessagePlugin, DocumentPlugin
27 27

  
28 28
from requests.exceptions import RequestException
......
91 91
    transport = Transport(instance)
92 92
    return Client(instance.wsdl_url, transport=transport,
93 93
                  plugins=[Handlewsdl(), Filter()], cache=None)
94

  
95
def get_wsdl_string(instance):
96
    '''download wsdl like suds's DocumentReader does it (but do not parse it)'''
97
    transport = Transport(instance)
98
    return transport.open(Request(instance.wsdl_url))
passerelle/contrib/iparapheur/templates/iparapheur/iparapheur_detail.html
6 6

  
7 7
{% block endpoints %}
8 8
<ul>
9
  {% url 'generic-endpoint' connector='iparapheur' slug=object.slug endpoint='wsdl' as wsdl_url %}
10
  <li>{% trans 'Download WSDL file:' %}
11
    <a href="{{ wsdl_url }}">{{ site_base_uri }}{{ wsdl_url }}</a>[?debug]
12
  </li>
9 13
  {% url 'generic-endpoint' connector='iparapheur' slug=object.slug endpoint='ping' as ping_url %}
10 14
  <li>{% trans 'Check WS availability:' %}
11 15
    <a href="{{ ping_url }}">{{ site_base_uri }}{{ ping_url }}</a>[?debug]
tests/test_iparapheur.py
422 422
        f.write('some text')
423 423
    with text_path.open() as f:
424 424
        assert 'text/plain' == get_magic_mime(f.read())
425

  
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)
430
    url = reverse('generic-endpoint',
431
                  kwargs={'slug': conn.slug,
432
                          'connector': 'iparapheur', 'endpoint': 'wsdl'})
433
    resp = app.get(url)
434
    assert resp.headers['content-type'] == 'text/xml'
435
    assert resp.content == file(wsdl_file).read()
436

  
437
@mock.patch('passerelle.utils.Request.get', side_effect=ConnectionError('mocked error'))
438
def test_call_wsdl_connectionerror(mocked_get, app, conn):
439
    url = reverse('generic-endpoint', kwargs={'connector': 'iparapheur',
440
                                              'endpoint': 'wsdl', 'slug': conn.slug})
441
    resp = app.get(url)
442
    assert resp.json['err'] == 1
443
    assert resp.json['data'] is None
444
    assert 'mocked error' in resp.json['err_desc']
425
-