From 6ccb6d443d2fb871b43d96ea61a95bc3e6a92355 Mon Sep 17 00:00:00 2001 From: historia Date: Wed, 26 Aug 2026 17:46:48 -0400 Subject: feat: combined install/configure tui screens into one menu, removed extraneous wizard screens --- app/tests/test_tui.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'app/tests/test_tui.py') diff --git a/app/tests/test_tui.py b/app/tests/test_tui.py index c2cd267..b15419b 100644 --- a/app/tests/test_tui.py +++ b/app/tests/test_tui.py @@ -753,6 +753,58 @@ class FormTests(TuiTestCase): result = tui.form(screen, "Settings", fields) self.assertEqual(result, {"fmt": "good", "other": "x"}) + def test_dir_field_opens_the_browser_and_saves_the_pick(self): + picked = Path("/picked/voices") + fields = [{"key": "voices", "label": "Voices directory", + "kind": "dir", "value": Path("/start")}] + with patch.object(tui, "browse_directory", + return_value=picked) as mk_browser: + # edit, Enter (focus jumped to Save after the pick). + screen = FakeScreen(keys=[10, 10]) + result = tui.form(screen, "Settings", fields) + self.assertEqual(result, {"voices": picked}) + mk_browser.assert_called_once() + self.assertEqual(Path(mk_browser.call_args[1]["start"]), + Path("/start")) + + def test_dir_pick_moves_focus_to_the_accept_button(self): + # Accepting a directory is a completed choice: focus lands on + # Save, so the very next Enter submits — no Tab hunting. + picked = Path("/picked/voices") + fields = [{"key": "voices", "label": "Voices directory", + "kind": "dir", "value": Path("/start")}] + with patch.object(tui, "browse_directory", + return_value=picked) as mk_browser: + screen = FakeScreen(keys=[10, 10]) + result = tui.form(screen, "Settings", fields) + self.assertEqual(result, {"voices": picked}) + mk_browser.assert_called_once() + + def test_dir_field_back_out_keeps_the_old_value(self): + # Backing out of the browser returns its back_value; the field + # keeps the previous path and focus stays on the fields (Tab + # then walks to Save). + fields = [{"key": "voices", "label": "Voices directory", + "kind": "dir", "value": Path("/start")}] + with patch.object(tui, "browse_directory", + side_effect=lambda *a, **k: k["back_value"]): + screen = FakeScreen(keys=[10, 9, 10]) + result = tui.form(screen, "Settings", fields) + self.assertEqual(result, {"voices": Path("/start")}) + + def test_dir_field_renders_its_path_and_fires_on_change(self): + picked = Path("/picked") + calls = [] + fields = [{"key": "voices", "label": "Voices", "kind": "dir", + "value": None, "on_change": lambda fs: calls.append(1)}] + with patch.object(tui, "browse_directory", return_value=picked): + screen = FakeScreen(keys=[10, 10]) + result = tui.form(screen, "Settings", fields) + self.assertEqual(result, {"voices": picked}) + self.assertEqual(calls, [1]) + texts = [text for _, _, text, _ in screen.strings] + self.assertTrue(any("Voices:" in text for text in texts)) + def _two_text_fields(self): return [{"key": "first", "label": "First", "kind": "text", "value": "a"}, -- cgit v1.2.3