import unittest from frigate_camera_control_bridge.app import CameraControlBridge class DummyAction: def __init__(self, action_id, camera=None, kind="hikvision_colorvu", name_key=None): self.id = action_id self.kind = kind self.platform = "switch" self.auto_off_at = None self.run_called = False self.cfg = {} if name_key: self.cfg["name_key"] = name_key if camera: self.cfg["snapshot"] = { "frigate_url": "http://frigate.example.test:5000", "camera": camera, } def run(self, command, bridge=None): self.run_called = True return {"ok": True, "command": command} class RefreshSummaryTest(unittest.TestCase): def test_camera_keys_ignore_global_actions(self): keys = CameraControlBridge.camera_keys_from_actions( [ DummyAction("one_light", "one"), DummyAction("all_off", kind="all_off"), ] ) self.assertEqual(keys, {("http://frigate.example.test:5000", "one")}) def test_camera_display_name_uses_friendly_name(self): self.assertEqual( CameraControlBridge.camera_display_name("camera_key", {"friendly_name": "Camera Friendly"}), "Camera Friendly", ) def test_camera_display_name_falls_back_to_config_name(self): self.assertEqual( CameraControlBridge.camera_display_name("camera_key", {}), "camera_key", ) def test_refresh_message_reports_camera_changes_first(self): message = CameraControlBridge.refresh_message( "en", { "added_cameras": 1, "removed_cameras": 0, "added_actions": 2, "removed_actions": 0, }, ) self.assertEqual(message, "Cameras updated: +1, -0.") def test_refresh_message_reports_no_changes(self): message = CameraControlBridge.refresh_message( "en", { "added_cameras": 0, "removed_cameras": 0, "added_actions": 0, "removed_actions": 0, }, ) self.assertEqual(message, "No camera changes found.") def test_light_actions_refresh_snapshot_after_on_off(self): white = DummyAction("white", "one", name_key="action.manual_white") red_blue = DummyAction("red_blue", "one", name_key="action.red_blue") siren = DummyAction("siren", "one", name_key="action.siren") self.assertTrue(CameraControlBridge.should_refresh_snapshot_after_command(white, "on")) self.assertTrue(CameraControlBridge.should_refresh_snapshot_after_command(red_blue, "off")) self.assertFalse(CameraControlBridge.should_refresh_snapshot_after_command(siren, "on")) self.assertFalse(CameraControlBridge.should_refresh_snapshot_after_command(white, "press")) def test_execute_action_rejects_second_on_while_timer_runs(self): action = DummyAction("white", "one", name_key="action.manual_white") action.auto_off_at = 1234567890 bridge = object.__new__(CameraControlBridge) bridge.action_by_id = lambda action_id: action with self.assertRaisesRegex(RuntimeError, "already active"): CameraControlBridge.execute_action(bridge, "white", "on", publish=False) self.assertFalse(action.run_called) if __name__ == "__main__": unittest.main()