Spaces:
Running
Running
| """Tests for gazet.geometry — coordinate rounding and geometry normalization.""" | |
| import json | |
| from gazet.geometry import _round_coords, normalize_geometry_to_geojson | |
| class TestRoundCoords: | |
| def test_single_float(self): | |
| assert _round_coords(1.23456789, 1) == 1.2 | |
| def test_zero_precision(self): | |
| assert _round_coords(1.9, 0) == 2.0 | |
| def test_nested_list(self): | |
| coords = [1.11111, 2.22222, 3.33333] | |
| result = _round_coords(coords, 2) | |
| assert result == [1.11, 2.22, 3.33] | |
| def test_dict_recursion(self): | |
| obj = {"lat": 1.99999, "lng": 2.11111} | |
| result = _round_coords(obj, 1) | |
| assert result == {"lat": 2.0, "lng": 2.1} | |
| def test_nested_structure(self): | |
| geojson = { | |
| "type": "Point", | |
| "coordinates": [12.123456, 34.987654], | |
| } | |
| result = _round_coords(geojson, 3) | |
| assert result == {"type": "Point", "coordinates": [12.123, 34.988]} | |
| def test_multipolygon(self): | |
| coords = [[[1.1, 2.2], [3.3, 4.4], [5.5, 6.6]]] | |
| result = _round_coords(coords, 1) | |
| assert result == [[[1.1, 2.2], [3.3, 4.4], [5.5, 6.6]]] | |
| def test_string_passthrough(self): | |
| assert _round_coords("hello", 2) == "hello" | |
| def test_int_passthrough(self): | |
| assert _round_coords(42, 2) == 42 | |
| def test_none_passthrough(self): | |
| assert _round_coords(None, 2) is None | |
| def test_mixed_types_in_list(self): | |
| data = [1.111, "type", 2.222] | |
| result = _round_coords(data, 1) | |
| assert result == [1.1, "type", 2.2] | |
| class TestNormalizeGeometryToGeojson: | |
| def test_no_geometry_column(self, con): | |
| import pandas as pd | |
| df = pd.DataFrame({"id": [1], "name": ["test"]}) | |
| result = normalize_geometry_to_geojson(con, df) | |
| assert "geometry" not in result.columns | |
| def test_empty_dataframe(self, con): | |
| import pandas as pd | |
| df = pd.DataFrame(columns=["geometry"]) | |
| result = normalize_geometry_to_geojson(con, df) | |
| assert result.empty | |
| def test_geojson_string_simplified(self, con): | |
| import pandas as pd | |
| # A simple point — simplify should pass it through | |
| point_geojson = json.dumps( | |
| { | |
| "type": "Point", | |
| "coordinates": [12.1234567, 34.9876543], | |
| } | |
| ) | |
| df = pd.DataFrame({"geometry": [point_geojson]}) | |
| result = normalize_geometry_to_geojson(con, df) | |
| assert result["geometry"].iloc[0] is not None | |
| parsed = json.loads(result["geometry"].iloc[0]) | |
| assert parsed["type"] == "Point" | |
| # Coordinates should be rounded | |
| coords = parsed["coordinates"] | |
| assert coords[0] == round(12.1234567, 5) | |
| assert coords[1] == round(34.9876543, 5) | |
| def test_null_geometry_preserved(self, con): | |
| import pandas as pd | |
| df = pd.DataFrame({"geometry": [None, None]}) | |
| result = normalize_geometry_to_geojson(con, df) | |
| assert pd.isna(result["geometry"]).all() or result["geometry"].isna().all() | |
| def test_mixed_geojson_and_null(self, con): | |
| import pandas as pd | |
| point = json.dumps({"type": "Point", "coordinates": [0.0, 0.0]}) | |
| df = pd.DataFrame({"geometry": [point, None]}) | |
| result = normalize_geometry_to_geojson(con, df) | |
| assert result["geometry"].iloc[0] is not None | |
| assert result["geometry"].iloc[1] is None | |