| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- """Unit tests for plate detection service."""
- from unittest.mock import MagicMock, patch
- import pytest
- # Mock cv2 and numpy before importing the module
- cv2_mock = MagicMock()
- np_mock = MagicMock()
- class TestPlateDetectionResult:
- """Tests for PlateDetectionResult class."""
- def test_result_to_dict(self):
- """Verify PlateDetectionResult.to_dict() returns correct structure."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- PlateDetectionResult = pd_module.PlateDetectionResult
- result = PlateDetectionResult(
- is_empty=True,
- confidence=0.95,
- difference_percent=0.5,
- message="Test message",
- debug_image=None,
- needs_calibration=False,
- )
- d = result.to_dict()
- assert d["is_empty"] is True
- assert d["confidence"] == 0.95
- assert d["difference_percent"] == 0.5
- assert d["message"] == "Test message"
- assert d["has_debug_image"] is False
- assert d["needs_calibration"] is False
- def test_result_with_debug_image(self):
- """Verify has_debug_image is True when debug_image is provided."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- PlateDetectionResult = pd_module.PlateDetectionResult
- result = PlateDetectionResult(
- is_empty=False,
- confidence=0.8,
- difference_percent=5.0,
- message="Objects detected",
- debug_image=b"fake_image_data",
- needs_calibration=False,
- )
- d = result.to_dict()
- assert d["has_debug_image"] is True
- def test_result_needs_calibration(self):
- """Verify needs_calibration flag is preserved."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- PlateDetectionResult = pd_module.PlateDetectionResult
- result = PlateDetectionResult(
- is_empty=True,
- confidence=0.0,
- difference_percent=0.0,
- message="No calibration",
- needs_calibration=True,
- )
- d = result.to_dict()
- assert d["needs_calibration"] is True
- class TestPlateDetector:
- """Tests for PlateDetector class."""
- def test_detector_initialization(self):
- """Verify PlateDetector initializes with default values."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- # Re-import to get fresh module
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- # Mock OPENCV_AVAILABLE
- pd_module.OPENCV_AVAILABLE = True
- detector = pd_module.PlateDetector()
- assert detector.roi == (0.15, 0.35, 0.70, 0.55)
- assert detector.difference_threshold == 1.0
- def test_detector_custom_roi(self):
- """Verify PlateDetector accepts custom ROI."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = True
- custom_roi = (0.1, 0.2, 0.8, 0.6)
- detector = pd_module.PlateDetector(roi=custom_roi)
- assert detector.roi == custom_roi
- def test_detector_raises_without_opencv(self):
- """Verify PlateDetector raises when OpenCV not available."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = False
- with pytest.raises(RuntimeError, match="OpenCV is not installed"):
- pd_module.PlateDetector()
- class TestCalibrationStatus:
- """Tests for calibration status functions."""
- def test_get_calibration_status_no_opencv(self):
- """Verify calibration status when OpenCV not available."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = False
- status = pd_module.get_calibration_status(1)
- assert status["available"] is False
- assert status["calibrated"] is False
- assert status["reference_count"] == 0
- assert "OpenCV not available" in status["message"]
- def test_is_plate_detection_available_true(self):
- """Verify is_plate_detection_available returns True when OpenCV available."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = True
- assert pd_module.is_plate_detection_available() is True
- def test_is_plate_detection_available_false(self):
- """Verify is_plate_detection_available returns False when OpenCV not available."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = False
- assert pd_module.is_plate_detection_available() is False
- class TestDeleteCalibration:
- """Tests for delete_calibration function."""
- def test_delete_calibration_no_opencv(self):
- """Verify delete_calibration returns False when OpenCV not available."""
- with patch.dict("sys.modules", {"cv2": cv2_mock, "numpy": np_mock}):
- import importlib
- import backend.app.services.plate_detection as pd_module
- importlib.reload(pd_module)
- pd_module.OPENCV_AVAILABLE = False
- result = pd_module.delete_calibration(1)
- assert result is False
|