UPDATE
This commit is contained in:
@@ -8,6 +8,7 @@ from django.test import TestCase, override_settings
|
||||
from django.utils import timezone
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from rag.failure_contract import RAGServiceError
|
||||
from soile.services import SoilMoistureHeatmapService
|
||||
|
||||
|
||||
@@ -128,6 +129,32 @@ class SoilAnomalyDetectionApiTests(TestCase):
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertEqual(response.json()["msg"], "Farm not found.")
|
||||
|
||||
@patch("soile.views.apps.get_app_config")
|
||||
def test_anomaly_api_returns_structured_failure_for_invalid_llm_json(self, mock_get_app_config):
|
||||
mock_service = SimpleNamespace(
|
||||
get_anomaly_detection=lambda **_kwargs: (_ for _ in ()).throw(
|
||||
RAGServiceError(
|
||||
error_code="invalid_json",
|
||||
message="Soil anomaly LLM response was not valid JSON.",
|
||||
source="llm",
|
||||
retriable=True,
|
||||
http_status=502,
|
||||
)
|
||||
)
|
||||
)
|
||||
mock_get_app_config.return_value = SimpleNamespace(
|
||||
get_soil_anomaly_service=lambda: mock_service
|
||||
)
|
||||
|
||||
response = self.client.post(
|
||||
"/anomaly-detection/",
|
||||
data={"farm_uuid": "550e8400-e29b-41d4-a716-446655440000"},
|
||||
format="json",
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 502)
|
||||
self.assertEqual(response.json()["data"]["error_code"], "invalid_json")
|
||||
|
||||
|
||||
class SoilMoistureHeatmapServiceTests(TestCase):
|
||||
@patch("soile.services.SensorData.objects")
|
||||
|
||||
@@ -6,6 +6,7 @@ from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from config.openapi import build_envelope_serializer, build_response
|
||||
from rag.failure_contract import RAGServiceError
|
||||
|
||||
from .serializers import (
|
||||
SoilAnomalyDetectionRequestSerializer,
|
||||
@@ -179,6 +180,11 @@ class SoilAnomalyDetectionView(APIView):
|
||||
{"code": 404, "msg": str(exc), "data": None},
|
||||
status=status.HTTP_404_NOT_FOUND,
|
||||
)
|
||||
except RAGServiceError as exc:
|
||||
return Response(
|
||||
{"code": exc.http_status, "msg": exc.contract.message, "data": exc.to_dict()},
|
||||
status=exc.http_status,
|
||||
)
|
||||
except Exception as exc:
|
||||
return Response(
|
||||
{"code": 500, "msg": f"خطا در تحلیل ناهنجاری خاک: {exc}", "data": None},
|
||||
|
||||
Reference in New Issue
Block a user