""" 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"])