dynamic dashboard initial
This commit is contained in:
210
tools/test_dashboard.py
Normal file
210
tools/test_dashboard.py
Normal file
@@ -0,0 +1,210 @@
|
||||
"""
|
||||
Acceptance tests for Dashboard Route.
|
||||
|
||||
Tests:
|
||||
1. GET /dashboard loads without errors
|
||||
2. Rooms are shown in layout.yaml order
|
||||
3. Devices within each room are sorted by rank (ascending)
|
||||
4. GET / redirects to dashboard
|
||||
"""
|
||||
import sys
|
||||
import httpx
|
||||
|
||||
|
||||
def test_dashboard_loads():
|
||||
"""Test 1: Dashboard loads without errors."""
|
||||
print("Test 1: Dashboard loads")
|
||||
print("-" * 60)
|
||||
|
||||
try:
|
||||
response = httpx.get("http://localhost:8002/dashboard", timeout=5.0)
|
||||
response.raise_for_status()
|
||||
|
||||
html = response.text
|
||||
|
||||
# Check for essential elements
|
||||
if "Home Automation" not in html:
|
||||
print(" ✗ FAILED: Missing title 'Home Automation'")
|
||||
return False
|
||||
|
||||
if "Wohnzimmer" not in html:
|
||||
print(" ✗ FAILED: Missing room 'Wohnzimmer'")
|
||||
return False
|
||||
|
||||
if "Schlafzimmer" not in html:
|
||||
print(" ✗ FAILED: Missing room 'Schlafzimmer'")
|
||||
return False
|
||||
|
||||
print(" ✓ Dashboard loads successfully")
|
||||
print(" ✓ Contains expected rooms")
|
||||
print()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f" ✗ FAILED: {e}")
|
||||
print()
|
||||
return False
|
||||
|
||||
|
||||
def test_room_order():
|
||||
"""Test 2: Rooms appear in layout.yaml order."""
|
||||
print("Test 2: Room order matches layout.yaml")
|
||||
print("-" * 60)
|
||||
|
||||
try:
|
||||
response = httpx.get("http://localhost:8002/dashboard", timeout=5.0)
|
||||
response.raise_for_status()
|
||||
|
||||
html = response.text
|
||||
|
||||
# Find positions of room titles
|
||||
wohnzimmer_pos = html.find('class="room-title">Wohnzimmer<')
|
||||
schlafzimmer_pos = html.find('class="room-title">Schlafzimmer<')
|
||||
|
||||
if wohnzimmer_pos == -1:
|
||||
print(" ✗ FAILED: Room 'Wohnzimmer' not found")
|
||||
return False
|
||||
|
||||
if schlafzimmer_pos == -1:
|
||||
print(" ✗ FAILED: Room 'Schlafzimmer' not found")
|
||||
return False
|
||||
|
||||
# Wohnzimmer should appear before Schlafzimmer
|
||||
if wohnzimmer_pos > schlafzimmer_pos:
|
||||
print(" ✗ FAILED: Room order incorrect")
|
||||
print(f" Wohnzimmer at position {wohnzimmer_pos}")
|
||||
print(f" Schlafzimmer at position {schlafzimmer_pos}")
|
||||
return False
|
||||
|
||||
print(" ✓ Rooms appear in correct order:")
|
||||
print(" 1. Wohnzimmer")
|
||||
print(" 2. Schlafzimmer")
|
||||
print()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f" ✗ FAILED: {e}")
|
||||
print()
|
||||
return False
|
||||
|
||||
|
||||
def test_device_rank_sorting():
|
||||
"""Test 3: Devices are sorted by rank (ascending)."""
|
||||
print("Test 3: Devices sorted by rank")
|
||||
print("-" * 60)
|
||||
|
||||
try:
|
||||
response = httpx.get("http://localhost:8002/dashboard", timeout=5.0)
|
||||
response.raise_for_status()
|
||||
|
||||
html = response.text
|
||||
|
||||
# In Wohnzimmer: Deckenlampe (rank=5) should come before Stehlampe (rank=10)
|
||||
deckenlampe_pos = html.find('device-title">Deckenlampe<')
|
||||
stehlampe_pos = html.find('device-title">Stehlampe<')
|
||||
|
||||
if deckenlampe_pos == -1:
|
||||
print(" ✗ FAILED: Device 'Deckenlampe' not found")
|
||||
return False
|
||||
|
||||
if stehlampe_pos == -1:
|
||||
print(" ✗ FAILED: Device 'Stehlampe' not found")
|
||||
return False
|
||||
|
||||
if deckenlampe_pos > stehlampe_pos:
|
||||
print(" ✗ FAILED: Devices not sorted by rank")
|
||||
print(f" Deckenlampe (rank=5) at position {deckenlampe_pos}")
|
||||
print(f" Stehlampe (rank=10) at position {stehlampe_pos}")
|
||||
return False
|
||||
|
||||
print(" ✓ Devices sorted by rank (ascending):")
|
||||
print(" Wohnzimmer: Deckenlampe (rank=5) → Stehlampe (rank=10)")
|
||||
print()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f" ✗ FAILED: {e}")
|
||||
print()
|
||||
return False
|
||||
|
||||
|
||||
def test_root_redirect():
|
||||
"""Test 4: GET / shows dashboard."""
|
||||
print("Test 4: Root path (/) shows dashboard")
|
||||
print("-" * 60)
|
||||
|
||||
try:
|
||||
response = httpx.get("http://localhost:8002/", timeout=5.0, follow_redirects=True)
|
||||
response.raise_for_status()
|
||||
|
||||
html = response.text
|
||||
|
||||
# Should contain dashboard elements
|
||||
if "Home Automation" not in html:
|
||||
print(" ✗ FAILED: Root path doesn't show dashboard")
|
||||
return False
|
||||
|
||||
if "Wohnzimmer" not in html:
|
||||
print(" ✗ FAILED: Root path missing rooms")
|
||||
return False
|
||||
|
||||
print(" ✓ Root path shows dashboard")
|
||||
print()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f" ✗ FAILED: {e}")
|
||||
print()
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Run all acceptance tests."""
|
||||
print("=" * 60)
|
||||
print("Testing Dashboard Route")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
# Check if UI is running
|
||||
print("Prerequisites: Checking if UI is running on port 8002...")
|
||||
try:
|
||||
response = httpx.get("http://localhost:8002/dashboard", timeout=3.0)
|
||||
print("✓ UI is running")
|
||||
print()
|
||||
except Exception as e:
|
||||
print(f"✗ Cannot reach UI: {e}")
|
||||
print(" Start UI with: poetry run uvicorn apps.ui.main:app --port 8002")
|
||||
print()
|
||||
sys.exit(1)
|
||||
|
||||
results = []
|
||||
|
||||
# Run tests
|
||||
results.append(("Dashboard loads", test_dashboard_loads()))
|
||||
results.append(("Room order", test_room_order()))
|
||||
results.append(("Device rank sorting", test_device_rank_sorting()))
|
||||
results.append(("Root redirect", test_root_redirect()))
|
||||
|
||||
# Summary
|
||||
print("=" * 60)
|
||||
passed = sum(1 for _, result in results if result)
|
||||
total = len(results)
|
||||
print(f"Results: {passed}/{total} tests passed")
|
||||
print("=" * 60)
|
||||
|
||||
for name, result in results:
|
||||
status = "✓" if result else "✗"
|
||||
print(f" {status} {name}")
|
||||
|
||||
if passed == total:
|
||||
print()
|
||||
print("All tests passed!")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print()
|
||||
print("Some tests failed.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user