221 lines
6.7 KiB
Python
221 lines
6.7 KiB
Python
#!/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!")
|