72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
import unittest
|
|
from datetime import datetime
|
|
from types import SimpleNamespace
|
|
|
|
from routes.streams import _serialize
|
|
|
|
|
|
class StreamAccessSerializationTest(unittest.TestCase):
|
|
def make_stream(self, **overrides):
|
|
values = {
|
|
"id": 1,
|
|
"title": "Hidden program",
|
|
"description": None,
|
|
"cover_url": None,
|
|
"status": SimpleNamespace(value="pending"),
|
|
"scheduled_at": datetime(2026, 8, 20, 12, 0),
|
|
"started_at": None,
|
|
"ended_at": None,
|
|
"multicast_enabled": False,
|
|
"replay_file": None,
|
|
"chapters_json": "[]",
|
|
"transcode_profile": "default",
|
|
"homepage_visible": False,
|
|
"remote_control_enabled": True,
|
|
"stream_key": "private-key",
|
|
"created_at": datetime(2026, 8, 19, 12, 0),
|
|
}
|
|
values.update(overrides)
|
|
return SimpleNamespace(**values)
|
|
|
|
def test_public_serialization_excludes_private_stream_key(self):
|
|
payload = _serialize(self.make_stream(), include_private=False)
|
|
self.assertNotIn("stream_key", payload)
|
|
self.assertFalse(payload["homepage_visible"])
|
|
self.assertTrue(payload["remote_control_enabled"])
|
|
|
|
def test_admin_serialization_includes_private_stream_key(self):
|
|
payload = _serialize(self.make_stream(), include_private=True)
|
|
self.assertEqual(payload["stream_key"], "private-key")
|
|
|
|
def test_program_statuses_are_preserved(self):
|
|
for status in ("pending", "live", "ended", "cancelled"):
|
|
with self.subTest(status=status):
|
|
payload = _serialize(self.make_stream(status=SimpleNamespace(value=status)), include_private=False)
|
|
self.assertEqual(payload["status"], status)
|
|
|
|
|
|
class AccessContractTest(unittest.TestCase):
|
|
def test_hidden_program_uses_private_direct_url_contract(self):
|
|
stream = StreamAccessSerializationTest().make_stream(homepage_visible=False)
|
|
public_payload = _serialize(stream, include_private=False)
|
|
admin_payload = _serialize(stream, include_private=True)
|
|
self.assertFalse(public_payload["homepage_visible"])
|
|
self.assertNotIn("stream_key", public_payload)
|
|
self.assertEqual(admin_payload["stream_key"], "private-key")
|
|
|
|
def test_remote_control_flag_is_enforced_by_contract(self):
|
|
enabled = _serialize(
|
|
StreamAccessSerializationTest().make_stream(remote_control_enabled=True),
|
|
include_private=False,
|
|
)
|
|
disabled = _serialize(
|
|
StreamAccessSerializationTest().make_stream(remote_control_enabled=False),
|
|
include_private=False,
|
|
)
|
|
self.assertTrue(enabled["remote_control_enabled"])
|
|
self.assertFalse(disabled["remote_control_enabled"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|