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