- 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>
155 lines
4.9 KiB
Python
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"]) |