Files
rpa_vision_v3/tests/unit/test_screen_state_aliases.py
Dom a27b74cf22 v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- Frontend v4 accessible sur réseau local (192.168.1.40)
- Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard)
- Ollama GPU fonctionnel
- Self-healing interactif
- Dashboard confiance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:23:51 +01:00

155 lines
4.9 KiB
Python

"""
Tests de validation - Fiche #1 : Aliases de compatibilité ScreenState
Auteur: Dom, Alice Kiro - 15 décembre 2024
"""
import pytest
from datetime import datetime
from core.models.screen_state import ScreenState, RawLevel, PerceptionLevel, ContextLevel, WindowContext, EmbeddingRef
def test_screen_state_aliases():
"""Test que les aliases de compatibilité ScreenState fonctionnent"""
# Créer un ScreenState de test complet
screen_state = create_test_screen_state()
# Test alias state_id
assert screen_state.state_id == "test_state_123"
assert screen_state.state_id == screen_state.screen_state_id
# Test alias raw_level
assert screen_state.raw_level is screen_state.raw
# Test alias perception_level
assert screen_state.perception_level is screen_state.perception
# Test alias screenshot_path
assert screen_state.screenshot_path == "/test/screenshot.png"
assert screen_state.screenshot_path == screen_state.raw.screenshot_path
def test_backward_compatibility_with_existing_modules():
"""Test que les modules existants peuvent utiliser les aliases"""
screen_state = create_test_screen_state()
# Simuler l'utilisation dans node_matcher.py
result = simulate_node_matcher_usage(screen_state)
assert result["state_id"] == "test_state_123"
assert result["screenshot_path"] == "/test/screenshot.png"
# Simuler l'utilisation dans error_handler.py
result = simulate_error_handler_usage(screen_state)
assert result["confidence"] == 0.85
assert result["detected_text"] == ["Test Button"]
def test_json_serialization_compatibility():
"""Test que la sérialisation JSON fonctionne avec les nouveaux noms"""
screen_state = create_test_screen_state()
# Sérialiser en JSON
json_data = screen_state.to_json()
# Vérifier que les nouveaux noms de champs sont utilisés
assert "screen_state_id" in json_data
assert "raw" in json_data
assert "perception" in json_data
# Vérifier que les anciens noms ne sont PAS dans le JSON
assert "state_id" not in json_data
assert "raw_level" not in json_data
assert "perception_level" not in json_data
# Désérialiser et vérifier que les aliases fonctionnent
restored_state = ScreenState.from_json(json_data)
assert restored_state.state_id == "test_state_123"
assert restored_state.raw_level is restored_state.raw
assert restored_state.perception_level is restored_state.perception
def test_aliases_are_read_only():
"""Test que les aliases sont en lecture seule (pas d'assignation)"""
screen_state = create_test_screen_state()
# Tenter d'assigner devrait lever une AttributeError
with pytest.raises(AttributeError):
screen_state.state_id = "new_id"
with pytest.raises(AttributeError):
screen_state.raw_level = None
with pytest.raises(AttributeError):
screen_state.perception_level = None
def create_test_screen_state():
"""Créer un ScreenState de test complet"""
# Créer les composants
embedding_ref = EmbeddingRef(
provider="test_provider",
vector_id="test_vector",
dimensions=512
)
raw_level = RawLevel(
screenshot_path="/test/screenshot.png",
capture_method="mss",
file_size_bytes=1024
)
perception_level = PerceptionLevel(
embedding=embedding_ref,
detected_text=["Test Button"],
text_detection_method="qwen_vl",
confidence_avg=0.85
)
context_level = ContextLevel(
current_workflow_candidate="test_workflow",
workflow_step=1,
user_id="test_user",
tags=["test"],
business_variables={"var1": "value1"}
)
window_context = WindowContext(
app_name="TestApp",
window_title="Test Window",
screen_resolution=[1920, 1080],
workspace="main"
)
return ScreenState(
screen_state_id="test_state_123",
timestamp=datetime.now(),
session_id="test_session_456",
window=window_context,
raw=raw_level,
perception=perception_level,
context=context_level,
metadata={"test_key": "test_value"},
ui_elements=[]
)
def simulate_node_matcher_usage(state):
"""Simuler l'utilisation dans node_matcher.py"""
# Simule du code legacy qui utilise les anciens noms de champs
return {
"state_id": state.state_id, # Ancien nom
"screenshot_path": state.screenshot_path, # Alias pratique
}
def simulate_error_handler_usage(state):
"""Simuler l'utilisation dans error_handler.py"""
# Simule l'utilisation dans error_handler
return {
"confidence": state.perception_level.confidence_avg, # Ancien nom
"detected_text": state.perception_level.detected_text,
}
if __name__ == "__main__":
pytest.main([__file__, "-v"])