This commit is contained in:
2026-04-25 17:22:41 +03:30
parent 569d520a5c
commit aa24fc22b0
124 changed files with 8491 additions and 2582 deletions
+127
View File
@@ -0,0 +1,127 @@
from __future__ import annotations
from types import SimpleNamespace
from unittest.mock import patch
from django.test import TestCase, override_settings
from rest_framework.test import APIClient
@override_settings(ROOT_URLCONF="weather.urls")
class FarmWeatherApiTests(TestCase):
def setUp(self):
self.client = APIClient()
@patch("weather.views.apps.get_app_config")
def test_farm_weather_api_returns_payload(self, mock_get_app_config):
mock_service = SimpleNamespace(
get_farm_weather_card=lambda **_kwargs: {
"condition": "صاف",
"temperature": 28.0,
"unit": "°C",
"humidity": 42.0,
"windSpeed": 15.0,
"windUnit": "km/h",
"chartData": {
"labels": ["2026-04-01", "2026-04-02"],
"series": [[28.0, 29.0]],
},
}
)
mock_get_app_config.return_value = SimpleNamespace(
get_farm_weather_service=lambda: mock_service
)
response = self.client.post(
"/farm-card/",
data={"farm_uuid": "550e8400-e29b-41d4-a716-446655440000"},
format="json",
)
self.assertEqual(response.status_code, 200)
payload = response.json()["data"]
self.assertEqual(payload["condition"], "صاف")
self.assertEqual(payload["chartData"]["labels"][0], "2026-04-01")
@patch("weather.views.apps.get_app_config")
def test_farm_weather_api_returns_404_for_missing_farm(self, mock_get_app_config):
mock_service = SimpleNamespace(
get_farm_weather_card=lambda **_kwargs: (_ for _ in ()).throw(ValueError("Farm not found."))
)
mock_get_app_config.return_value = SimpleNamespace(
get_farm_weather_service=lambda: mock_service
)
response = self.client.post(
"/farm-card/",
data={"farm_uuid": "550e8400-e29b-41d4-a716-446655440000"},
format="json",
)
self.assertEqual(response.status_code, 404)
self.assertEqual(response.json()["msg"], "Farm not found.")
@override_settings(ROOT_URLCONF="weather.urls")
class WaterNeedPredictionApiTests(TestCase):
def setUp(self):
self.client = APIClient()
@patch("weather.views.apps.get_app_config")
def test_water_need_api_returns_payload(self, mock_get_app_config):
mock_service = SimpleNamespace(
get_water_need_prediction=lambda **_kwargs: {
"farm_uuid": "550e8400-e29b-41d4-a716-446655440000",
"totalNext7Days": 24.6,
"unit": "mm",
"categories": ["روز 1", "روز 2"],
"series": [{"name": "نیاز آبی تعدیل‌شده", "data": [3.2, 4.1]}],
"dailyBreakdown": [
{"forecast_date": "2026-04-01", "gross_irrigation_mm": 3.2},
{"forecast_date": "2026-04-02", "gross_irrigation_mm": 4.1},
],
"insight": {
"summary": "جمع نياز آبي هفته آينده حدود 24.6 ميلي متر است.",
"irrigation_outlook": "نياز آبي در حال افزايش است.",
"recommended_action": "آبياري صبح زود تنظيم شود.",
"risk_note": "در صورت بارش موثر برنامه بازبيني شود.",
"confidence": 0.82,
},
"knowledge_base": "water_need_prediction",
"tone_file": "config/tones/water_need_prediction_tone.txt",
"raw_response": "{\"summary\":\"ok\"}",
}
)
mock_get_app_config.return_value = SimpleNamespace(
get_water_need_service=lambda: mock_service
)
response = self.client.post(
"/water-need-prediction/",
data={"farm_uuid": "550e8400-e29b-41d4-a716-446655440000"},
format="json",
)
self.assertEqual(response.status_code, 200)
payload = response.json()["data"]
self.assertEqual(payload["farm_uuid"], "550e8400-e29b-41d4-a716-446655440000")
self.assertEqual(payload["knowledge_base"], "water_need_prediction")
self.assertEqual(payload["insight"]["confidence"], 0.82)
@patch("weather.views.apps.get_app_config")
def test_water_need_api_returns_404_for_missing_farm(self, mock_get_app_config):
mock_service = SimpleNamespace(
get_water_need_prediction=lambda **_kwargs: (_ for _ in ()).throw(ValueError("Farm not found."))
)
mock_get_app_config.return_value = SimpleNamespace(
get_water_need_service=lambda: mock_service
)
response = self.client.post(
"/water-need-prediction/",
data={"farm_uuid": "550e8400-e29b-41d4-a716-446655440000"},
format="json",
)
self.assertEqual(response.status_code, 404)
self.assertEqual(response.json()["msg"], "Farm not found.")