import json from django.contrib.auth import get_user_model from django.test import TestCase from app.models import AlgorithmModel, StreamModel from .models import CameraCalibration, WorkshopSite def make_stream(code, index): return StreamModel.objects.create( user_id=1, sort=index, code=code, app="live", name=code, pull_stream_url="", pull_stream_type=21, pull_stream_transfer_mode=0, pull_stream_ip="127.0.0.1", pull_stream_port=0, pull_stream_username="", pull_stream_password="", nickname="Camera %d" % index, remark="", forward_state=0, is_audio=0, snap_filepath="", camera_sum_num=1, camera_name="Camera %d" % index, camera_manufacturer="test", camera_owner="", camera_model="test", camera_device_id=code, camera_parent_id="", camera_civilcode="", state=0, ) class WorkshopApiTests(TestCase): def setUp(self): self.admin = get_user_model().objects.create_superuser("wm-admin", "wm@example.com", "pass") self.client.force_login(self.admin) self.detector = AlgorithmModel.objects.create( name="detector", algorithm_type="yolo11", task_type="detect", inference_engine="onnxruntime", device="cpu", model_file="missing.onnx", labels='["person"]', state=1, is_default=1, ) for i, code in enumerate(( "34020000001320000001", "34020000001320000002", "34020000001320000003", "34020000001320000004", ), start=1): make_stream(code, i) def test_config_initializes_existing_four_streams(self): response = self.client.get("/workshop/openConfig") self.assertEqual(response.status_code, 200) payload = response.json() self.assertEqual(payload["code"], 1000) self.assertEqual(len(payload["data"]["cameras"]), 4) self.assertTrue(all(c["stream_id"] for c in payload["data"]["cameras"])) self.assertEqual(payload["data"]["site"]["width_m"], 130.0) def test_calibration_activation_requires_validation_under_one_meter(self): config = self.client.get("/workshop/openConfig").json()["data"] camera_id = config["cameras"][0]["id"] rows = [ {"u": 0, "v": 0, "x": 0, "y": 0, "role": "fit"}, {"u": 1300, "v": 0, "x": 130, "y": 0, "role": "fit"}, {"u": 1300, "v": 500, "x": 130, "y": 50, "role": "fit"}, {"u": 0, "v": 500, "x": 0, "y": 50, "role": "fit"}, {"u": 200, "v": 100, "x": 20, "y": 10, "role": "verify"}, {"u": 650, "v": 250, "x": 65, "y": 25, "role": "verify"}, {"u": 1100, "v": 400, "x": 110, "y": 40, "role": "verify"}, ] response = self.client.post("/workshop/openCalibrate", data=json.dumps({ "camera_id": camera_id, "frame_width": 1300, "frame_height": 500, "observations": rows, "activate": True, }), content_type="application/json") self.assertEqual(response.json()["code"], 1000) calibration = CameraCalibration.objects.get() self.assertTrue(calibration.is_active) self.assertEqual(calibration.status, CameraCalibration.STATUS_VALID) def test_viewer_cannot_change_configuration(self): viewer = get_user_model().objects.create_user("wm-viewer", password="pass") self.client.force_login(viewer) response = self.client.post("/workshop/openSaveConfig", data="{}", content_type="application/json") self.assertEqual(response.status_code, 403) def test_workshop_tables_do_not_create_control_or_alarm_rows(self): self.client.get("/workshop/openConfig") site = WorkshopSite.objects.get() self.assertEqual(site.cameras.count(), 4) from app.models import AlarmModel, ZoneModel self.assertEqual(AlarmModel.objects.count(), 0) self.assertEqual(ZoneModel.objects.count(), 0)