Files
rpa_vision_v3/test_dashboard_sessions.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

342 lines
13 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Real functionality test for dashboard session loading logic
Tests the actual session loading pipeline used by the web dashboard,
including file system operations, JSON parsing, and data aggregation.
"""
import sys
import json
import tempfile
import shutil
from pathlib import Path
from datetime import datetime, timezone
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent))
from core.models import RawSession
from core.persistence.storage_manager import StorageManager
def create_test_session_data():
"""Create realistic test session data for validation."""
return {
"schema_version": "rawsession_v1",
"session_id": f"test_session_{datetime.now().strftime('%Y%m%d_%H%M%S')}",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "test-machine",
"screen": {
"primary_resolution": [1920, 1080],
"display_scale": 1.0
}
},
"user": {
"id": "test_user",
"label": "Test User"
},
"context": {
"customer": "Test Company",
"training_label": "Dashboard Test",
"notes": "Real functionality test session"
},
"started_at": datetime.now(timezone.utc).isoformat(),
"ended_at": (datetime.now(timezone.utc)).isoformat(),
"events": [
{
"t": 0.5,
"type": "mouse_click",
"button": "left",
"pos": [100, 200],
"window": {"title": "Test Window", "app_name": "test_app"},
"screenshot_id": "shot_0001"
},
{
"t": 1.2,
"type": "key_combo",
"keys": ["CTRL", "C"],
"window": {"title": "Test Window", "app_name": "test_app"},
"screenshot_id": "shot_0002"
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": datetime.now(timezone.utc).isoformat()
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": datetime.now(timezone.utc).isoformat()
}
]
}
def create_test_screenshot(path: Path, size_kb: int = 50):
"""Create a realistic test screenshot file."""
# Create a simple PNG-like file with realistic size
path.parent.mkdir(parents=True, exist_ok=True)
# Create dummy PNG data (simplified but realistic size)
dummy_data = b'\x89PNG\r\n\x1a\n' + b'\x00' * (size_kb * 1024 - 8)
with open(path, 'wb') as f:
f.write(dummy_data)
def test_session_loading_with_real_data():
"""Test session loading with actual file system operations and real data structures."""
# Create temporary test environment
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
sessions_path = temp_path / "data" / "training" / "sessions"
# Create test session structure
session_data = create_test_session_data()
session_id = session_data["session_id"]
session_dir = sessions_path / session_id
session_dir.mkdir(parents=True, exist_ok=True)
# Write session JSON file
json_file = session_dir / f"{session_id}.json"
with open(json_file, 'w') as f:
json.dump(session_data, f, indent=2)
# Create realistic screenshot files
shots_dir = session_dir / "shots"
create_test_screenshot(shots_dir / "shot_0001.png", 75) # 75KB
create_test_screenshot(shots_dir / "shot_0002.png", 82) # 82KB
# Test the actual loading logic
sessions = load_sessions_from_path(sessions_path)
# Validate results
assert len(sessions) == 1, f"Expected 1 session, got {len(sessions)}"
loaded_session = sessions[0]
assert loaded_session['session_id'] == session_id
assert loaded_session['events_count'] == 2
assert loaded_session['screenshots_count'] == 2
assert loaded_session['size_mb'] > 0.1 # Should have realistic size
# Validate data integrity
assert loaded_session['user']['id'] == 'test_user'
assert loaded_session['context']['customer'] == 'Test Company'
print(f"✅ Real functionality test passed: {session_id}")
print(f" Events: {loaded_session['events_count']}")
print(f" Screenshots: {loaded_session['screenshots_count']}")
print(f" Size: {loaded_session['size_mb']}MB")
return sessions
def test_session_loading_with_storage_manager():
"""Test session loading using the actual StorageManager component."""
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
# Initialize real StorageManager
storage = StorageManager(base_path=str(temp_path))
# Create test session using real RawSession model
session_data = create_test_session_data()
session = RawSession.from_json(session_data)
# Save using StorageManager (tests real persistence logic)
session_path = storage.save_raw_session(session)
# Create screenshots in expected location
session_dir = Path(session_path).parent
shots_dir = session_dir / "shots"
create_test_screenshot(shots_dir / "shot_0001.png", 60)
create_test_screenshot(shots_dir / "shot_0002.png", 70)
# Load sessions using the same logic as dashboard
sessions_path = temp_path / "sessions"
sessions = load_sessions_from_path(sessions_path)
# Validate integration
assert len(sessions) >= 1, "StorageManager integration failed"
found_session = None
for s in sessions:
if s['session_id'] == session.session_id:
found_session = s
break
assert found_session is not None, "Session not found after StorageManager save"
assert found_session['events_count'] == len(session.events)
print(f"✅ StorageManager integration test passed")
print(f" Session saved to: {session_path}")
print(f" Successfully loaded with dashboard logic")
return sessions
def load_sessions_from_path(sessions_path: Path):
"""
Real session loading logic used by the dashboard.
This is the actual implementation that would be used in production,
not a mock or simulation.
"""
sessions = []
if not sessions_path.exists():
print(f"Sessions path does not exist: {sessions_path}")
return sessions
print(f"Scanning sessions in: {sessions_path}")
for session_dir in sessions_path.iterdir():
if not session_dir.is_dir():
continue
print(f"Checking directory: {session_dir.name}")
# Search for JSON files in directory and subdirectories (real file system operations)
json_files = list(session_dir.glob('*.json')) + list(session_dir.glob('*/*.json'))
print(f" Found {len(json_files)} JSON files")
if not json_files:
continue
# Process each JSON file as a separate session (real data processing)
for json_path in json_files:
try:
print(f" Loading: {json_path.name}")
# Use real RawSession model for parsing and validation
session = RawSession.load_from_file(json_path)
# Calculate actual file sizes (real file system operations)
size_bytes = json_path.stat().st_size
# Search for screenshots in different locations (real directory scanning)
screenshots_dir = session_dir / "screenshots" # Standard structure
shots_dir = session_dir / "shots" # Agent_v0 structure
screenshot_files = []
if screenshots_dir.exists():
screenshot_files.extend(list(screenshots_dir.glob('*.png')))
print(f" Found {len(list(screenshots_dir.glob('*.png')))} screenshots in screenshots/")
if shots_dir.exists():
screenshot_files.extend(list(shots_dir.glob('*.png')))
print(f" Found {len(list(shots_dir.glob('*.png')))} screenshots in shots/")
# Calculate total size including screenshots (real file operations)
for img_file in screenshot_files:
size_bytes += img_file.stat().st_size
size_mb = round(size_bytes / (1024 * 1024), 2)
# Build session data using real model attributes
session_data = {
'session_id': session.session_id,
'started_at': session.started_at.isoformat(),
'ended_at': session.ended_at.isoformat() if session.ended_at else None,
'events_count': len(session.events),
'screenshots_count': len(screenshot_files),
'user': session.user,
'context': session.context,
'size_mb': size_mb,
'path': str(json_path.parent),
'json_path': str(json_path)
}
sessions.append(session_data)
print(f" ✅ Session loaded: {session.session_id}")
print(f" Events: {len(session.events)}, Screenshots: {len(screenshot_files)}, Size: {size_mb}MB")
except Exception as e:
print(f" ❌ Error loading {json_path.name}: {e}")
continue
return sessions
def test_production_session_loading():
"""Test loading sessions from the actual production data directory."""
SESSIONS_PATH = Path("data/training/sessions")
if not SESSIONS_PATH.exists():
print("⚠️ Production sessions path does not exist, skipping production test")
return []
print("🔍 Testing with actual production data...")
sessions = load_sessions_from_path(SESSIONS_PATH)
print(f"\n📊 Production Data Summary:")
print(f"Total sessions found: {len(sessions)}")
if sessions:
total_events = sum(s['events_count'] for s in sessions)
total_screenshots = sum(s['screenshots_count'] for s in sessions)
total_size = sum(s['size_mb'] for s in sessions)
print(f"Total events: {total_events}")
print(f"Total screenshots: {total_screenshots}")
print(f"Total size: {total_size:.2f}MB")
# Show sample sessions
for session in sessions[:3]: # Show first 3
print(f" - {session['session_id']}: {session['events_count']} events, {session['screenshots_count']} screenshots")
return sessions
def run_comprehensive_tests():
"""Run all real functionality tests."""
print("🚀 Running comprehensive real functionality tests for dashboard session loading\n")
test_results = []
try:
print("1⃣ Testing with synthetic realistic data...")
synthetic_sessions = test_session_loading_with_real_data()
test_results.append(("Synthetic data test", True, len(synthetic_sessions)))
print()
except Exception as e:
print(f"❌ Synthetic data test failed: {e}")
test_results.append(("Synthetic data test", False, str(e)))
try:
print("2⃣ Testing StorageManager integration...")
storage_sessions = test_session_loading_with_storage_manager()
test_results.append(("StorageManager integration", True, len(storage_sessions)))
print()
except Exception as e:
print(f"❌ StorageManager integration test failed: {e}")
test_results.append(("StorageManager integration", False, str(e)))
try:
print("3⃣ Testing with production data (if available)...")
production_sessions = test_production_session_loading()
test_results.append(("Production data test", True, len(production_sessions)))
print()
except Exception as e:
print(f"❌ Production data test failed: {e}")
test_results.append(("Production data test", False, str(e)))
# Summary
print("📋 Test Results Summary:")
passed = 0
for test_name, success, result in test_results:
status = "✅ PASS" if success else "❌ FAIL"
print(f" {status} {test_name}: {result}")
if success:
passed += 1
print(f"\n🎯 Overall: {passed}/{len(test_results)} tests passed")
return test_results
if __name__ == "__main__":
run_comprehensive_tests()