Submit GUI commands with fetch fallback
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import unittest
|
||||
|
||||
from frigate_camera_control_bridge.app import CameraControlBridge
|
||||
|
||||
|
||||
class DummyAction:
|
||||
def __init__(self, action_id="example_camera_white", kind="hikvision_colorvu"):
|
||||
self.id = action_id
|
||||
self.platform = "switch"
|
||||
self.kind = kind
|
||||
self.state = "ON"
|
||||
self.auto_off_seconds = 600
|
||||
self.auto_off_at = 1234567890
|
||||
self.snapshot_version = 7
|
||||
self.cfg = {
|
||||
"id": self.id,
|
||||
"name": "Example white light",
|
||||
"name_key": "action.manual_white",
|
||||
"requires_ack": False,
|
||||
"snapshot": {
|
||||
"camera": "example",
|
||||
"frigate_url": "http://frigate.example.test:5000",
|
||||
},
|
||||
}
|
||||
|
||||
def command_list(self):
|
||||
return ["on", "off"]
|
||||
|
||||
def display_name(self, _lang):
|
||||
return "Example white light"
|
||||
|
||||
|
||||
class ActionPayloadTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.bridge = object.__new__(CameraControlBridge)
|
||||
self.bridge.default_language = "en"
|
||||
self.action = DummyAction()
|
||||
self.bridge.actions_snapshot = lambda: [self.action]
|
||||
|
||||
def test_api_action_includes_ui_state_fields(self):
|
||||
payload = CameraControlBridge.api_action(self.bridge, self.action, "en")
|
||||
|
||||
self.assertEqual(payload["id"], "example_camera_white")
|
||||
self.assertEqual(payload["state"], "ON")
|
||||
self.assertEqual(payload["state_label"], "ON")
|
||||
self.assertEqual(payload["snapshot_version"], 7)
|
||||
self.assertEqual(payload["auto_off_at"], 1234567890)
|
||||
|
||||
def test_action_payload_returns_updated_action_for_json_gui(self):
|
||||
payload = CameraControlBridge.action_payload(
|
||||
self.bridge,
|
||||
"en",
|
||||
self.action,
|
||||
"on",
|
||||
{"ok": True, "command": "on"},
|
||||
"/?lang=en",
|
||||
)
|
||||
|
||||
self.assertTrue(payload["ok"])
|
||||
self.assertEqual(payload["message"], "Command sent.")
|
||||
self.assertEqual(payload["redirect_url"], "/?lang=en")
|
||||
self.assertEqual(payload["action"]["id"], "example_camera_white")
|
||||
|
||||
def test_all_off_payload_includes_all_actions_for_gui_refresh(self):
|
||||
action = DummyAction("example_all_off", kind="all_off")
|
||||
payload = CameraControlBridge.action_payload(
|
||||
self.bridge,
|
||||
"en",
|
||||
action,
|
||||
"press",
|
||||
{"ok": True, "results": []},
|
||||
"/?lang=en",
|
||||
)
|
||||
|
||||
self.assertEqual(payload["action_id"], "example_all_off")
|
||||
self.assertEqual(len(payload["actions"]), 1)
|
||||
self.assertEqual(payload["actions"][0]["id"], "example_camera_white")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
+23
-1
@@ -103,7 +103,8 @@ class UiRenderTest(unittest.TestCase):
|
||||
html = render_page([action], "en")
|
||||
|
||||
self.assertIn('class="cmd cmd-on"', html)
|
||||
self.assertNotIn('Already active until automatic turn-off', html)
|
||||
self.assertNotIn('class="cmd cmd-on" type="submit" disabled', html)
|
||||
self.assertIn('data-disabled-label="Already active until automatic turn-off"', html)
|
||||
|
||||
def test_camera_card_uses_friendly_display_name(self):
|
||||
action = DummyAction()
|
||||
@@ -121,6 +122,27 @@ class UiRenderTest(unittest.TestCase):
|
||||
self.assertIn("SNAPSHOT_REFRESH_DELAY_MS = 5000", script)
|
||||
self.assertIn("window.setTimeout", script)
|
||||
|
||||
def test_command_forms_expose_ajax_status_metadata(self):
|
||||
html = render_page([DummyAction()], "en")
|
||||
|
||||
self.assertIn('class="command-form" method="post"', html)
|
||||
self.assertIn('type="submit"', html)
|
||||
self.assertIn('data-working-label="Sending command..."', html)
|
||||
self.assertIn('data-success-label="Command sent."', html)
|
||||
self.assertIn('data-network-failed-label="Could not reach the bridge.', html)
|
||||
self.assertIn('data-action-status', html)
|
||||
self.assertIn('data-state-chip', html)
|
||||
self.assertIn('data-timer', html)
|
||||
|
||||
def test_command_submit_uses_fetch_without_page_navigation(self):
|
||||
script = Path("frigate_camera_control_bridge/static/app.js").read_text(encoding="utf-8")
|
||||
|
||||
self.assertIn("handleCommandSubmit(form, event)", script)
|
||||
self.assertIn('form.classList.contains("command-form")', script)
|
||||
self.assertIn('headers: { Accept: "application/json" }', script)
|
||||
self.assertIn("event.preventDefault()", script)
|
||||
self.assertIn("commandErrorMessage", script)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user