from decimal import Decimal import pytest from voice_transcriptor.services.chunking import ( calculate_chunk_boundaries, source_timestamp, total_chunk_duration, ) @pytest.mark.parametrize( ("total", "chunk", "overlap", "expected"), [ ("600", "900", "15", [("0", "600")]), ("900", "900", "15", [("0", "900")]), ("1800", "900", "15", [("0", "900"), ("885", "1785"), ("1770", "1800")]), ("901.25", "900", "15", [("0", "900"), ("885", "901.25")]), ("1800", "900", "0", [("0", "900"), ("900", "1800")]), ], ) def test_chunk_boundaries_keep_context_and_exact_final_end( total: str, chunk: str, overlap: str, expected: list[tuple[str, str]] ) -> None: boundaries = calculate_chunk_boundaries(total, chunk, overlap) assert [(str(item.start_seconds), str(item.end_seconds)) for item in boundaries] == expected def test_overlap_is_included_in_total_generated_audio_duration() -> None: boundaries = calculate_chunk_boundaries("1800", "900", "15") assert total_chunk_duration(boundaries) == Decimal("1830") def test_local_timestamp_maps_to_exact_source_offset() -> None: boundary = calculate_chunk_boundaries("1800", "900", "15")[1] assert source_timestamp(boundary, "12.5") == Decimal("897.5") def test_many_hour_recording_ends_exactly_at_source_duration() -> None: boundaries = calculate_chunk_boundaries("28800.125", "900", "15") assert boundaries[-1].end_seconds == Decimal("28800.125") @pytest.mark.parametrize( ("total", "chunk", "overlap"), [("0", "900", "15"), ("10", "0", "0"), ("10", "10", "10"), ("10", "10", "-1")], ) def test_invalid_chunk_configuration_is_rejected(total: str, chunk: str, overlap: str) -> None: with pytest.raises(ValueError): calculate_chunk_boundaries(total, chunk, overlap)