1010from republic import StreamEvent
1111
1212from bub .channels .cli import CliChannel
13+ from bub .channels .cli import renderer as cli_renderer
14+ from bub .channels .cli .renderer import CliRenderer
1315from bub .channels .handler import BufferedMessageHandler
1416from bub .channels .manager import ChannelManager
1517from bub .channels .message import ChannelMessage
@@ -301,7 +303,7 @@ async def test_cli_channel_stream_events_renders_stream_and_yields_events() -> N
301303 events : list [tuple [str , str , str ]] = []
302304 live_handle = object ()
303305 channel ._renderer = SimpleNamespace (
304- start_stream = lambda kind : events .append (("start" , kind , "" )) or live_handle ,
306+ start_stream = lambda kind , text : events .append (("start" , kind , text )) or live_handle ,
305307 update_stream = lambda live , * , kind , text : events .append (("update" , kind , text )),
306308 finish_stream = lambda live , * , kind , text : events .append (("finish" , kind , text )),
307309 error = lambda content : events .append (("error" , "error" , content )),
@@ -319,8 +321,7 @@ async def source() -> asyncio.AsyncIterator[StreamEvent]:
319321 yielded = [event async for event in channel .stream_events (message , source ())]
320322
321323 assert events == [
322- ("start" , "command" , "" ),
323- ("update" , "command" , "hel" ),
324+ ("start" , "command" , "hel" ),
324325 ("update" , "command" , "hello" ),
325326 ("finish" , "command" , "hello" ),
326327 ]
@@ -337,6 +338,40 @@ def test_cli_channel_history_file_uses_workspace_hash(tmp_path: Path) -> None:
337338 assert result .suffix == ".history"
338339
339340
341+ def test_cli_renderer_stream_uses_live_with_initial_text (monkeypatch : pytest .MonkeyPatch ) -> None :
342+ live_calls : list [tuple [str , object ]] = []
343+
344+ class FakeLive :
345+ def __init__ (self , renderable , ** kwargs ) -> None :
346+ live_calls .append (("init" , renderable ))
347+ live_calls .append (("transient" , kwargs ["transient" ]))
348+ self .renderable = renderable
349+
350+ def start (self , * , refresh : bool = False ) -> None :
351+ live_calls .append (("start_refresh" , refresh ))
352+
353+ def update (self , renderable , * , refresh : bool = False ) -> None :
354+ live_calls .append (("update_refresh" , refresh ))
355+ self .renderable = renderable
356+
357+ def stop (self ) -> None :
358+ live_calls .append (("stop" , self .renderable ))
359+
360+ printed : list [str ] = []
361+ console = SimpleNamespace (print = printed .append )
362+ monkeypatch .setattr (cli_renderer , "Live" , FakeLive )
363+
364+ renderer = CliRenderer (console ) # type: ignore[arg-type]
365+ live = renderer .start_stream ("normal" , "hel" )
366+ renderer .update_stream (live , kind = "normal" , text = "hello" ) # type: ignore[arg-type]
367+ renderer .finish_stream (live , kind = "normal" , text = "hello" ) # type: ignore[arg-type]
368+
369+ assert ("transient" , False ) in live_calls
370+ assert ("start_refresh" , True ) in live_calls
371+ assert ("update_refresh" , True ) in live_calls
372+ assert not printed
373+
374+
340375def test_bub_message_filter_accepts_private_messages () -> None :
341376 message = SimpleNamespace (chat = SimpleNamespace (type = "private" ), text = "hello" )
342377
0 commit comments