aboutsummaryrefslogtreecommitdiff
path: root/tests/test_converter.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-08-20 22:38:58 +0000
committerhistoria <historiavg@proton.me>2026-08-20 23:02:09 +0000
commite4b42be01fc031810160126013833175413ec84c (patch)
tree1793b8d060d1272c9f95290599e45e2f1b477ff3 /tests/test_converter.py
parent5ca77f86b70718b4ef1a07299efbd6431268d546 (diff)
downloadtts-audiobook-generator-e4b42be01fc031810160126013833175413ec84c.tar.gz
feat: prompt for overwrites before connecting to TTS server
Diffstat (limited to 'tests/test_converter.py')
-rw-r--r--tests/test_converter.py57
1 files changed, 55 insertions, 2 deletions
diff --git a/tests/test_converter.py b/tests/test_converter.py
index 5ef9785..8402b30 100644
--- a/tests/test_converter.py
+++ b/tests/test_converter.py
@@ -358,9 +358,15 @@ class PromptOverwriteTests(unittest.TestCase):
self.assertFalse(prompt_overwrite([Path("dune.mp3")], "dune"))
def test_invalid_answer_reasked(self):
- with patch("builtins.input", side_effect=["maybe", "", "n"]) as mock_input:
+ with patch("builtins.input", side_effect=["maybe", "n"]) as mock_input:
self.assertFalse(prompt_overwrite([Path("dune.mp3")], "dune"))
- self.assertEqual(mock_input.call_count, 3)
+ self.assertEqual(mock_input.call_count, 2)
+
+ def test_empty_answer_defaults_yes(self):
+ # Pressing Enter (empty input) accepts the default of yes, matching
+ # the make_audiocpp_server_json tool's ask_bool(default=True) prompt.
+ with patch("builtins.input", return_value=""):
+ self.assertTrue(prompt_overwrite([Path("dune.mp3")], "dune"))
def test_eof_keeps_existing_output(self):
with patch("builtins.input", side_effect=EOFError):
@@ -376,6 +382,53 @@ class PromptOverwriteTests(unittest.TestCase):
self.assertIn("overwrite them", prompt_text)
+class PreflightOverwritesTests(unittest.TestCase):
+ """The pre-flight overwrite check runs without a TTS server connection."""
+
+ def setUp(self):
+ self._books_tmp = tempfile.TemporaryDirectory()
+ self._output_tmp = tempfile.TemporaryDirectory()
+ self._original_folders = (converter_mod.BOOKS_FOLDER, converter_mod.AUDIOBOOKS_FOLDER)
+ converter_mod.BOOKS_FOLDER = Path(self._books_tmp.name)
+ converter_mod.AUDIOBOOKS_FOLDER = Path(self._output_tmp.name)
+ (converter_mod.BOOKS_FOLDER / "book.txt").write_text("hello world", encoding="utf-8")
+
+ def tearDown(self):
+ converter_mod.BOOKS_FOLDER, converter_mod.AUDIOBOOKS_FOLDER = self._original_folders
+ self._books_tmp.cleanup()
+ self._output_tmp.cleanup()
+
+ def test_no_books_returns_empty(self):
+ (converter_mod.BOOKS_FOLDER / "book.txt").unlink()
+ with patch("builtins.input", side_effect=AssertionError("should not prompt")):
+ book_files, planned = AudiobookConverter.preflight_overwrites(
+ tts.BACKEND_GRADIO, None, tts.VOICE_MODE_CUSTOM, None, "mp3")
+ self.assertEqual(book_files, [])
+ self.assertEqual(planned, [])
+
+ def test_new_book_planned_without_prompt(self):
+ with patch("builtins.input", side_effect=AssertionError("should not prompt")):
+ book_files, planned = AudiobookConverter.preflight_overwrites(
+ tts.BACKEND_GRADIO, None, tts.VOICE_MODE_CUSTOM, None, "mp3")
+ self.assertEqual(len(book_files), 1)
+ self.assertEqual(planned, [(book_files[0], "book_Vivian")])
+
+ def test_existing_output_enter_defaults_yes(self):
+ (converter_mod.AUDIOBOOKS_FOLDER / "book_Vivian.mp3").write_bytes(b"existing")
+ with patch("builtins.input", return_value=""):
+ book_files, planned = AudiobookConverter.preflight_overwrites(
+ tts.BACKEND_GRADIO, None, tts.VOICE_MODE_CUSTOM, None, "mp3")
+ self.assertEqual(planned, [(book_files[0], "book_Vivian")])
+
+ def test_existing_output_declined_is_skipped(self):
+ (converter_mod.AUDIOBOOKS_FOLDER / "book_Vivian.mp3").write_bytes(b"existing")
+ with patch("builtins.input", return_value="n"):
+ book_files, planned = AudiobookConverter.preflight_overwrites(
+ tts.BACKEND_GRADIO, None, tts.VOICE_MODE_CUSTOM, None, "mp3")
+ self.assertEqual(len(book_files), 1)
+ self.assertEqual(planned, [])
+
+
class RunOverwritePromptTests(unittest.TestCase):
"""The full run() flow: prompts collected before any conversion starts."""