first try new approach
This commit is contained in:
@@ -22,7 +22,7 @@ class TestInit:
|
||||
assert manager.session_id == "test_session"
|
||||
|
||||
def test_recording_path(self, manager):
|
||||
assert manager.recording_path.name == "recording.mkv"
|
||||
assert manager.recording_path.name == "recording_000.mp4"
|
||||
|
||||
def test_dirs_not_created_on_init(self, manager):
|
||||
assert not manager.stream_dir.exists()
|
||||
@@ -37,17 +37,6 @@ class TestSetupDirs:
|
||||
assert manager.agent_dir.is_dir()
|
||||
|
||||
|
||||
class TestStartRecorder:
|
||||
@patch("cht.stream.manager.ff.run_async")
|
||||
@patch("cht.stream.manager.ff.receive_and_record")
|
||||
def test_starts_ffmpeg(self, mock_record, mock_async, manager):
|
||||
manager.setup_dirs()
|
||||
mock_record.return_value = MagicMock()
|
||||
manager.start_recorder()
|
||||
mock_record.assert_called_once_with(manager.stream_url, manager.recording_path)
|
||||
assert "recorder" in manager._procs
|
||||
|
||||
|
||||
class TestStopAll:
|
||||
@patch("cht.stream.manager.ff.stop_proc")
|
||||
def test_stops_all_procs(self, mock_stop, manager):
|
||||
@@ -62,41 +51,44 @@ class TestStopAll:
|
||||
assert "stop" in manager._stop_flags
|
||||
|
||||
|
||||
class TestDetectScenes:
|
||||
@patch("cht.stream.manager.ff.extract_scene_frames")
|
||||
def test_returns_new_frames(self, mock_extract, manager):
|
||||
class TestFrameIndex:
|
||||
def test_next_frame_number_empty(self, manager):
|
||||
manager.setup_dirs()
|
||||
rec = manager.recording_path
|
||||
rec.touch()
|
||||
assert manager._next_frame_number() == 1
|
||||
|
||||
def create_frame(*args, **kwargs):
|
||||
(manager.frames_dir / "F0001.jpg").touch()
|
||||
return ("", "[Parsed_showinfo_1 @ 0x1] n:0 pts:100 pts_time:10.5 stuff\n")
|
||||
|
||||
mock_extract.side_effect = create_frame
|
||||
|
||||
frames = manager._detect_scenes(start_time=0, end_time=15, start_number=1)
|
||||
assert len(frames) == 1
|
||||
assert frames[0]["id"] == "F0001"
|
||||
assert frames[0]["timestamp"] == 10.5
|
||||
|
||||
@patch("cht.stream.manager.ff.extract_scene_frames")
|
||||
def test_passes_duration(self, mock_extract, manager):
|
||||
def test_next_frame_number_with_existing(self, manager):
|
||||
manager.setup_dirs()
|
||||
manager.recording_path.touch()
|
||||
mock_extract.return_value = ("", "")
|
||||
index = [{"id": "F0001"}, {"id": "F0002"}]
|
||||
(manager.frames_dir / "index.json").write_text(json.dumps(index))
|
||||
assert manager._next_frame_number() == 3
|
||||
|
||||
manager._detect_scenes(start_time=10, end_time=25, start_number=1)
|
||||
|
||||
call_kwargs = mock_extract.call_args
|
||||
assert call_kwargs.kwargs["start_time"] == 10
|
||||
assert call_kwargs.kwargs["duration"] == 15
|
||||
|
||||
@patch("cht.stream.manager.ff.extract_scene_frames")
|
||||
def test_handles_failure(self, mock_extract, manager):
|
||||
def test_append_frame_index(self, manager):
|
||||
manager.setup_dirs()
|
||||
manager.recording_path.touch()
|
||||
mock_extract.side_effect = RuntimeError("boom")
|
||||
entry = {"id": "F0001", "timestamp": 5.0, "path": "/tmp/F0001.jpg", "sent_to_agent": False}
|
||||
manager._append_frame_index(entry)
|
||||
index = json.loads((manager.frames_dir / "index.json").read_text())
|
||||
assert len(index) == 1
|
||||
assert index[0]["id"] == "F0001"
|
||||
|
||||
frames = manager._detect_scenes(start_time=0, end_time=10, start_number=1)
|
||||
assert frames == []
|
||||
def test_append_frame_index_accumulates(self, manager):
|
||||
manager.setup_dirs()
|
||||
for i in range(3):
|
||||
entry = {"id": f"F{i+1:04d}", "timestamp": float(i), "path": f"/tmp/F{i+1:04d}.jpg", "sent_to_agent": False}
|
||||
manager._append_frame_index(entry)
|
||||
index = json.loads((manager.frames_dir / "index.json").read_text())
|
||||
assert len(index) == 3
|
||||
|
||||
|
||||
class TestSceneDetector:
|
||||
def test_start_scene_detector_stores_callback(self, manager):
|
||||
cb = MagicMock()
|
||||
manager.start_scene_detector(on_new_frames=cb)
|
||||
assert manager._on_new_frames is cb
|
||||
|
||||
def test_update_scene_threshold(self, manager):
|
||||
manager.setup_dirs()
|
||||
# Mock restart_recorder to avoid launching ffmpeg
|
||||
manager.restart_recorder = MagicMock()
|
||||
manager.update_scene_threshold(0.25)
|
||||
assert manager.scene_threshold == 0.25
|
||||
manager.restart_recorder.assert_called_once()
|
||||
|
||||
Reference in New Issue
Block a user