diff options
Diffstat (limited to 'app/tests')
| -rw-r--r-- | app/tests/test_hub.py | 6 | ||||
| -rw-r--r-- | app/tests/test_tui.py | 63 |
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.""" |
