test_tui_app.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """Smoke test: the Textual app mounts, subscribes, and ingests broadcasts."""
  2. import asyncio
  3. import os
  4. import shutil
  5. import tempfile
  6. import pytest
  7. from stt_daemon.assistant.control import ControlServer
  8. from stt_daemon.assistant.service import AssistantService
  9. from stt_daemon.config import Config
  10. class FakeSubscriber:
  11. def events(self):
  12. return iter(())
  13. def close(self):
  14. pass
  15. @pytest.fixture
  16. def server():
  17. directory = tempfile.mkdtemp(prefix="stta-")
  18. path = os.path.join(directory, "c.sock")
  19. cfg = Config()
  20. cfg.assistant.control_socket = path
  21. service = AssistantService(cfg, FakeSubscriber())
  22. control = ControlServer(cfg, service, path=path)
  23. service.set_sinks(emit=control.broadcast, relay=control.relay)
  24. control.start()
  25. yield path, service
  26. control.close()
  27. service.stop()
  28. shutil.rmtree(directory, ignore_errors=True)
  29. def test_tui_mounts_subscribes_and_ingests_broadcasts(server):
  30. pytest.importorskip("textual")
  31. from stt_daemon.tui.app import AssistantTUI
  32. path, service = server
  33. app = AssistantTUI(path)
  34. async def scenario():
  35. async with app.run_test() as pilot:
  36. await pilot.pause()
  37. service.arm() # broadcast to the subscribed viewer
  38. for _ in range(60):
  39. await pilot.pause()
  40. if app.state.mode == "command_armed":
  41. break
  42. await asyncio.sleep(0.05)
  43. asyncio.run(scenario())
  44. assert app.state.mode == "command_armed"