"""Tests for duration compensation when source video is shorter than configured duration.""" from pathlib import Path import pytest from apps.worker.video_processing.unified_render_service import ResolvedClip, UnifiedRenderService class TestClipEffectiveDurationWithSpeedCompensation: """Test _clip_effective_duration handles speed < 1 correctly.""" def test_normal_speed_returns_min(self): """When speed=1.0, effective_duration = min(duration, actual_duration).""" clip = ResolvedClip( clip_id="c1", asset_id="a1", local_path=Path("/tmp/fake.mp4"), clip_type="main", order=0, start_time=0.0, duration=4.0, actual_duration=3.0, # shorter than configured playback_speed=1.0, ) # Without speed compensation, effective = min(4, 3) = 3 assert UnifiedRenderService._clip_effective_duration(clip) == 3.0 def test_compensated_speed_returns_configured_duration(self): """When speed < 1 (compensated), effective_duration = configured duration.""" clip = ResolvedClip( clip_id="c1", asset_id="a1", local_path=Path("/tmp/fake.mp4"), clip_type="main", order=0, start_time=0.0, duration=4.0, actual_duration=3.0, # shorter than configured playback_speed=0.75, # compensated: 3/4 = 0.75 ) # With speed compensation, effective = configured duration = 4.0 assert UnifiedRenderService._clip_effective_duration(clip) == 4.0 def test_zero_actual_duration_returns_configured(self): """When actual_duration=0, effective_duration = configured duration.""" clip = ResolvedClip( clip_id="c1", asset_id="a1", local_path=Path("/tmp/fake.mp4"), clip_type="main", order=0, start_time=0.0, duration=4.0, actual_duration=0.0, playback_speed=1.0, ) assert UnifiedRenderService._clip_effective_duration(clip) == 4.0 def test_compensated_speed_with_actual_zero(self): """When speed < 1 and actual=0, still returns configured duration.""" clip = ResolvedClip( clip_id="c1", asset_id="a1", local_path=Path("/tmp/fake.mp4"), clip_type="main", order=0, start_time=0.0, duration=4.0, actual_duration=0.0, playback_speed=0.5, ) assert UnifiedRenderService._clip_effective_duration(clip) == 4.0 class TestClipAdjustedDurationWithSpeedCompensation: """Test _clip_adjusted_duration accounts for compensated speed.""" def test_adjusted_duration_with_compensation(self): """Adjusted duration = min(duration, actual) / speed. With compensation: min(4,3)/0.75 = 3/0.75 = 4.0 This equals the configured duration, which is the goal. """ clip = ResolvedClip( clip_id="c1", asset_id="a1", local_path=Path("/tmp/fake.mp4"), clip_type="main", order=0, start_time=0.0, duration=4.0, actual_duration=3.0, playback_speed=0.75, # compensated ) adjusted = UnifiedRenderService._clip_adjusted_duration(clip) # min(4,3)/0.75 = 3/0.75 = 4.0 (matches configured duration) assert abs(adjusted - 4.0) < 0.01