import unittest from unittest.mock import patch, MagicMock from geodata_pipeline.river_erosion import _find_lake_depths from geodata_pipeline.config import Config, LakeConfig class TestRiverLakes(unittest.TestCase): @patch("geodata_pipeline.river_erosion.ogr") def test_find_lake_depths(self, mock_ogr): # Mock OGR DataSource and Layer mock_ds = MagicMock() mock_layer = MagicMock() mock_ogr.Open.return_value = mock_ds mock_ds.GetLayer.return_value = mock_layer # Mock Feature mock_feat = MagicMock() mock_feat.GetField.return_value = 15.5 # Depth_avg mock_feat.GetFID.return_value = 123 # Mock Geometry mock_geom = MagicMock() mock_feat.GetGeometryRef.return_value = mock_geom # When Distance is called on the feature geometry (transformed), return float mock_transformed_geom = MagicMock() mock_geom.Clone.return_value = mock_transformed_geom mock_transformed_geom.Distance.return_value = 10.0 # Setup layer behavior mock_layer.__iter__.return_value = [mock_feat] mock_layer.GetNextFeature.side_effect = [mock_feat, None] # Config cfg = Config.default() cfg.river_erosion.lakes.enabled = True cfg.river_erosion.lakes.match_tolerance_m = 100.0 # Manual lake centroid (shapely point or similar, but here we pass tuple/object depending on implementation) # Let's assume we pass a list of (x, y) tuples for centroids manual_lakes = [(333000.0, 5517000.0)] # Since _find_lake_depths expects OGR geometries for the manual lakes (or constructs them), # let's assume we pass OGR geometries to it, or it creates them. # Ideally, it should accept a list of OGR Geometries (Polygons from the mask). # For this test, I'll assume we pass a list of ogr.Geometry objects. mock_manual_geom = MagicMock() mock_manual_geom.Centroid.return_value = mock_manual_geom mock_manual_geom.Clone.return_value = mock_manual_geom # For transform mock_manual_geom.GetPoint.return_value = (333000.0, 5517000.0) mock_srs = MagicMock() mock_srs.IsSame.return_value = True # Simplify: same CRS results = _find_lake_depths( [mock_manual_geom], mock_srs, cfg.river_erosion.lakes, "raw/hydrolakes/HydroLAKES_polys_v10_shp/HydroLAKES_polys_v10.shp" ) # Expected result: List of (depth, metadata) # depth should be 15.5 self.assertEqual(len(results), 1) depth, metadata = results[0] self.assertEqual(depth, 15.5) self.assertEqual(metadata["id"], 123) self.assertEqual(metadata["distance"], 10.0) if __name__ == "__main__": unittest.main()