aboutsummaryrefslogtreecommitdiff
path: root/tests/test_audio.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-08-20 23:50:37 -0400
committerhistoria <historiavg@proton.me>2026-08-20 23:50:37 -0400
commit38c8fdcba7ce54ad0ad76be9ef0748df1c55ebc1 (patch)
tree911e031ee0e4b902fcd3954df3838a920416e8a3 /tests/test_audio.py
parent5c3df0a434059bd0d541bda35a51e49e3c44dd55 (diff)
downloadtts-audiobook-generator-38c8fdcba7ce54ad0ad76be9ef0748df1c55ebc1.tar.gz
feat: make_audiocpp_server_json.py takes an argument. remove chunk wording with audiocpp backend.
Diffstat (limited to 'tests/test_audio.py')
-rw-r--r--tests/test_audio.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/tests/test_audio.py b/tests/test_audio.py
index c127311..ef5e92a 100644
--- a/tests/test_audio.py
+++ b/tests/test_audio.py
@@ -1,11 +1,13 @@
"""Tests for audio helpers: speed parameters, chunk cleanup, encoding,
command construction, duration verification, and audio concatenation."""
+import io
import tempfile
import unittest
import wave
+from contextlib import redirect_stdout
from pathlib import Path
-from unittest.mock import patch
+from unittest.mock import MagicMock, patch
from converter import audio
from converter import config
@@ -470,5 +472,53 @@ class ConcatAudioFilesTests(unittest.TestCase):
self.assertIn("ffmpeg", str(ctx.exception))
+class CombineChunksPrintTests(unittest.TestCase):
+ """Single-request runs (audiocpp whole-chapter) omit the chunks suffix."""
+
+ def setUp(self):
+ self._tmp = tempfile.TemporaryDirectory()
+ self._chunks = patch.object(audio, "CHUNKS_FOLDER", Path(self._tmp.name))
+ self._chunks.start()
+ self.addCleanup(self._chunks.stop)
+
+ def _combine(self, total_chunks, chunk_results, intermediate=False):
+ buf = io.StringIO()
+ with patch.object(audio.shutil, "which", return_value="/usr/bin/ffmpeg"), \
+ patch.object(audio, "atempo_filters", return_value=False), \
+ patch.object(audio, "build_concat_command",
+ return_value=["ffmpeg"]), \
+ patch.object(audio.subprocess, "run",
+ return_value=MagicMock(returncode=0)), \
+ patch.object(audio, "probe_duration_ms", return_value=1000), \
+ patch.object(audio, "verify_output_duration",
+ return_value=True), \
+ redirect_stdout(buf):
+ ok = audio.combine_chunks(
+ total_chunks, Path("out.m4b"), chunk_results,
+ output_format="m4b", intermediate=intermediate)
+ self.assertTrue(ok)
+ return buf.getvalue()
+
+ def test_single_chunk_omits_chunks_suffix(self):
+ chunk = Path(self._tmp.name) / "chunk_0001.wav"
+ chunk.write_bytes(b"x")
+ out = self._combine(1, {1: chunk})
+ self.assertEqual(out.strip(), "[INFO] Saved audiobook: out.m4b")
+
+ def test_multi_chunk_keeps_chunks_suffix(self):
+ chunk = Path(self._tmp.name) / "chunk_0001.wav"
+ chunk.write_bytes(b"x")
+ out = self._combine(1, {1: chunk}, intermediate=True)
+ self.assertEqual(out.strip(),
+ "[INFO] Saved chapter audio (intermediate): out.m4b")
+
+ def test_partial_chunk_run_keeps_chunks_suffix(self):
+ chunk = Path(self._tmp.name) / "chunk_0001.wav"
+ chunk.write_bytes(b"x")
+ out = self._combine(2, {1: chunk, 2: chunk})
+ self.assertEqual(out.strip(),
+ "[INFO] Saved audiobook: out.m4b (2/2 chunks)")
+
+
if __name__ == "__main__":
unittest.main()