Projet

Général

Profil

0002-opendatasoft-manage-empty-contents-returned-43223.patch

Nicolas Roche, 22 mai 2020 16:52

Télécharger (5,06 ko)

Voir les différences:

Subject: [PATCH 2/2] opendatasoft: manage empty contents returned (#43223)

 passerelle/apps/opendatasoft/models.py | 32 +++++++++++++++++---------
 tests/test_opendatasoft.py             | 30 ++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 11 deletions(-)
passerelle/apps/opendatasoft/models.py
74 74
            params.update({'rows': limit})
75 75

  
76 76
        result_response = self.requests.get(url, params=params)
77 77
        err_desc = result_response.json().get('error')
78 78
        if err_desc:
79 79
            return {'err': 1, 'err_desc': err_desc}
80 80

  
81 81
        result = []
82
        for record in result_response.json().get('records'):
83
            data = {}
84
            data['id'] = record.get('recordid')
85

  
86
            context = {}
87
            for key, value in record.get('fields').items():
88
                context[key] = force_text(value)
89
            template = Template(text_template)
90
            data['text'] = template.render(Context(context)).strip()
91

  
92
            result.append(data)
82
        err_desc = ''
83
        if result_response.json().get('records') is None:
84
            err_desc = "field records doesn't exist"
85
        else:
86
            for idx, record in enumerate(result_response.json().get('records')):
87
                data = {}
88
                data['id'] = record.get('recordid')
89
                if not data['id']:
90
                    err_desc = 'no recordid on record %s' % (idx + 1)
91
                    break
92
                if not isinstance(record.get('fields'), dict):
93
                    err_desc = 'no fields dictionary on record %s' % (idx + 1)
94
                    break
95
                context = {}
96
                for key, value in record.get('fields').items():
97
                    context[key] = force_text(value)
98
                template = Template(text_template)
99
                data['text'] = template.render(Context(context)).strip()
100
                result.append(data)
101
        if err_desc:
102
            return {'err': 1, 'err_desc': "The JSON reply is invalid: " + err_desc}
93 103
        return {'data': result}
94 104

  
95 105
    @endpoint(name='q',
96 106
              description=_('Query'),
97 107
              pattern=r'^(?P<query_slug>[\w:_-]+)/$',
98 108
              perm='can_access',
99 109
              show=False)
100 110
    def q(self, request, query_slug, **kwargs):
tests/test_opendatasoft.py
192 192

  
193 193
    # error returned by opendadasoft server
194 194
    json_response = json.dumps({'error': "The query is invalid : Field 00 doesn't exist"})
195 195
    mocked_get.return_value = utils.FakedResponse(content=json_response, status_code=200)
196 196
    resp = app.get(endpoint, status=200)
197 197
    assert resp.json['err']
198 198
    assert resp.json['err_desc'] == "The query is invalid : Field 00 doesn't exist"
199 199

  
200
    # empty reply
201
    mocked_get.return_value = utils.FakedResponse(content='{"records": []}', status_code=200)
202
    resp = app.get(endpoint, status=200)
203
    assert not resp.json['err']
204
    assert resp.json['data'] == []
205

  
206
    # empty fields
207
    json_response = json.dumps({'records': [{'recordid': '42', 'fields': {}}]})
208
    mocked_get.return_value = utils.FakedResponse(content=json_response, status_code=200)
209
    resp = app.get(endpoint, status=200)
210
    assert not resp.json['err']
211
    assert resp.json['data'] == [{'id': '42', 'text': ''}]
212

  
213
    mocked_get.return_value = utils.FakedResponse(content='{}', status_code=200)
214
    resp = app.get(endpoint, status=200)
215
    assert resp.json['err']
216
    assert resp.json['err_desc'] == "The JSON reply is invalid: field records doesn't exist"
217

  
218
    json_response = json.dumps({'records': [{'fields': {}}]})
219
    mocked_get.return_value = utils.FakedResponse(content=json_response, status_code=200)
220
    resp = app.get(endpoint, status=200)
221
    assert resp.json['err']
222
    assert resp.json['err_desc'] == 'The JSON reply is invalid: no recordid on record 1'
223

  
224
    json_response = json.dumps({'records': [{'recordid': '42'}]})
225
    mocked_get.return_value = utils.FakedResponse(content=json_response, status_code=200)
226
    resp = app.get(endpoint, status=200)
227
    assert resp.json['err']
228
    assert resp.json['err_desc'] == 'The JSON reply is invalid: no fields dictionary on record 1'
229

  
200 230

  
201 231
@mock.patch('passerelle.utils.Request.get')
202 232
def test_search_using_q(mocked_get, app, connector):
203 233
    endpoint = utils.generic_endpoint_url('opendatasoft', 'search', slug=connector.slug)
204 234
    assert endpoint == '/opendatasoft/my_connector/search'
205 235
    params = {
206 236
        'dataset': 'referentiel-adresse-test',
207 237
        'text_template': '{{numero}} {{nom_rue|safe}} {{nom_commun}}',
208
-