From 7109be8cbf5c5f6c6a92ca4f83ecf38aa6c01201 Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Thu, 11 Jun 2026 08:48:35 -0400 Subject: [PATCH] test: cover schedule prompt modal validation --- src/hqt/tui/screens/schedule_prompt.py | 8 +++-- tests/test_tui.py | 41 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/hqt/tui/screens/schedule_prompt.py b/src/hqt/tui/screens/schedule_prompt.py index 2a7c574..e37f231 100644 --- a/src/hqt/tui/screens/schedule_prompt.py +++ b/src/hqt/tui/screens/schedule_prompt.py @@ -50,15 +50,19 @@ class SchedulePromptScreen(ModalScreen[tuple[str, timedelta] | None]): self._submit() def _submit(self) -> None: - prompt = self.query_one("#prompt-input", Input).value.strip() + prompt_input = self.query_one("#prompt-input", Input) + prompt = prompt_input.value.strip() if not prompt: self._set_error("Prompt cannot be empty") + prompt_input.focus() return + delay_input = self.query_one("#delay-input", Input) try: - delay = parse_delay(self.query_one("#delay-input", Input).value.strip()) + delay = parse_delay(delay_input.value.strip()) except ValueError: self._set_error("Use a delay like 90s, 30m, 2h, or 1h30m") + delay_input.focus() return self.dismiss((prompt, delay)) diff --git a/tests/test_tui.py b/tests/test_tui.py index d813ebd..b5900d3 100644 --- a/tests/test_tui.py +++ b/tests/test_tui.py @@ -1122,6 +1122,47 @@ async def test_schedule_prompt_screen_invalid_delay_stays_open_with_error(): assert results == [] error = app.screen.query_one("#schedule-error", Label) assert "Use a delay like" in str(error.render()) + assert app.screen.focused == app.screen.query_one("#delay-input", Input) + + +@pytest.mark.asyncio +async def test_schedule_prompt_screen_empty_prompt_stays_open_with_error(): + from hqt.tui.screens.schedule_prompt import SchedulePromptScreen + from textual.widgets import Button, Input, Label + + app = HqtApp() + async with app.run_test(size=(120, 40)) as pilot: + results = [] + app.push_screen(SchedulePromptScreen(), results.append) + await pilot.pause() + + app.screen.query_one("#prompt-input", Input).value = " " + app.screen.query_one("#delay-input", Input).value = "30m" + app.screen.query_one("#ok-btn", Button).press() + await pilot.pause() + + assert isinstance(app.screen, SchedulePromptScreen) + assert results == [] + error = app.screen.query_one("#schedule-error", Label) + assert "Prompt cannot be empty" in str(error.render()) + assert app.screen.focused == app.screen.query_one("#prompt-input", Input) + + +@pytest.mark.asyncio +async def test_schedule_prompt_screen_cancel_returns_none(): + from hqt.tui.screens.schedule_prompt import SchedulePromptScreen + from textual.widgets import Button + + app = HqtApp() + async with app.run_test(size=(120, 40)) as pilot: + results = [] + app.push_screen(SchedulePromptScreen(), results.append) + await pilot.pause() + + app.screen.query_one("#cancel-btn", Button).press() + await pilot.pause() + + assert results == [None] # ---------------------------------------------------------------------------