0001-base_adresse-add-reverse-endpoint-result-into-addres.patch
passerelle/apps/base_adresse/models.py | ||
---|---|---|
216 | 216 |
except RequestException as e: |
217 | 217 |
raise APIError('failed to get %s: %s' % (url, e)) |
218 | 218 |
result = None |
219 | 219 | |
220 | 220 |
for feature in result_response.json().get('features'): |
221 | 221 |
if not feature['geometry']['type'] == 'Point': |
222 | 222 |
continue # skip unknown |
223 | 223 |
result = self.format_address_data(feature) |
224 |
address, created = AddressCacheModel.objects.get_or_create( |
|
225 |
api_id=result['id'], defaults={'data': result} |
|
226 |
) |
|
227 |
if not created: |
|
228 |
address.update_timestamp() |
|
224 | 229 |
break |
225 | 230 |
return result |
226 | 231 | |
227 | 232 |
@endpoint( |
228 | 233 |
description=_('Streets from zipcode'), |
229 | 234 |
parameters={ |
230 | 235 |
'id': {'description': _('Street identifier')}, |
231 | 236 |
'q': {'description': _("Street name")}, |
tests/conftest.py | ||
---|---|---|
57 | 57 |
} |
58 | 58 |
], |
59 | 59 |
}, |
60 | 60 |
request=request, |
61 | 61 |
) |
62 | 62 | |
63 | 63 | |
64 | 64 |
@urlmatch(netloc='^api-adresse.data.gouv.fr$', path='^/reverse/$') |
65 |
@remember_called |
|
65 | 66 |
def api_adresse_data_gouv_fr_reverse(url, request): |
66 | 67 |
return response( |
67 | 68 |
200, |
68 | 69 |
{ |
69 | 70 |
"limit": 1, |
70 | 71 |
"attribution": "BAN", |
71 | 72 |
"version": "draft", |
72 | 73 |
"licence": "ODbL 1.0", |
... | ... | |
98 | 99 |
def mock_api_adresse_data_gouv_fr_search(): |
99 | 100 |
with HTTMock(api_adresse_data_gouv_fr_search): |
100 | 101 |
yield api_adresse_data_gouv_fr_search |
101 | 102 | |
102 | 103 | |
103 | 104 |
@pytest.fixture |
104 | 105 |
def mock_api_adresse_data_gouv_fr_reverse(): |
105 | 106 |
with HTTMock(api_adresse_data_gouv_fr_reverse): |
106 |
yield None
|
|
107 |
yield api_adresse_data_gouv_fr_reverse
|
|
107 | 108 | |
108 | 109 | |
109 | 110 |
@pytest.fixture |
110 | 111 |
def endpoint_dummy_cache(monkeypatch): |
111 | 112 |
from django.core.cache import caches |
112 | 113 | |
113 | 114 |
import passerelle.views |
114 | 115 |
tests/test_base_adresse.py | ||
---|---|---|
906 | 906 |
# first user saves the form, data should not have changed |
907 | 907 |
resp = app.get(endpoint, params={'id': address_id}, status=200) |
908 | 908 |
assert resp.json['data'][0]['text'] == address_text |
909 | 909 | |
910 | 910 |
# when cache is cleared, we get the updated data |
911 | 911 |
AddressCacheModel.objects.all().delete() |
912 | 912 |
resp = app.get(endpoint, params={'q': 'plop'}, status=200) |
913 | 913 |
assert resp.json['data'][0]['text'] == 'changed' |
914 | ||
915 | ||
916 |
def test_base_adresse_reverse_cache( |
|
917 |
app, base_adresse, freezer, mock_api_adresse_data_gouv_fr_reverse, mock_api_adresse_data_gouv_fr_search |
|
918 |
): |
|
919 |
assert AddressCacheModel.objects.count() == 0 |
|
920 |
resp = app.get('/base-adresse/%s/reverse?lon=-0.593775&lat=47.474633' % base_adresse.slug) |
|
921 |
assert mock_api_adresse_data_gouv_fr_reverse.call['count'] == 1 |
|
922 | ||
923 |
data = resp.json |
|
924 |
assert data['text'] == 'Rue Roger Halope 49000 Angers' |
|
925 | ||
926 |
api_id = data['id'] |
|
927 |
assert AddressCacheModel.objects.filter(api_id=api_id).exists() |
|
928 |
assert AddressCacheModel.objects.count() == 1 |
|
929 |
first_timestamp = AddressCacheModel.objects.get().timestamp |
|
930 | ||
931 |
resp = app.get('/base-adresse/%s/addresses?id=%s' % (base_adresse.slug, api_id)) |
|
932 |
assert mock_api_adresse_data_gouv_fr_search.call['count'] == 0 |
|
933 |
assert data['text'] == 'Rue Roger Halope 49000 Angers' |
|
934 |
assert 'address' in data |
|
935 | ||
936 |
# check caching timestamp update |
|
937 |
freezer.move_to(datetime.timedelta(hours=1, seconds=1)) |
|
938 |
resp = app.get('/base-adresse/%s/reverse?lon=-0.593775&lat=47.474633' % base_adresse.slug) |
|
939 |
assert mock_api_adresse_data_gouv_fr_reverse.call['count'] == 2 |
|
940 |
assert AddressCacheModel.objects.get().timestamp > first_timestamp |
|
914 |
- |