Files
rpa_vision_v3/tests/integration/test_imports_regression.py
Dom ad15237fe0 feat: smart systray Léa (plyer), preflight GPU, fix tests, support qwen3-vl
- Smart systray (pystray+plyer) remplace PyQt5 : notifications toast,
  menu dynamique avec workflows, chat "Que dois-je faire ?", icône colorée
- Preflight GPU : check_machine_ready() + @pytest.mark.gpu dans conftest
- Correction 63 tests cassés → 0 failed (1200 passed)
- Tests VWB obsolètes déplacés vers _a_trier/
- Support qwen3-vl:8b sur GPU (remplace qwen2.5vl:3b)
  - fix images < 32x32 (Ollama panic)
  - fix force_json=False (qwen3-vl incompatible)
  - fix temperature 0.1 (0.0 bloque avec images)
- Fix captor Windows : Key.esc, _get_key_name()
- Fix LeaServerClient : check_connection, list_workflows format
- deploy_windows.py : packaging propre client Windows
- VWB : edges visibles (#607d8b) + fitView automatique

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:25:12 +01:00

162 lines
6.3 KiB
Python

"""
Tests de régression pour s'assurer que les corrections d'imports
n'ont pas cassé les fonctionnalités existantes.
Auteur: Dom, Alice Kiro
Date: 20 décembre 2024
"""
import pytest
import sys
from pathlib import Path
# Ajouter le répertoire racine au path
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
class TestImportsRegression:
"""Tests de régression pour les imports"""
def test_basic_models_still_work(self):
"""Test que les modèles de base fonctionnent encore"""
from core.models import RawSession, ScreenState, UIElement
from datetime import datetime
# Test création d'objets de base
from core.models.screen_state import WindowContext, RawLevel, PerceptionLevel, ContextLevel, EmbeddingRef
window = WindowContext(app_name='test', window_title='test', screen_resolution=[1920, 1080])
raw = RawLevel(screenshot_path='test.png', capture_method='test', file_size_bytes=1024)
embedding_ref = EmbeddingRef(provider='test', vector_id='test.npy', dimensions=512)
perception = PerceptionLevel(
embedding=embedding_ref,
detected_text=['test'],
text_detection_method='test',
confidence_avg=0.9
)
context = ContextLevel()
screen_state = ScreenState(
screen_state_id='test_123',
timestamp=datetime.now(),
session_id='session_123',
window=window,
raw=raw,
perception=perception,
context=context
)
# Vérifier que les alias fonctionnent
assert screen_state.state_id == 'test_123'
assert screen_state.raw_level == raw
assert screen_state.perception_level == perception
def test_lazy_imports_work(self):
"""Test que les lazy imports fonctionnent"""
from core.models import get_workflow, get_action, get_target_spec
Workflow = get_workflow()
Action = get_action()
TargetSpec = get_target_spec()
# Vérifier que ce sont les bonnes classes
assert Workflow.__name__ == 'Workflow'
assert Action.__name__ == 'Action'
assert TargetSpec.__name__ == 'TargetSpec'
# Test création d'objets
target_spec = TargetSpec(by_role='button', by_text='Test Button')
action = Action(type='mouse_click', target=target_spec)
assert action.type == 'mouse_click'
assert action.target.by_role == 'button'
def test_storage_manager_works(self):
"""Test que StorageManager fonctionne encore"""
from core.persistence.storage_manager import StorageManager
storage = StorageManager()
assert storage is not None
# Test que les méthodes existent
assert hasattr(storage, 'save_workflow')
assert hasattr(storage, 'load_workflow')
assert hasattr(storage, 'list_workflows')
def test_interfaces_available(self):
"""Test que les interfaces abstraites sont disponibles"""
from core.interfaces import ITargetResolver, IActionExecutor, IErrorHandler
# Vérifier qu'elles sont abstraites
assert hasattr(ITargetResolver, '__abstractmethods__')
assert hasattr(IActionExecutor, '__abstractmethods__')
assert hasattr(IErrorHandler, '__abstractmethods__')
# Vérifier qu'on ne peut pas les instancier
with pytest.raises(TypeError):
ITargetResolver()
with pytest.raises(TypeError):
IActionExecutor()
with pytest.raises(TypeError):
IErrorHandler()
def test_type_checking_works(self):
"""Test que TYPE_CHECKING fonctionne correctement"""
import core.models as models
# Les types workflow_graph ne sont pas importés directement au niveau module,
# mais sont disponibles via __getattr__ (lazy loading). Vérifier que
# les noms ne sont PAS dans le namespace direct du module (vars()),
# mais sont accessibles via __getattr__ pour le lazy loading.
module_vars = vars(models)
assert 'Workflow' not in module_vars, "Workflow ne devrait pas être dans les attributs directs du module"
assert 'Action' not in module_vars, "Action ne devrait pas être dans les attributs directs du module"
assert 'TargetSpec' not in module_vars, "TargetSpec ne devrait pas être dans les attributs directs du module"
# Les lazy imports explicites devraient être disponibles
assert hasattr(models, 'get_workflow')
assert hasattr(models, 'get_action')
assert hasattr(models, 'get_target_spec')
# Le lazy loading via __getattr__ doit fonctionner
Workflow = models.Workflow
assert Workflow.__name__ == 'Workflow'
def test_existing_imports_still_work(self):
"""Test que les imports existants dans d'autres modules fonctionnent"""
# Ces imports directs devraient encore fonctionner
from core.models.workflow_graph import Workflow, Action, TargetSpec
from core.models.screen_state import ScreenState
from core.models.ui_element import UIElement
# Vérifier que ce sont les bonnes classes
assert Workflow.__name__ == 'Workflow'
assert Action.__name__ == 'Action'
assert TargetSpec.__name__ == 'TargetSpec'
assert ScreenState.__name__ == 'ScreenState'
assert UIElement.__name__ == 'UIElement'
def test_serialization_still_works(self):
"""Test que la sérialisation/désérialisation fonctionne encore"""
from core.models import get_action, get_target_spec
Action = get_action()
TargetSpec = get_target_spec()
# Créer un objet
target_spec = TargetSpec(by_role='button', by_text='Test Button')
action = Action(type='mouse_click', target=target_spec)
# Sérialiser
action_dict = action.to_dict()
assert action_dict['type'] == 'mouse_click'
assert action_dict['target']['by_role'] == 'button'
# Désérialiser
action_restored = Action.from_dict(action_dict)
assert action_restored.type == 'mouse_click'
assert action_restored.target.by_role == 'button'
if __name__ == "__main__":
pytest.main([__file__, "-v"])