Projet

Général

Profil

0002-opendatasoft-do-not-send-empty-q-parameter-54442.patch

Nicolas Roche, 28 juillet 2021 16:04

Télécharger (6,46 ko)

Voir les différences:

Subject: [PATCH 2/3] opendatasoft: do not send empty q parameter (#54442)

 passerelle/apps/opendatasoft/models.py | 11 ++--
 tests/test_opendatasoft.py             | 75 ++++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 7 deletions(-)
passerelle/apps/opendatasoft/models.py
66 66

  
67 67
    def call_search(
68 68
        self, dataset=None, text_template='', filter_expression='', sort='', id=None, q=None, limit=None
69 69
    ):
70 70
        scheme, netloc, path, params, query, fragment = urlparse.urlparse(self.service_url)
71 71
        path = urlparse.urljoin(path, 'api/records/1.0/search/')
72 72
        url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
73 73

  
74
        params = {'dataset': dataset}
74 75
        if id is not None:
75
            query = 'recordid:%s' % id
76
        else:
77
            query = q
78
        params = {
79
            'dataset': dataset,
80
            'q': query,
81
        }
76
            params.update({'q': 'recordid:%s' % id})
77
        elif q is not None:
78
            params.update({'q': q})
82 79
        if self.api_key:
83 80
            params.update({'apikey': self.api_key})
84 81
        if limit:
85 82
            params.update({'rows': limit})
86 83
        if sort:
87 84
            params.update({'sort': sort})
88 85
        params.update(urlparse.parse_qs(filter_expression))
89 86

  
tests/test_opendatasoft.py
184 184
    # error returned by opendadasoft server
185 185
    json_response = json.dumps({'error': "The query is invalid : Field 00 doesn't exist"})
186 186
    mocked_get.return_value = utils.FakedResponse(content=json_response, status_code=200)
187 187
    resp = app.get(endpoint, status=200)
188 188
    assert resp.json['err']
189 189
    assert resp.json['err_desc'] == "The query is invalid : Field 00 doesn't exist"
190 190

  
191 191

  
192
@mock.patch('passerelle.utils.Request.get')
193
def test_search(mocked_get, app, connector):
194
    endpoint = utils.generic_endpoint_url('opendatasoft', 'search', slug=connector.slug)
195
    assert endpoint == '/opendatasoft/my_connector/search'
196
    params = {
197
        'dataset': 'referentiel-adresse-test',
198
        'text_template': '{{numero}} {{nom_rue}} {{nom_commun}}',
199
        'sort': '-nom_rue',
200
        'limit': 3,
201
    }
202
    mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_Q_SEARCH, status_code=200)
203
    resp = app.get(endpoint, params=params, status=200)
204
    assert mocked_get.call_args[1]['params'] == {
205
        'apikey': 'my_secret',
206
        'dataset': 'referentiel-adresse-test',
207
        'sort': '-nom_rue',
208
        'rows': '3',
209
    }
210
    assert not resp.json['err']
211
    assert len(resp.json['data']) == 3
212
    # check order is kept
213
    assert [x['id'] for x in resp.json['data']] == [
214
        'e00cf6161e52a4c8fe510b2b74d4952036cb3473',
215
        '7cafcd5c692773e8b863587b2d38d6be82e023d8',
216
        '0984a5e1745701f71c91af73ce764e1f7132e0ff',
217
    ]
218
    # check text results
219
    assert [x['text'] for x in resp.json['data']] == [
220
        "33 RUE DE L'AUBEPINE Strasbourg",
221
        "19 RUE DE L'AUBEPINE Lipsheim",
222
        "29 RUE DE L'AUBEPINE Strasbourg",
223
    ]
224
    # check additional attributes
225
    assert [x['numero'] for x in resp.json['data']] == ['33', '19', '29']
226

  
227

  
192 228
@mock.patch('passerelle.utils.Request.get')
193 229
def test_search_using_q(mocked_get, app, connector):
194 230
    endpoint = utils.generic_endpoint_url('opendatasoft', 'search', slug=connector.slug)
195 231
    assert endpoint == '/opendatasoft/my_connector/search'
196 232
    params = {
197 233
        'dataset': 'referentiel-adresse-test',
198 234
        'text_template': '{{numero}} {{nom_rue}} {{nom_commun}}',
199 235
        'sort': '-nom_rue',
......
233 269
    assert endpoint == '/opendatasoft/my_connector/search'
234 270
    params = {
235 271
        'dataset': 'referentiel-adresse-test',
236 272
        'text_template': '{{numero}} {{nom_rue}} {{nom_commun}}',
237 273
        'id': '7cafcd5c692773e8b863587b2d38d6be82e023d8',
238 274
    }
239 275
    mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_ID_SEARCH, status_code=200)
240 276
    resp = app.get(endpoint, params=params, status=200)
277
    assert mocked_get.call_args[1]['params'] == {
278
        'apikey': 'my_secret',
279
        'dataset': 'referentiel-adresse-test',
280
        'q': 'recordid:7cafcd5c692773e8b863587b2d38d6be82e023d8',
281
    }
241 282
    assert len(resp.json['data']) == 1
242 283
    assert resp.json['data'][0]['text'] == "19 RUE DE L'AUBEPINE Lipsheim"
243 284

  
244 285

  
286
@mock.patch('passerelle.utils.Request.get')
287
def test_query_q(mocked_get, app, query):
288
    endpoint = '/opendatasoft/my_connector/q/my_query/'
289
    params = {
290
        'limit': 3,
291
    }
292
    mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_Q_SEARCH, status_code=200)
293
    resp = app.get(endpoint, params=params, status=200)
294
    assert mocked_get.call_args[1]['params'] == {
295
        'apikey': 'my_secret',
296
        'dataset': 'referentiel-adresse-test',
297
        'refine.source': ['Ville et Eurométropole de Strasbourg'],
298
        'exclude.numero': ['42', '43'],
299
        'sort': '-nom_rue',
300
        'rows': '3',
301
    }
302
    assert not resp.json['err']
303
    assert len(resp.json['data']) == 3
304
    # check order is kept
305
    assert [x['id'] for x in resp.json['data']] == [
306
        'e00cf6161e52a4c8fe510b2b74d4952036cb3473',
307
        '7cafcd5c692773e8b863587b2d38d6be82e023d8',
308
        '0984a5e1745701f71c91af73ce764e1f7132e0ff',
309
    ]
310
    # check text results
311
    assert [x['text'] for x in resp.json['data']] == [
312
        "33 RUE DE L'AUBEPINE Strasbourg",
313
        "19 RUE DE L'AUBEPINE Lipsheim",
314
        "29 RUE DE L'AUBEPINE Strasbourg",
315
    ]
316
    # check additional attributes
317
    assert [x['numero'] for x in resp.json['data']] == ['33', '19', '29']
318

  
319

  
245 320
@mock.patch('passerelle.utils.Request.get')
246 321
def test_query_q_using_q(mocked_get, app, query):
247 322
    endpoint = '/opendatasoft/my_connector/q/my_query/'
248 323
    params = {
249 324
        'q': "rue de l'aubepine",
250 325
        'limit': 3,
251 326
    }
252 327
    mocked_get.return_value = utils.FakedResponse(content=FAKED_CONTENT_Q_SEARCH, status_code=200)
253
-