from datetime import timedelta from django.test import Client, TestCase from django.utils import timezone from apps.accounts.models import User from apps.farms.models import Cycle, Flock, Kandang, Site from apps.operations.models import IotPanel SAMPLE_PUSH_PAYLOAD = { "suhu": "30.0", "kelembapan": "70.0", "wind": "5.0", "flow": "12.0", "total": "0.00", } class IotPanelPushTests(TestCase): def setUp(self): self.owner = User.objects.create_user(user_name="owner", password="secret") self.site = Site.objects.create(site_name="Site A", user=self.owner) self.kandang = Kandang.objects.create(kandang_name="Kandang 1", site=self.site) self.flock = Flock.objects.create( flock_name="Lantai 1", kandang=self.kandang, iot_api_url="http://192.168.1.100:1123/", ) today = timezone.localdate() Cycle.objects.create( kandang=self.kandang, start_date=today - timedelta(days=5), end_date=today + timedelta(days=30), doc_in_weight=40, doc_in_count=10000, ) self.client = Client() def test_push_creates_panel(self): response = self.client.post( f"/api/v1/panel-iot/push/{self.flock.pk}/", SAMPLE_PUSH_PAYLOAD, content_type="application/json", ) self.assertEqual(response.status_code, 200, response.content) data = response.json() self.assertTrue(data["ok"]) self.assertIsNotNone(data["panel_id"]) panel = IotPanel.objects.get(pk=data["panel_id"]) self.assertEqual(panel.flock_id, self.flock.pk) self.assertAlmostEqual(panel.average_temperature, 30.0) self.assertAlmostEqual(panel.humidity, 70.0) self.assertAlmostEqual(panel.wind_speed, 5.0) self.assertAlmostEqual(panel.water_total, 12.0) def test_push_divides_by_10_when_over_100(self): response = self.client.post( f"/api/v1/panel-iot/push/{self.flock.pk}/", {"suhu": "300", "kelembapan": "700", "wind": "50", "flow": "12.0", "total": "0"}, content_type="application/json", ) self.assertEqual(response.status_code, 200, response.content) panel = IotPanel.objects.get(pk=response.json()["panel_id"]) self.assertAlmostEqual(panel.average_temperature, 30.0) self.assertAlmostEqual(panel.humidity, 70.0) self.assertAlmostEqual(panel.wind_speed, 50.0) def test_push_nonexistent_flock_returns_404(self): response = self.client.post( "/api/v1/panel-iot/push/99999/", SAMPLE_PUSH_PAYLOAD, content_type="application/json", ) self.assertEqual(response.status_code, 404) def test_push_computes_experience_temperature(self): response = self.client.post( f"/api/v1/panel-iot/push/{self.flock.pk}/", SAMPLE_PUSH_PAYLOAD, content_type="application/json", ) self.assertEqual(response.status_code, 200) panel = IotPanel.objects.get(pk=response.json()["panel_id"]) self.assertIsNotNone(panel.experience_temperature) self.assertIsInstance(panel.experience_temperature, float)