import unittest from unittest.mock import patch from textual.widgets import Input, Label from chat_tui.app import ChatApp class ChatAppTest(unittest.IsolatedAsyncioTestCase): async def test_submitted_input_is_displayed_and_accumulated(self) -> None: app = ChatApp() async with app.run_test() as pilot: input_widget = app.query_one("#user-input", Input) input_widget.value = "첫 번째 입력" await pilot.press("enter") await pilot.pause() input_widget.value = "두 번째 입력" await pilot.press("enter") await pilot.pause() self.assertEqual( app.submitted_inputs, ["첫 번째 입력", "두 번째 입력"], ) displayed = [label.renderable for label in app.query("#conversation Label")] self.assertEqual(displayed, ["첫 번째 입력", "두 번째 입력"]) self.assertEqual(input_widget.value, "") async def test_empty_input_is_not_added(self) -> None: app = ChatApp() async with app.run_test() as pilot: await pilot.press("enter") await pilot.pause() self.assertEqual(app.submitted_inputs, []) self.assertEqual(len(app.query("#conversation Label")), 0) async def test_escape_requests_application_exit(self) -> None: app = ChatApp() with patch.object(app, "exit") as exit_mock: async with app.run_test() as pilot: await pilot.press("escape") await pilot.pause() exit_mock.assert_called_once_with()