fix: preserve handled display cabinet cases
This commit is contained in:
@@ -252,6 +252,64 @@ class AlarmSnapshotTests(unittest.TestCase):
|
||||
self.assertNotEqual(encoded_frames[0].rgb, source_frame.rgb)
|
||||
self.assertNotEqual(encoded_frames[0].pixel(1, 1), (0, 0, 0))
|
||||
|
||||
def test_capture_alert_snapshot_only_draws_alert_event_zones(self) -> None:
|
||||
encoded_frames: list[Frame] = []
|
||||
|
||||
def fake_encode(frame: Frame, timeout_seconds: float) -> bytes:
|
||||
encoded_frames.append(frame)
|
||||
return b"jpeg-bytes"
|
||||
|
||||
def fake_upload(
|
||||
image_bytes: bytes,
|
||||
*,
|
||||
file_name: str,
|
||||
object_key_hint: str,
|
||||
settings,
|
||||
post_json_request=None,
|
||||
post_multipart_request=None,
|
||||
) -> dict[str, object]:
|
||||
return {"status": "uploaded", "object_key": "uploads/alarms/zone-only.jpg", "file_name": file_name}
|
||||
|
||||
source_frame = Frame(width=30, height=20, rgb=b"\x00\x00\x00" * 600)
|
||||
result = capture_alert_snapshot(
|
||||
source_frame,
|
||||
[
|
||||
{
|
||||
"event": "time_alarm",
|
||||
"severity": "alarm",
|
||||
"batch_id": "batch_1",
|
||||
"camera_id": "cam_1",
|
||||
"zone_id": "1",
|
||||
"ts": "2026-06-09T09:00:00+00:00",
|
||||
}
|
||||
],
|
||||
{
|
||||
"alarm_snapshot_upload": {"enabled": True},
|
||||
"zones": [
|
||||
{
|
||||
"id": "1",
|
||||
"label": "区域 1",
|
||||
"polygon": [[0.00, 0.00], [0.45, 0.00], [0.45, 1.00], [0.00, 1.00]],
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"label": "区域 2",
|
||||
"polygon": [[0.55, 0.00], [1.00, 0.00], [1.00, 1.00], [0.55, 1.00]],
|
||||
},
|
||||
],
|
||||
"trash": {"roi": [[0.45, 0.50], [0.55, 0.50], [0.55, 1.00], [0.45, 1.00]]},
|
||||
},
|
||||
now=datetime(2026, 6, 9, 9, 0, tzinfo=UTC),
|
||||
jpeg_encoder=fake_encode,
|
||||
uploader=fake_upload,
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "uploaded")
|
||||
self.assertEqual(len(encoded_frames), 1)
|
||||
self.assertNotEqual(encoded_frames[0].pixel(5, 10), (0, 0, 0))
|
||||
self.assertEqual(encoded_frames[0].pixel(25, 10), (0, 0, 0))
|
||||
self.assertEqual(encoded_frames[0].pixel(15, 15), (0, 0, 0))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -6,7 +6,7 @@ import unittest
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
from cold_display_guard.cases import CaseStore
|
||||
from cold_display_guard.cases import CaseStore, append_case_snapshots, load_case_snapshots
|
||||
from cold_display_guard.main import (
|
||||
case_sink_path,
|
||||
capture_runtime_alarm_snapshot,
|
||||
@@ -67,6 +67,61 @@ class RuntimeRestoreTests(unittest.TestCase):
|
||||
self.assertEqual(written[0]["case_type"], "time_alarm")
|
||||
self.assertEqual(written[0]["case_status"], "open")
|
||||
|
||||
def test_persist_case_updates_preserves_api_handled_snapshot(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
path = Path(tmpdir) / "cases.jsonl"
|
||||
runtime_store = CaseStore()
|
||||
created = persist_case_updates(
|
||||
runtime_store,
|
||||
path,
|
||||
[
|
||||
{
|
||||
"event": "time_alarm",
|
||||
"ts": datetime(2026, 6, 9, 9, 0, tzinfo=UTC).isoformat(),
|
||||
"batch_id": "batch_000001",
|
||||
"camera_id": "cam_01",
|
||||
"zone_id": "1",
|
||||
"zone_label": "区域 1",
|
||||
"severity": "alarm",
|
||||
"state": "alerted",
|
||||
}
|
||||
],
|
||||
)[0]
|
||||
api_store = CaseStore(load_case_snapshots(path))
|
||||
append_case_snapshots(
|
||||
path,
|
||||
[
|
||||
api_store.mark_handled(
|
||||
str(created["case_id"]),
|
||||
handled_at=datetime(2026, 6, 9, 9, 5, tzinfo=UTC),
|
||||
handled_by="alice",
|
||||
handled_source="manual",
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
snapshots = persist_case_updates(
|
||||
runtime_store,
|
||||
path,
|
||||
[
|
||||
{
|
||||
"event": "batch_pending_disposal",
|
||||
"ts": datetime(2026, 6, 9, 9, 6, tzinfo=UTC).isoformat(),
|
||||
"batch_id": "batch_000001",
|
||||
"camera_id": "cam_01",
|
||||
"zone_id": "1",
|
||||
"zone_label": "区域 1",
|
||||
"severity": "warning",
|
||||
"state": "pending_disposal",
|
||||
}
|
||||
],
|
||||
)
|
||||
latest = CaseStore(load_case_snapshots(path)).latest_cases()[0]
|
||||
|
||||
self.assertEqual(snapshots, [])
|
||||
self.assertEqual(latest["case_status"], "handled")
|
||||
self.assertEqual(latest["handled_source"], "manual")
|
||||
|
||||
def test_deliver_runtime_webhooks_sends_event_and_case_payloads(self) -> None:
|
||||
deliveries: list[tuple[str, dict[str, object]]] = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user