2026-03-29 15:07:14 +03:30
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
from django.test import TestCase, override_settings
|
|
|
|
|
from rest_framework.test import APIRequestFactory, force_authenticate
|
|
|
|
|
|
|
|
|
|
from crop_zoning.models import CropArea
|
2026-03-30 23:29:03 +03:30
|
|
|
from sensor_hub.seeds import seed_admin_sensor
|
2026-03-29 15:07:14 +03:30
|
|
|
from sensor_hub.views import SensorListCreateView
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AREA_GEOJSON = {
|
|
|
|
|
"type": "Feature",
|
|
|
|
|
"properties": {},
|
|
|
|
|
"geometry": {
|
|
|
|
|
"type": "Polygon",
|
|
|
|
|
"coordinates": [
|
|
|
|
|
[
|
|
|
|
|
[51.418934, 35.706815],
|
|
|
|
|
[51.423054, 35.691062],
|
|
|
|
|
[51.384258, 35.689389],
|
|
|
|
|
[51.418934, 35.706815],
|
|
|
|
|
]
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(
|
|
|
|
|
USE_EXTERNAL_API_MOCK=True,
|
|
|
|
|
CROP_ZONE_CHUNK_AREA_SQM=200000,
|
|
|
|
|
)
|
|
|
|
|
class SensorListCreateViewTests(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.factory = APIRequestFactory()
|
|
|
|
|
self.user = get_user_model().objects.create_user(
|
|
|
|
|
username="farmer",
|
|
|
|
|
password="secret123",
|
|
|
|
|
email="farmer@example.com",
|
|
|
|
|
phone_number="09120000000",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_create_sensor_with_area_geojson_creates_crop_zoning_payload(self):
|
|
|
|
|
request = self.factory.post(
|
|
|
|
|
"/api/sensor-hub/",
|
|
|
|
|
{
|
|
|
|
|
"name": "zone-sensor",
|
|
|
|
|
"specifications": {"model": "SH-1"},
|
|
|
|
|
"power_source": {"type": "battery"},
|
|
|
|
|
"customized_sensors": {"report_interval_sec": 300},
|
|
|
|
|
"area_geojson": AREA_GEOJSON,
|
|
|
|
|
},
|
|
|
|
|
format="json",
|
|
|
|
|
)
|
|
|
|
|
force_authenticate(request, user=self.user)
|
|
|
|
|
|
|
|
|
|
response = SensorListCreateView.as_view()(request)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 201)
|
|
|
|
|
self.assertEqual(response.data["code"], 201)
|
|
|
|
|
self.assertEqual(response.data["data"]["name"], "zone-sensor")
|
|
|
|
|
self.assertIn("zoning", response.data["data"])
|
|
|
|
|
self.assertGreater(response.data["data"]["zoning"]["zone_count"], 1)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
response.data["data"]["zoning"]["zone_count"],
|
|
|
|
|
CropArea.objects.get().zone_count,
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(CropArea.objects.count(), 1)
|
2026-03-30 23:29:03 +03:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(
|
|
|
|
|
USE_EXTERNAL_API_MOCK=True,
|
|
|
|
|
CROP_ZONE_CHUNK_AREA_SQM=200000,
|
|
|
|
|
)
|
|
|
|
|
class SensorSeedTests(TestCase):
|
|
|
|
|
def test_seed_admin_sensor_dispatches_crop_logic_flow_on_create(self):
|
|
|
|
|
sensor, created = seed_admin_sensor()
|
|
|
|
|
|
|
|
|
|
self.assertTrue(created)
|
|
|
|
|
self.assertEqual(sensor.uuid_sensor.hex, "11111111111111111111111111111111")
|
|
|
|
|
self.assertEqual(CropArea.objects.count(), 1)
|
|
|
|
|
|
|
|
|
|
def test_seed_admin_sensor_does_not_dispatch_twice_for_existing_seed(self):
|
|
|
|
|
first_sensor, first_created = seed_admin_sensor()
|
|
|
|
|
second_sensor, second_created = seed_admin_sensor()
|
|
|
|
|
|
|
|
|
|
self.assertTrue(first_created)
|
|
|
|
|
self.assertFalse(second_created)
|
|
|
|
|
self.assertEqual(first_sensor.id, second_sensor.id)
|
|
|
|
|
self.assertEqual(CropArea.objects.count(), 1)
|