This commit is contained in:
2026-05-13 16:45:54 +03:30
parent 948c062b93
commit 46fe62fa04
96 changed files with 3834 additions and 155 deletions
+44
View File
@@ -385,3 +385,47 @@ class RecommendationServiceDefaultsTests(TestCase):
self.assertEqual(result["data"]["primary_recommendation"]["npk_ratio"]["label"], "20-20-20")
self.assertEqual(result["data"]["primary_recommendation"]["dosage"]["base_amount_per_hectare"], 65.0)
class RecommendationCanonicalSnapshotTests(TestCase):
@patch("rag.services.irrigation.get_chat_client")
@patch("rag.services.irrigation.build_rag_context", return_value="")
@patch("rag.services.irrigation.build_ai_farm_snapshot")
def test_irrigation_ui_payload_uses_aggregated_snapshot_metrics(self, mock_snapshot, _mock_context, mock_client):
from rag.services.irrigation import _build_irrigation_ui_payload
mock_snapshot.return_value = {"farm_metrics": {"resolved_metrics": {"soil_moisture": 44.0}}}
payload = _build_irrigation_ui_payload(
llm_result={"plan": {}, "timeline": [], "sections": []},
optimizer_result=None,
daily_water_needs=[],
crop_profile={},
active_kc=0.9,
irrigation_method=None,
ai_snapshot=mock_snapshot.return_value,
)
self.assertEqual(payload["plan"]["moistureLevel"], 44)
@patch("rag.services.fertilization._get_optimizer")
@patch("rag.services.fertilization.get_chat_client")
@patch("rag.services.fertilization.build_rag_context", return_value="")
@patch("rag.services.fertilization.build_ai_farm_snapshot")
def test_fertilization_recommendation_includes_snapshot_provenance(self, mock_snapshot, _mock_context, mock_client, mock_optimizer):
from rag.services.fertilization import get_fertilization_recommendation
client = mock_client.return_value
client.chat.completions.create.return_value = type("Resp", (), {"choices": [type("Choice", (), {"message": type("Msg", (), {"content": '{"status": "success", "data": {}}'})()})()]})()
mock_snapshot.return_value = {
"source_metadata": {
"farm_metrics": {"canonical_source": "farmer_block_aggregated_snapshot"},
}
}
mock_optimizer.return_value.optimize_fertilization.return_value = None
with patch("rag.services.fertilization.SensorData.objects.select_related") as mock_select:
mock_select.return_value.prefetch_related.return_value.filter.return_value.first.return_value = None
result = get_fertilization_recommendation(farm_uuid="farm-1")
self.assertEqual(result["source_metadata"]["farm_metrics"]["canonical_source"], "farmer_block_aggregated_snapshot")
self.assertEqual(result["source_metadata"]["weather"]["policy"], "center_location_latest_forecast")