base_adresse: handle bad ban_id format (#56710)

This commit is contained in:
Thomas NOËL 2021-09-07 10:53:19 +02:00
parent b431c1d8a1
commit 84e0250564
2 changed files with 54 additions and 4 deletions

View File

@ -67,8 +67,9 @@ class BaseAdresse(AddressResource):
verbose_name = _('Base Adresse Web Service')
def sectorize(self, address):
ban_id = address.get('ban_id') or ''
address['address']['street_id'] = '_'.join(ban_id.split('_', 2)[0:2])
ban_id = address.get('ban_id')
if isinstance(ban_id, str) and '_' in ban_id:
address['address']['street_id'] = '_'.join(ban_id.split('_', 2)[0:2])
super().sectorize(address)
def format_address_data(self, data):

View File

@ -154,6 +154,50 @@ BAN = {
},
"type": "Feature",
},
# id is not a string => no street_id
{
"geometry": {"coordinates": [2.323365, 48.833702], "type": "Point"},
"properties": {
"city": "Paris",
"citycode": "75114",
"context": "75, Paris, Île-de-France",
"district": "Paris 14e Arrondissement",
"housenumber": "169",
"id": 42, # integer id => no street_id
"importance": 0.77751,
"label": "169 Rue du Château 75014 Paris",
"name": "169 Rue du Château",
"postcode": "75014",
"score": 0.9797736363636363,
"street": "Rue du Château",
"type": "housenumber",
"x": 650331.55,
"y": 6859506.98,
},
"type": "Feature",
},
# id without "_" => no street_id
{
"geometry": {"coordinates": [2.323365, 48.833702], "type": "Point"},
"properties": {
"city": "Paris",
"citycode": "75114",
"context": "75, Paris, Île-de-France",
"district": "Paris 14e Arrondissement",
"housenumber": "169",
"id": "123", # no "_" => no street_id
"importance": 0.77751,
"label": "169 Rue du Château 75014 Paris",
"name": "169 Rue du Château",
"postcode": "75014",
"score": 0.9797736363636363,
"street": "Rue du Château",
"type": "housenumber",
"x": 650331.55,
"y": 6859506.98,
},
"type": "Feature",
},
],
"licence": "ETALAB-2.0",
"limit": 5,
@ -193,16 +237,17 @@ def test_sectorization(mocked_get, app, base_adresse, sector):
mocked_get.return_value = utils.FakedResponse(content=json.dumps(BAN), status_code=200)
url = utils.generic_endpoint_url('base-adresse', 'search', slug=base_adresse.slug)
addresses = app.get(url, params={'q': 'foo'}, status=200).json
assert len(addresses) == 6
assert len(addresses) == 8
for address in addresses:
assert 'sectors' not in address
assert 'sectorization_error' not in address
base_adresse.sectors.add(sector)
# empty sector
sector.sector_set.all().delete()
addresses = app.get(url, params={'q': 'foo'}, status=200).json
assert len(addresses) == 6
assert len(addresses) == 8
for address in addresses:
assert address['sectors'] == {} # sector is empty
@ -217,6 +262,10 @@ def test_sectorization(mocked_get, app, base_adresse, sector):
# bad address format, no street_id
assert addresses[5]['sectors'] == {}
assert addresses[5]['sectorization_error'] == 'missing street_id in address'
assert addresses[6]['sectors'] == {}
assert addresses[6]['sectorization_error'] == 'missing street_id in address'
assert addresses[7]['sectors'] == {}
assert addresses[7]['sectorization_error'] == 'missing street_id in address'
url = utils.generic_endpoint_url('base-adresse', 'sectors', slug=base_adresse.slug)
for params in (None, {'id': 'ecole'}, {'q': 'scolaire'}):