"""Tests unitaires pour UIDetector.""" import pytest import sys from pathlib import Path from unittest.mock import MagicMock, patch from PIL import Image sys.path.insert(0, str(Path(__file__).parent.parent.parent)) from core.detection.ui_detector import UIDetector, DetectionConfig class TestUIDetector: def setup_method(self): self.detector = UIDetector() def test_detector_initialization(self): assert self.detector is not None class TestVlmModelDehardcode: """Le modèle VLM ne doit plus être codé en dur (gemma4:e4b) dans la config.""" def test_config_no_hardcoded_gemma4(self, monkeypatch): """Sans env, DetectionConfig.vlm_model ne vaut plus le littéral gemma4:e4b.""" monkeypatch.delenv("RPA_VLM_MODEL", raising=False) monkeypatch.delenv("VLM_MODEL", raising=False) cfg = DetectionConfig() assert cfg.vlm_model != "gemma4:e4b" assert not cfg.vlm_model # None ou "" → résolution déléguée à l'init def test_config_respects_env(self, monkeypatch): """RPA_VLM_MODEL est honoré dans la config.""" monkeypatch.setenv("RPA_VLM_MODEL", "mon-modele:test") assert DetectionConfig().vlm_model == "mon-modele:test" def test_initialize_vlm_resolves_lazily(self, monkeypatch): """Sans modèle explicite, _initialize_vlm résout via vlm_config (pas de hardcode).""" monkeypatch.delenv("RPA_VLM_MODEL", raising=False) monkeypatch.delenv("VLM_MODEL", raising=False) captured = {} class FakeClient: def __init__(self, endpoint=None, model=None): captured["model"] = model import core.detection.ui_detector as uidet with patch.object(uidet, "check_ollama_available", return_value=True), \ patch.object(uidet, "OllamaClient", FakeClient), \ patch.object(uidet.vlm_config, "get_vlm_model", return_value="modele-resolu:test"): UIDetector() assert captured["model"] == "modele-resolu:test" if __name__ == '__main__': pytest.main([__file__, '-v'])