#!/usr/bin/env python3 """ Test simple des utilitaires d'entrée sans exécution réelle """ import sys from pathlib import Path from unittest.mock import Mock, patch, MagicMock # Ajouter le répertoire au path sys.path.insert(0, str(Path(__file__).parent)) print("Test des Utilitaires d'Entrée RPA Vision V2") print("=" * 60) # Test 1: Vérifier que le fichier existe et peut être importé print("\n1. Vérification du fichier input_utils.py...") input_utils_file = Path("geniusia2/core/utils/input_utils.py") if input_utils_file.exists(): print(f" ✓ Fichier trouvé: {input_utils_file}") with open(input_utils_file, 'r') as f: content = f.read() print(f" ✓ Taille du fichier: {len(content)} caractères") print(f" ✓ Nombre de lignes: {len(content.splitlines())}") else: print(f" ✗ Fichier non trouvé: {input_utils_file}") sys.exit(1) # Test 2: Vérifier la présence des classes et méthodes print("\n2. Vérification des classes et méthodes...") required_items = [ "class ActionType", "class InputUtils", "def click(", "def type_text(", "def scroll(", "def wait(", "def move(", "def drag(", "def get_inverse_action(", "def execute_inverse_action(", "def execute_action(", "def get_action_history(", "def clear_history(", ] for item in required_items: if item in content: print(f" ✓ {item}") else: print(f" ✗ {item} - MANQUANT") # Test 3: Vérifier les imports print("\n3. Vérification des imports...") required_imports = [ "import time", "import pyautogui", "from typing import", "from enum import Enum", "from ..logger import Logger", ] for imp in required_imports: if imp in content: print(f" ✓ {imp}") else: print(f" ✗ {imp} - MANQUANT") # Test 4: Vérifier les types d'actions print("\n4. Vérification des types d'actions...") action_types = [ 'CLICK = "click"', 'TYPE = "type"', 'SCROLL = "scroll"', 'WAIT = "wait"', 'MOVE = "move"', 'DRAG = "drag"', ] for action_type in action_types: if action_type in content: print(f" ✓ {action_type}") else: print(f" ✗ {action_type} - MANQUANT") # Test 5: Vérifier les fonctionnalités de sécurité print("\n5. Vérification des fonctionnalités de sécurité...") security_features = [ "pyautogui.FAILSAFE = True", "action_history", "self.logger.log_action", ] for feature in security_features: if feature in content: print(f" ✓ {feature}") else: print(f" ✗ {feature} - MANQUANT") # Test 6: Vérifier le support AZERTY print("\n6. Vérification du support AZERTY...") azerty_features = [ "azerty_mapping", "use_azerty", "_convert_to_azerty", ] for feature in azerty_features: if feature in content: print(f" ✓ {feature}") else: print(f" ✗ {feature} - MANQUANT") # Test 7: Vérifier le support de rollback print("\n7. Vérification du support de rollback...") rollback_features = [ "get_inverse_action", "execute_inverse_action", "previous_position", ] for feature in rollback_features: if feature in content: print(f" ✓ {feature}") else: print(f" ✗ {feature} - MANQUANT") # Test 8: Test d'import avec mock print("\n8. Test d'import avec mock...") try: # Mock pyautogui pour éviter les dépendances with patch.dict('sys.modules', {'pyautogui': MagicMock()}): from geniusia2.core.utils.input_utils import InputUtils, ActionType print(" ✓ Import réussi") # Vérifier ActionType print(f" ✓ ActionType.CLICK = {ActionType.CLICK.value}") print(f" ✓ ActionType.TYPE = {ActionType.TYPE.value}") print(f" ✓ ActionType.SCROLL = {ActionType.SCROLL.value}") except Exception as e: print(f" ✗ Erreur d'import: {e}") # Test 9: Test de création d'instance (avec mocks) print("\n9. Test de création d'instance...") try: with patch.dict('sys.modules', {'pyautogui': MagicMock()}): from geniusia2.core.utils.input_utils import InputUtils from geniusia2.core.logger import Logger # Créer un logger mock mock_logger = Mock(spec=Logger) mock_logger.log_action = Mock() # Créer une config mock mock_config = { "input": { "pause_between_actions": 0.1 } } # Créer l'instance input_utils = InputUtils(mock_logger, mock_config) print(" ✓ Instance créée") print(f" ✓ Historique initialisé: {len(input_utils.action_history)} actions") print(f" ✓ Logger configuré") except Exception as e: print(f" ✗ Erreur de création: {e}") import traceback traceback.print_exc() # Test 10: Statistiques du code print("\n10. Statistiques du code...") lines = content.splitlines() code_lines = [l for l in lines if l.strip() and not l.strip().startswith('#')] comment_lines = [l for l in lines if l.strip().startswith('#')] docstring_lines = len([l for l in lines if '"""' in l or "'''" in l]) print(f" ✓ Total de lignes: {len(lines)}") print(f" ✓ Lignes de code: {len(code_lines)}") print(f" ✓ Lignes de commentaires: {len(comment_lines)}") print(f" ✓ Docstrings: ~{docstring_lines} blocs") # Test 11: Vérifier la conformité aux exigences print("\n11. Vérification de conformité aux exigences...") requirements = [ ("Actions souris (clic, déplacement)", "def click(" in content and "def move(" in content), ("Saisie texte avec support AZERTY", "def type_text(" in content and "azerty" in content.lower()), ("Défilement", "def scroll(" in content), ("Actions inverses pour rollback", "def get_inverse_action(" in content), ("Historique des actions", "action_history" in content), ("Logging de toutes les opérations", "self.logger.log_action" in content), ("Gestion d'erreurs", "try:" in content and "except" in content), ] all_requirements_met = True for requirement, met in requirements: status = "✓" if met else "✗" print(f" {status} {requirement}") if not met: all_requirements_met = False print("\n" + "=" * 60) if all_requirements_met: print("✓ TOUS LES TESTS RÉUSSIS!") print("✓ Les utilitaires d'entrée sont correctement implémentés.") else: print("⚠ Certaines exigences ne sont pas remplies.") print("\nRésumé:") print(f" - Fichier: {input_utils_file}") print(f" - Taille: {len(content)} caractères") print(f" - Lignes: {len(lines)}") print(f" - Classes: ActionType, InputUtils") print(f" - Méthodes principales: {len([m for m in required_items if m in content])}/{len(required_items)}") print("\n✓ Tests de validation terminés!")