Rollback
Dieser Commit ist enthalten in:
188
v2_adminpanel/test_blueprint_routes.py
Normale Datei
188
v2_adminpanel/test_blueprint_routes.py
Normale Datei
@@ -0,0 +1,188 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test-Skript zur Verifizierung aller Blueprint-Routes
|
||||
Prüft ob alle Routes korrekt registriert sind und erreichbar sind
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from app import app
|
||||
from flask import url_for
|
||||
import logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def test_all_routes():
|
||||
"""Test alle registrierten Routes"""
|
||||
|
||||
print("=== Blueprint Route Test ===\n")
|
||||
|
||||
# Sammle alle Routes
|
||||
routes_by_blueprint = {}
|
||||
|
||||
with app.test_request_context():
|
||||
for rule in app.url_map.iter_rules():
|
||||
# Skip static files
|
||||
if rule.endpoint == 'static':
|
||||
continue
|
||||
|
||||
# Blueprint name is before the dot
|
||||
parts = rule.endpoint.split('.')
|
||||
if len(parts) == 2:
|
||||
blueprint_name = parts[0]
|
||||
function_name = parts[1]
|
||||
else:
|
||||
blueprint_name = 'app'
|
||||
function_name = rule.endpoint
|
||||
|
||||
if blueprint_name not in routes_by_blueprint:
|
||||
routes_by_blueprint[blueprint_name] = []
|
||||
|
||||
routes_by_blueprint[blueprint_name].append({
|
||||
'rule': str(rule),
|
||||
'endpoint': rule.endpoint,
|
||||
'methods': sorted(rule.methods - {'HEAD', 'OPTIONS'}),
|
||||
'function': function_name
|
||||
})
|
||||
|
||||
# Sortiere und zeige Routes nach Blueprint
|
||||
for blueprint_name in sorted(routes_by_blueprint.keys()):
|
||||
routes = routes_by_blueprint[blueprint_name]
|
||||
print(f"\n📦 Blueprint: {blueprint_name}")
|
||||
print(f" Anzahl Routes: {len(routes)}")
|
||||
print(" " + "-" * 50)
|
||||
|
||||
for route in sorted(routes, key=lambda x: x['rule']):
|
||||
methods = ', '.join(route['methods'])
|
||||
print(f" {route['rule']:<40} [{methods:<15}] -> {route['function']}")
|
||||
|
||||
# Zusammenfassung
|
||||
print("\n=== Zusammenfassung ===")
|
||||
total_routes = sum(len(routes) for routes in routes_by_blueprint.values())
|
||||
print(f"Gesamt Blueprints: {len(routes_by_blueprint)}")
|
||||
print(f"Gesamt Routes: {total_routes}")
|
||||
|
||||
# Erwartete Blueprints prüfen
|
||||
expected_blueprints = ['auth', 'admin', 'license', 'customer', 'resource',
|
||||
'session', 'batch', 'api', 'export']
|
||||
|
||||
print("\n=== Blueprint Status ===")
|
||||
for bp in expected_blueprints:
|
||||
if bp in routes_by_blueprint:
|
||||
print(f"✅ {bp:<10} - {len(routes_by_blueprint[bp])} routes")
|
||||
else:
|
||||
print(f"❌ {bp:<10} - FEHLT!")
|
||||
|
||||
# Prüfe ob noch Routes direkt in app.py sind
|
||||
if 'app' in routes_by_blueprint:
|
||||
print(f"\n⚠️ WARNUNG: {len(routes_by_blueprint['app'])} Routes sind noch direkt in app.py!")
|
||||
for route in routes_by_blueprint['app']:
|
||||
print(f" - {route['rule']}")
|
||||
|
||||
def test_route_accessibility():
|
||||
"""Test ob wichtige Routes erreichbar sind"""
|
||||
print("\n\n=== Route Erreichbarkeits-Test ===\n")
|
||||
|
||||
test_client = app.test_client()
|
||||
|
||||
# Wichtige Routes zum Testen (ohne Login)
|
||||
public_routes = [
|
||||
('GET', '/login', 'Login-Seite'),
|
||||
('GET', '/heartbeat', 'Session Heartbeat'),
|
||||
]
|
||||
|
||||
for method, route, description in public_routes:
|
||||
try:
|
||||
if method == 'GET':
|
||||
response = test_client.get(route)
|
||||
elif method == 'POST':
|
||||
response = test_client.post(route)
|
||||
|
||||
status = "✅" if response.status_code in [200, 302, 401] else "❌"
|
||||
print(f"{status} {method:<6} {route:<30} - Status: {response.status_code} ({description})")
|
||||
|
||||
# Bei Fehler mehr Details
|
||||
if response.status_code >= 400 and response.status_code != 401:
|
||||
print(f" ⚠️ Fehler-Details: {response.data[:200]}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ {method:<6} {route:<30} - FEHLER: {str(e)}")
|
||||
|
||||
def check_duplicate_routes():
|
||||
"""Prüfe ob es doppelte Route-Definitionen gibt"""
|
||||
print("\n\n=== Doppelte Routes Check ===\n")
|
||||
|
||||
route_paths = {}
|
||||
duplicates_found = False
|
||||
|
||||
for rule in app.url_map.iter_rules():
|
||||
if rule.endpoint == 'static':
|
||||
continue
|
||||
|
||||
path = str(rule)
|
||||
if path in route_paths:
|
||||
print(f"⚠️ DUPLIKAT gefunden:")
|
||||
print(f" Route: {path}")
|
||||
print(f" 1. Endpoint: {route_paths[path]}")
|
||||
print(f" 2. Endpoint: {rule.endpoint}")
|
||||
duplicates_found = True
|
||||
else:
|
||||
route_paths[path] = rule.endpoint
|
||||
|
||||
if not duplicates_found:
|
||||
print("✅ Keine doppelten Routes gefunden!")
|
||||
|
||||
def check_template_references():
|
||||
"""Prüfe ob Template-Dateien für die Routes existieren"""
|
||||
print("\n\n=== Template Verfügbarkeits-Check ===\n")
|
||||
|
||||
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
|
||||
|
||||
# Sammle alle verfügbaren Templates
|
||||
available_templates = []
|
||||
if os.path.exists(template_dir):
|
||||
for root, dirs, files in os.walk(template_dir):
|
||||
for file in files:
|
||||
if file.endswith(('.html', '.jinja2')):
|
||||
rel_path = os.path.relpath(os.path.join(root, file), template_dir)
|
||||
available_templates.append(rel_path.replace('\\', '/'))
|
||||
|
||||
print(f"Gefundene Templates: {len(available_templates)}")
|
||||
|
||||
# Wichtige Templates prüfen
|
||||
required_templates = [
|
||||
'login.html',
|
||||
'index.html',
|
||||
'profile.html',
|
||||
'licenses.html',
|
||||
'customers.html',
|
||||
'resources.html',
|
||||
'sessions.html',
|
||||
'audit.html',
|
||||
'backups.html'
|
||||
]
|
||||
|
||||
for template in required_templates:
|
||||
if template in available_templates:
|
||||
print(f"✅ {template}")
|
||||
else:
|
||||
print(f"❌ {template} - FEHLT!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🔍 Starte Blueprint-Verifizierung...\n")
|
||||
|
||||
try:
|
||||
test_all_routes()
|
||||
test_route_accessibility()
|
||||
check_duplicate_routes()
|
||||
check_template_references()
|
||||
|
||||
print("\n\n✅ Test abgeschlossen!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n\n❌ Fehler beim Test: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren