- 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>
162 lines
6.3 KiB
Python
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"]) |