aboutsummaryrefslogtreecommitdiff
path: root/app/tests
diff options
context:
space:
mode:
Diffstat (limited to 'app/tests')
-rw-r--r--app/tests/test_hub.py6
-rw-r--r--app/tests/test_tui.py63
2 files changed, 63 insertions, 6 deletions
diff --git a/app/tests/test_hub.py b/app/tests/test_hub.py
index 4b394e8..0e7c2bd 100644
--- a/app/tests/test_hub.py
+++ b/app/tests/test_hub.py
@@ -492,6 +492,12 @@ class SettingsTests(unittest.TestCase):
self.assertEqual(kinds["audio_format"], "choice")
self.assertEqual(kinds["audio_bitrate"], "text")
self.assertEqual(kinds["audiocpp_port"], "text")
+ # The ports section note hangs off the first port field so it
+ # renders between the output settings and the ports.
+ notes = {f["key"]: f.get("note") for f in captured["fields"]}
+ self.assertTrue(notes["qwen_custom_port"])
+ self.assertIsNone(notes["audio_format"])
+ self.assertIsNone(notes["audiocpp_port"])
self.assertEqual(applied, [{"audio_format": "ogg",
"audio_bitrate": "192k",
"language": "English",
diff --git a/app/tests/test_tui.py b/app/tests/test_tui.py
index 5862a54..38f4fa9 100644
--- a/app/tests/test_tui.py
+++ b/app/tests/test_tui.py
@@ -416,13 +416,32 @@ class FormTests(TuiTestCase):
result = tui.form(screen, "Settings", self._fields())
self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
- def test_up_on_first_field_moves_to_cancel(self):
- marker = object()
- # Up from the first field steps onto the Cancel button, Enter.
+ def test_up_on_first_field_wraps_to_save(self):
+ # Up from the first field wraps onto the Save button; Enter saves.
screen = FakeScreen(keys=[FakeCurses.KEY_UP, 10])
- result = tui.form(screen, "Settings", self._fields(),
- back_value=marker)
- self.assertIs(result, marker)
+ result = tui.form(screen, "Settings", self._fields())
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
+
+ def test_k_on_first_field_wraps_to_save(self):
+ screen = FakeScreen(keys=[ord("k"), 10])
+ result = tui.form(screen, "Settings", self._fields())
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
+
+ def test_k_on_buttons_returns_to_fields(self):
+ # Down to the last field, Down onto Save, k back into the fields;
+ # editing then proves focus left the button row.
+ screen = FakeScreen(keys=[FakeCurses.KEY_DOWN, FakeCurses.KEY_DOWN,
+ ord("k"), 10, ord("x"), 10, 9, 10])
+ result = tui.form(screen, "Settings", self._fields())
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250x"})
+
+ def test_j_on_cancel_returns_to_fields(self):
+ # Up wraps to Save, Left to Cancel, j back into the fields; the
+ # choice editor opening proves focus left the button row.
+ screen = FakeScreen(keys=[FakeCurses.KEY_UP, FakeCurses.KEY_LEFT,
+ ord("j"), 10, 10, 9, 10])
+ result = tui.form(screen, "Settings", self._fields())
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
def test_up_down_on_buttons_returns_to_fields(self):
# Down (last field -> Save), Up returns to the last field, Enter
@@ -484,6 +503,38 @@ class FormTests(TuiTestCase):
with self.assertRaises(ValueError):
tui.form(self.screen, "Settings", [])
+ def test_field_note_renders_and_save(self):
+ fields = self._fields()
+ fields[1]["note"] = "A short section note"
+ screen = FakeScreen(keys=[9, 10])
+ result = tui.form(screen, "Settings", fields)
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
+ self.assert_inside_border(screen)
+
+ def test_highlight_skips_note_rows_to_the_field(self):
+ fields = self._fields()
+ fields[1]["note"] = "A short section note"
+ snapshots = []
+ original_draw = tui.Frame.draw
+
+ def spy(frame):
+ original_draw(frame)
+ snapshots.append((frame.cursor,
+ [row["text"] if row["segments"] is None
+ else "".join(text for text, _ in row["segments"])
+ for row in frame.rows]))
+
+ # Down moves from the first field to the one after the note block.
+ screen = FakeScreen(keys=[FakeCurses.KEY_DOWN, 9, 10])
+ with patch.object(tui.Frame, "draw", spy):
+ result = tui.form(screen, "Settings", fields)
+ self.assertEqual(result, {"fmt": "m4b", "chunk": "250"})
+ cursor, texts = snapshots[1]
+ # The cursor must sit on the Chunk field's own row — not on one
+ # of the blank/note rows inserted above it (the old base+index
+ # math highlighted the blank line).
+ self.assertEqual(texts[cursor], "Chunk: 250")
+
def _accept_audio_cpp(entry: Path):
"""auto_select callback that accepts an 'audio.cpp' checkout root."""