87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
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)
|