map: check geojson result (#73756) #35
|
@ -255,6 +255,26 @@ class MapLayer(models.Model):
|
||||||
else:
|
else:
|
||||||
features = data
|
features = data
|
||||||
|
|
||||||
|
if not isinstance(features, list):
|
||||||
|
return {
|
||||||
|
'type': 'FeatureCollection',
|
||||||
|
'features': [],
|
||||||
|
'_combo_err_desc': "Wrong GeoJSON response",
|
||||||
|
}
|
||||||
|
if features:
|
||||||
|
if not isinstance(features[0], dict):
|
||||||
|
return {
|
||||||
|
'type': 'FeatureCollection',
|
||||||
|
'features': [],
|
||||||
|
'_combo_err_desc': "Wrong GeoJSON response",
|
||||||
|
}
|
||||||
|
if not ({'geometry', 'properties'} <= set(features[0].keys())):
|
||||||
|
return {
|
||||||
|
'type': 'FeatureCollection',
|
||||||
|
'features': [],
|
||||||
|
'_combo_err_desc': "Wrong GeoJSON response",
|
||||||
|
}
|
||||||
|
|
||||||
if properties:
|
if properties:
|
||||||
properties = [x.strip() for x in properties.split(',') if x.strip()]
|
properties = [x.strip() for x in properties.split(',') if x.strip()]
|
||||||
for feature in features:
|
for feature in features:
|
||||||
|
|
|
@ -325,6 +325,57 @@ def test_get_geojson(app, layer, user):
|
||||||
== 'Bad response from requested URL (500 Server Error: None for url: None)'
|
== 'Bad response from requested URL (500 Server Error: None for url: None)'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
wrong_data = {
|
||||||
|
'data': [
|
||||||
|
{'id': 1, 'text': 'foo 1'},
|
||||||
|
{'id': 2, 'text': 'foo 2'},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
assert resp.json['_combo_err_desc'] == 'Wrong GeoJSON response'
|
||||||
|
|
||||||
|
wrong_data = ['foo', 'bar']
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
assert resp.json['_combo_err_desc'] == 'Wrong GeoJSON response'
|
||||||
|
|
||||||
|
wrong_data = [
|
||||||
|
{'id': 1, 'text': 'foo 1'},
|
||||||
|
]
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
assert resp.json['_combo_err_desc'] == 'Wrong GeoJSON response'
|
||||||
|
|
||||||
|
wrong_data = [
|
||||||
|
{'id': 1, 'text': 'foo 1', 'geometry': None},
|
||||||
|
]
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
assert resp.json['_combo_err_desc'] == 'Wrong GeoJSON response'
|
||||||
|
|
||||||
|
wrong_data = [
|
||||||
|
{'id': 1, 'text': 'foo 1', 'properties': None},
|
||||||
|
]
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
assert resp.json['_combo_err_desc'] == 'Wrong GeoJSON response'
|
||||||
|
|
||||||
# check cache duration
|
# check cache duration
|
||||||
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
|
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
|
||||||
requests_get.return_value = mock.Mock(
|
requests_get.return_value = mock.Mock(
|
||||||
|
@ -588,6 +639,7 @@ def test_get_geojson_properties(app, layer, user):
|
||||||
cell = Map(page=page, placeholder='content', order=0, public=True)
|
cell = Map(page=page, placeholder='content', order=0, public=True)
|
||||||
cell.title = 'Map'
|
cell.title = 'Map'
|
||||||
cell.save()
|
cell.save()
|
||||||
|
layer.cache_duration = 0
|
||||||
layer.save()
|
layer.save()
|
||||||
options = MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
|
options = MapLayerOptions.objects.create(map_cell=cell, map_layer=layer)
|
||||||
|
|
||||||
|
@ -615,6 +667,18 @@ def test_get_geojson_properties(app, layer, user):
|
||||||
assert 'name' in features[0]['properties']
|
assert 'name' in features[0]['properties']
|
||||||
assert 'extra' not in features[0]['properties']
|
assert 'extra' not in features[0]['properties']
|
||||||
|
|
||||||
|
wrong_data = {
|
||||||
|
'data': [
|
||||||
|
{'id': 1, 'text': 'foo 1'},
|
||||||
|
{'id': 2, 'text': 'foo 2'},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
requests_get.return_value = mock.Mock(
|
||||||
|
content=json.dumps(wrong_data), json=lambda: wrong_data, status_code=200
|
||||||
|
)
|
||||||
|
resp = app.get(reverse('mapcell-geojson', kwargs={'cell_id': cell.id, 'layer_slug': layer.slug}))
|
||||||
|
assert len(resp.json['features']) == 0
|
||||||
|
|
||||||
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
|
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get:
|
||||||
layer.geojson_url = 'http://example.org/geojson?t2'
|
layer.geojson_url = 'http://example.org/geojson?t2'
|
||||||
layer.properties = 'name, hop'
|
layer.properties = 'name, hop'
|
||||||
|
|
Loading…
Reference in New Issue