import subprocess import sys import unittest from pathlib import Path from ipython_shell.jupyter.messages import ( ExecuteResultMessage, UnknownJupyterMessage, ) from st_demo.app import visible_records from st_demo.ui import event_to_record, preferred_mime class UIDisplayTests(unittest.TestCase): def test_completed_call_records_remain_visible_after_active_call_clears(self): records = { "finished-call": [{"kind": "execute_result", "text": "42"}], } self.assertEqual(visible_records(records), records["finished-call"]) def test_app_module_loads_when_streamlit_executes_file_path(self): app_path = Path(__file__).parents[1] / "src" / "st_demo" / "app.py" result = subprocess.run( [ sys.executable, "-c", "import runpy, sys; runpy.run_path(sys.argv[1], run_name='st_demo_script')", str(app_path), ], capture_output=True, text=True, ) self.assertEqual(result.returncode, 0, result.stderr) def test_preferred_mime_chooses_html_before_plain_text(self): mime, value = preferred_mime( { "text/plain": "fallback", "text/html": "rich", } ) self.assertEqual((mime, value), ("text/html", "rich")) def test_execute_result_record_keeps_mime_and_repr(self): event = ExecuteResultMessage( message_id="message-1", parent_id="call-1", content={ "execution_count": 4, "data": { "text/plain": "Line2D(_line0)", "image/png": "ZmFrZQ==", }, }, ) record = event_to_record(event) self.assertEqual(record["kind"], "execute_result") self.assertEqual(record["text"], "Line2D(_line0)") self.assertEqual(record["data"]["image/png"], "ZmFrZQ==") def test_unknown_message_record_keeps_raw_protocol_data(self): event = UnknownJupyterMessage( channel="iopub", msg_type="vendor_extension", message_id="message-2", content={"value": 42}, raw={"msg_type": "vendor_extension", "content": {"value": 42}}, ) record = event_to_record(event) self.assertEqual(record["kind"], "vendor_extension") self.assertEqual(record["content"]["value"], 42) if __name__ == "__main__": unittest.main()