Eishaan's picture
Add KML terrain and soil analysis layers
2f91d7e
Raw
History Blame Contribute Delete
1.94 kB
import unittest
from unittest.mock import patch
from src.geometry import selection_from_lat_lon
from src.safety import find_forbidden_phrases
from src.soil import fetch_soil
def _soil_payload(clay=420, sand=300, silt=280, phh2o=72):
return {
"properties": {
"layers": [
{"name": "clay", "depths": [{"values": {"mean": clay}}]},
{"name": "sand", "depths": [{"values": {"mean": sand}}]},
{"name": "silt", "depths": [{"values": {"mean": silt}}]},
{"name": "phh2o", "depths": [{"values": {"mean": phh2o}}]},
{"name": "bdod", "depths": [{"values": {"mean": 140}}]},
{"name": "soc", "depths": [{"values": {"mean": 18}}]},
]
}
}
class SoilTests(unittest.TestCase):
def test_fetch_soil_interprets_clay_heavy_signal_safely(self):
selection = selection_from_lat_lon(21.002, 70.245, radius_m=250)
with patch("src.soil.get_json", return_value=_soil_payload()):
soil, evidence = fetch_soil(selection)
self.assertEqual(soil["texture_signal"], "clay-heavy topsoil signal")
self.assertEqual(soil["clay_pct"], 42.0)
self.assertEqual(soil["ph_h2o"], 7.2)
joined = evidence[0].finding + evidence[0].design_implication + evidence[0].verification_needed
self.assertIn("professional", joined)
self.assertEqual(find_forbidden_phrases(joined), [])
def test_fetch_soil_failure_returns_missing_data_evidence(self):
selection = selection_from_lat_lon(21.002, 70.245, radius_m=250)
with patch("src.soil.get_json", side_effect=TimeoutError("slow")):
soil, evidence = fetch_soil(selection)
self.assertEqual(soil, {})
self.assertEqual(evidence[0].confidence, "low")
self.assertIn("Do not infer soil type", evidence[0].design_implication)
if __name__ == "__main__":
unittest.main()