71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
from fastapi import HTTPException
|
|
import pytest
|
|
|
|
from app.api.v1 import layers
|
|
|
|
|
|
def test_layer_guard_requires_bbox():
|
|
try:
|
|
layers._parse_layer_bbox("")
|
|
except HTTPException as exc:
|
|
assert exc.status_code == 400
|
|
else:
|
|
raise AssertionError("Expected missing bbox to fail")
|
|
|
|
|
|
def test_layer_guard_filters_bbox_and_clamps_low_zoom_limit():
|
|
geojson = {
|
|
"type": "FeatureCollection",
|
|
"features": [
|
|
{
|
|
"type": "Feature",
|
|
"geometry": {"type": "Point", "coordinates": [121.0, 31.0]},
|
|
"properties": {"id": "inside"},
|
|
},
|
|
{
|
|
"type": "Feature",
|
|
"geometry": {"type": "Point", "coordinates": [10.0, 10.0]},
|
|
"properties": {"id": "outside"},
|
|
},
|
|
],
|
|
}
|
|
|
|
result = layers._guard_geojson_layer(
|
|
geojson,
|
|
bbox=(120.0, 30.0, 122.0, 32.0),
|
|
zoom=2,
|
|
limit=6000,
|
|
)
|
|
|
|
assert result["returned_count"] == 1
|
|
assert result["visible_count"] == 1
|
|
assert result["features"][0]["properties"]["id"] == "inside"
|
|
assert result["diagnostics"]["limit"] == layers.LOW_ZOOM_FEATURE_LIMIT
|
|
assert result["diagnostics"]["limit_clamped"] is True
|
|
assert result["diagnostics"]["degraded"] is True
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_vessel_layer_snapshot_passes_type_filter(monkeypatch):
|
|
captured = {}
|
|
|
|
async def fake_build_vessel_snapshot_response(db, **kwargs):
|
|
captured.update(kwargs)
|
|
return {"type": "FeatureCollection", "features": []}
|
|
|
|
monkeypatch.setattr(layers, "build_vessel_snapshot_response", fake_build_vessel_snapshot_response)
|
|
|
|
result = await layers.get_vessel_layer_snapshot(
|
|
bbox="10,59,11,60",
|
|
zoom=12,
|
|
limit=1000,
|
|
vessel_type="cargo",
|
|
since_minutes=30,
|
|
db=object(),
|
|
)
|
|
|
|
assert result["features"] == []
|
|
assert captured["bbox"] == (10.0, 59.0, 11.0, 60.0)
|
|
assert captured["type_filter"] == "cargo"
|
|
assert "vessel_type" not in captured
|