Projet

Général

Profil

0001-photon-add-reverse-endpoint-result-into-address-cach.patch

Nicolas Roche, 14 mai 2021 12:50

Télécharger (3,92 ko)

Voir les différences:

Subject: [PATCH]  photon: add reverse endpoint result into address cache model
 (#53988)

 passerelle/apps/photon/models.py |  5 +++++
 tests/test_photon.py             | 28 +++++++++++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)
passerelle/apps/photon/models.py
212 212
        except RequestException as e:
213 213
            raise APIError('Bad response code from API: %s' % e)
214 214
        result = None
215 215

  
216 216
        for feature in result_response.json().get('features'):
217 217
            if not feature['geometry']['type'] == 'Point':
218 218
                continue  # skip unknown
219 219
            result = self.format_address_data(feature)
220
            address, created = AddressCacheModel.objects.get_or_create(
221
                api_id=result['id'], defaults={'data': result}
222
            )
223
            if not created:
224
                address.update_timestamp()
220 225
            break
221 226
        return result
222 227

  
223 228
    def check_status(self):
224 229
        self.search(None, 'passerelle status check')
225 230

  
226 231
    def clean_addresses_cache(self):
227 232
        old_addresses = AddressCacheModel.objects.filter(
tests/test_photon.py
69 69

  
70 70
@urlmatch(netloc='^photon.komoot.io$', path='^/api/$')
71 71
@remember_called
72 72
def photon_search(url, request):
73 73
    return response(200, CONTENT, request=request)
74 74

  
75 75

  
76 76
@urlmatch(netloc='^photon.komoot.io$', path='^/reverse/$')
77
@remember_called
77 78
def photon_reverse(url, request):
78 79
    return response(200, CONTENT, request=request)
79 80

  
80 81

  
81 82
@pytest.fixture
82 83
def mock_photon_search():
83 84
    with HTTMock(photon_search):
84 85
        yield photon_search
85 86

  
86 87

  
87 88
@pytest.fixture
88 89
def mock_photon_reverse():
89 90
    with HTTMock(photon_reverse):
90
        yield None
91
        yield photon_reverse
91 92

  
92 93

  
93 94
@pytest.fixture
94 95
def photon(db):
95 96
    return utils.setup_access_rights(Photon.objects.create(slug='test'))
96 97

  
97 98

  
98 99
@pytest.fixture
......
300 301
    # first user saves the form, data should not have changed
301 302
    resp = app.get(endpoint, params={'id': address_id}, status=200)
302 303
    assert resp.json['data'][0]['text'] == address_text
303 304

  
304 305
    # when cache is cleared, we get the updated data
305 306
    AddressCacheModel.objects.all().delete()
306 307
    resp = app.get(endpoint, params={'q': 'plop'}, status=200)
307 308
    assert 'changed' in resp.json['data'][0]['text']
309

  
310

  
311
def test_photon_reverse_cache(app, photon, freezer, mock_photon_reverse, mock_photon_search):
312
    assert AddressCacheModel.objects.count() == 0
313
    resp = app.get('/photon/%s/reverse?lon=4.8522272&lat=45.7587414' % photon.slug)
314
    assert mock_photon_reverse.call['count'] == 1
315

  
316
    data = resp.json
317
    assert data['text'] == '208, Rue Garibaldi 69003 Lyon 3ème Arrondissement'
318

  
319
    api_id = data['id']
320
    assert AddressCacheModel.objects.filter(api_id=api_id).exists()
321
    assert AddressCacheModel.objects.count() == 1
322
    first_timestamp = AddressCacheModel.objects.get().timestamp
323

  
324
    resp = app.get('/photon/%s/addresses?id=%s' % (photon.slug, api_id))
325
    assert mock_photon_search.call['count'] == 0
326
    assert data['text'] == '208, Rue Garibaldi 69003 Lyon 3ème Arrondissement'
327
    assert 'address' in data
328

  
329
    # check caching timestamp update
330
    freezer.move_to(datetime.timedelta(hours=1, seconds=1))
331
    resp = app.get('/photon/%s/reverse?lon=4.8522272&lat=45.7587414' % photon.slug)
332
    assert mock_photon_reverse.call['count'] == 2
333
    assert AddressCacheModel.objects.get().timestamp > first_timestamp
308
-