Projet

Général

Profil

0001-base_adresse-add-reverse-endpoint-result-into-addres.patch

Nicolas Roche, 14 mai 2021 12:49

Télécharger (4,53 ko)

Voir les différences:

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

 passerelle/apps/base_adresse/models.py |  5 +++++
 tests/conftest.py                      |  3 ++-
 tests/test_base_adresse.py             | 27 ++++++++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)
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
-