aboutsummaryrefslogtreecommitdiff
path: root/app/tests
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-08-27 22:40:58 -0400
committerhistoria <historiavg@proton.me>2026-08-27 22:40:58 -0400
commiteb465fb2a972b6b07c4b427f940b186745ce6d90 (patch)
tree416e0a706da7ede4f273458a2e243ac22393d606 /app/tests
parent4c3ba1b68107208fe32c223588576a7bdca19a12 (diff)
downloadtts-audiobook-generator-eb465fb2a972b6b07c4b427f940b186745ce6d90.tar.gz
fix: can't check checkboxes in tts model page
Diffstat (limited to 'app/tests')
-rw-r--r--app/tests/test_hub.py22
-rw-r--r--app/tests/test_tui.py28
2 files changed, 41 insertions, 9 deletions
diff --git a/app/tests/test_hub.py b/app/tests/test_hub.py
index daa4abd..fbede75 100644
--- a/app/tests/test_hub.py
+++ b/app/tests/test_hub.py
@@ -364,20 +364,24 @@ class HubMenuTests(unittest.TestCase):
self.assertIn("qwen3_tts_1_7b_customvoice_q8_0", text)
self.assertIn("5. Go to Generate Audiobooks.", text)
# The "no need to manually start/stop" sentence sits on its own
- # indented line below the step-5 paragraph.
- self.assertIn("stop it.\nThere is no need to manually "
+ # indented line below the step-5 paragraph (one leading space
+ # beyond the 2-space indent, lining up with the step text).
+ self.assertIn("stop it.\n There is no need to manually "
"start/stop servers.", text)
self.assertIn("6. Generated audiobooks (m4b, mp3, etc.) will "
"output here:", text)
# The three folder paths are their own indented, white-bold
- # ("input") rows; the numbered steps start at the margin. They
- # resolve live from the converter module, so a Settings change
- # this session is reflected.
- self.assertIn(([(str(hub.converter_mod.BOOKS_FOLDER), "input")], 1),
+ # ("input") rows; the numbered steps start at the margin and
+ # the indented rows carry a leading space of their own, so
+ # they line up with the step text after the "N. " prefixes.
+ # They resolve live from the converter module, so a Settings
+ # change this session is reflected.
+ self.assertIn(([(" " + str(hub.converter_mod.BOOKS_FOLDER),
+ "input")], 1), items)
+ self.assertIn(([(" " + str(hub.common.VOICES_DIR), "input")], 1),
items)
- self.assertIn(([(str(hub.common.VOICES_DIR), "input")], 1), items)
- self.assertIn(([(str(hub.converter_mod.AUDIOBOOKS_FOLDER), "input")],
- 1), items)
+ self.assertIn(([(" " + str(hub.converter_mod.AUDIOBOOKS_FOLDER),
+ "input")], 1), items)
self.assertEqual(items[0][1], 0)
diff --git a/app/tests/test_tui.py b/app/tests/test_tui.py
index e12da76..e765e60 100644
--- a/app/tests/test_tui.py
+++ b/app/tests/test_tui.py
@@ -1147,6 +1147,34 @@ class CheckboxTreeTests(TuiTestCase):
picked = tui.checkbox_tree(screen, "Pick models", self.FAMILIES)
self.assertEqual(picked, [(0, "pkg-a")])
+ def test_space_toggles_option_row(self):
+ # Enter on the family checks pkg-a and expands; Down twice lands
+ # on the pkg-b option row; Space checks it; confirm returns both.
+ screen = FakeScreen(keys=[10, FakeCurses.KEY_DOWN,
+ FakeCurses.KEY_DOWN, ord(" "), 9, 10])
+ picked = tui.checkbox_tree(screen, "Pick models", self.FAMILIES)
+ self.assertEqual(picked, [(0, "pkg-a"), (0, "pkg-b")])
+
+ def test_enter_toggles_option_row(self):
+ # Enter on the family checks pkg-a and expands; Down lands on the
+ # pkg-a option row; Enter there unchecks it; Down to pkg-b, Space
+ # checks it. Confirm returns only pkg-b.
+ screen = FakeScreen(keys=[10, FakeCurses.KEY_DOWN, 10,
+ FakeCurses.KEY_DOWN, ord(" "), 9, 10])
+ picked = tui.checkbox_tree(screen, "Pick models", self.FAMILIES)
+ self.assertEqual(picked, [(0, "pkg-b")])
+
+ def test_unhandled_key_on_row_is_ignored(self):
+ # A key that is neither motion nor toggle (here "x") must not
+ # toggle anything or crash on either row kind; Esc then aborts.
+ marker = object()
+ screen = FakeScreen(keys=[ord("x"), FakeCurses.KEY_DOWN, ord("x"),
+ 27])
+ self.assertIs(
+ tui.checkbox_tree(screen, "Pick models", self.FAMILIES,
+ back_value=marker),
+ marker)
+
def test_prechecked_selection_confirmed(self):
# checked= seeds the tree (modify flow): Tab then Confirm accepts
# the pre-checked options without any extra key presses.