45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import json
|
||
|
|
import unittest
|
||
|
|
from types import SimpleNamespace
|
||
|
|
|
||
|
|
from routes.sessions import stream_ui_events
|
||
|
|
from ui_event_bus import UiEventBus
|
||
|
|
|
||
|
|
|
||
|
|
class DummyRequest:
|
||
|
|
def __init__(self, chat_id: str) -> None:
|
||
|
|
self.query_params = {"chat_id": chat_id}
|
||
|
|
|
||
|
|
async def is_disconnected(self) -> bool:
|
||
|
|
return False
|
||
|
|
|
||
|
|
|
||
|
|
class EventsRouteTests(unittest.IsolatedAsyncioTestCase):
|
||
|
|
async def test_events_stream_emits_ready_and_published_payload(self) -> None:
|
||
|
|
runtime = SimpleNamespace(event_bus=UiEventBus())
|
||
|
|
|
||
|
|
response = await stream_ui_events(DummyRequest("test-chat"), runtime=runtime)
|
||
|
|
iterator = response.body_iterator
|
||
|
|
|
||
|
|
first_chunk = await anext(iterator)
|
||
|
|
self.assertEqual(first_chunk, ": stream-open\n\n")
|
||
|
|
|
||
|
|
second_chunk = await anext(iterator)
|
||
|
|
ready_payload = json.loads(second_chunk.removeprefix("data: ").strip())
|
||
|
|
self.assertEqual(ready_payload["type"], "events.ready")
|
||
|
|
self.assertEqual(ready_payload["chat_id"], "test-chat")
|
||
|
|
|
||
|
|
await runtime.event_bus.publish(
|
||
|
|
{"type": "cards.changed", "chat_id": "test-chat"},
|
||
|
|
chat_id="test-chat",
|
||
|
|
)
|
||
|
|
|
||
|
|
third_chunk = await anext(iterator)
|
||
|
|
event_payload = json.loads(third_chunk.removeprefix("data: ").strip())
|
||
|
|
self.assertEqual(event_payload["type"], "cards.changed")
|
||
|
|
self.assertEqual(event_payload["chat_id"], "test-chat")
|
||
|
|
|
||
|
|
await iterator.aclose()
|