from unittest.mock import MagicMock, patch import numpy as np import pytest from bookmark.camera import CameraSource def test_open_raises_when_capture_not_opened(): with patch("bookmark.camera.cv2.VideoCapture") as mock_video_capture: mock_instance = MagicMock() mock_instance.isOpened.return_value = False mock_video_capture.return_value = mock_instance source = CameraSource(device_index=0) with pytest.raises(RuntimeError, match="Could not open camera"): source.open() def test_read_frame_returns_frame_from_capture(): with patch("bookmark.camera.cv2.VideoCapture") as mock_video_capture: mock_instance = MagicMock() mock_instance.isOpened.return_value = True fake_frame = np.zeros((10, 10, 3), dtype=np.uint8) mock_instance.read.return_value = (True, fake_frame) mock_video_capture.return_value = mock_instance source = CameraSource(device_index=0) source.open() frame = source.read_frame() assert frame.shape == (10, 10, 3) def test_read_frame_raises_when_capture_fails(): with patch("bookmark.camera.cv2.VideoCapture") as mock_video_capture: mock_instance = MagicMock() mock_instance.isOpened.return_value = True mock_instance.read.return_value = (False, None) mock_video_capture.return_value = mock_instance source = CameraSource(device_index=0) source.open() with pytest.raises(RuntimeError, match="Failed to read frame"): source.read_frame() def test_read_frame_raises_if_not_opened(): source = CameraSource(device_index=0) with pytest.raises(RuntimeError, match="not opened"): source.read_frame()