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>
This commit is contained in:
155
tests/unit/test_screen_state_aliases.py
Normal file
155
tests/unit/test_screen_state_aliases.py
Normal file
@@ -0,0 +1,155 @@
|
||||
"""
|
||||
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"])
|
||||
Reference in New Issue
Block a user