#!/usr/bin/env python3 """ Test-Skript für MYP Backend-Setup Überprüft, ob die neue Produktions-Konfiguration korrekt funktioniert """ import os import sys import subprocess import tempfile import importlib.util def test_python_environment(): """Teste Python-Umgebung und Dependencies""" print("🐍 Teste Python-Umgebung...") # Python-Version prüfen python_version = sys.version_info print(f" Python-Version: {python_version.major}.{python_version.minor}.{python_version.micro}") if python_version < (3, 8): print(" ❌ Python-Version ist zu alt! Benötigt wird mindestens Python 3.8") return False print(" ✅ Python-Version ist kompatibel") return True def test_dependencies(): """Teste erforderliche Python-Pakete""" print("📦 Teste Python-Dependencies...") required_packages = { 'flask': 'flask', 'flask_cors': 'flask_cors', 'werkzeug': 'werkzeug', 'jwt': 'PyJWT', # PyJWT wird als 'jwt' importiert 'dotenv': 'python-dotenv', # python-dotenv wird als 'dotenv' importiert 'gunicorn': 'gunicorn' } missing_packages = [] for import_name, package_name in required_packages.items(): try: __import__(import_name) print(f" ✅ {package_name}") except ImportError: print(f" ❌ {package_name} fehlt") missing_packages.append(package_name) if missing_packages: print(f" Fehlende Pakete: {', '.join(missing_packages)}") print(" Installiere mit: pip install -r requirements.txt") return False else: print(" ✅ Alle Dependencies verfügbar") return True def test_configuration(): """Teste Konfigurationsklassen""" print("⚙️ Teste Konfiguration...") try: # Importiere Konfiguration from config import config, DevelopmentConfig, ProductionConfig, TestingConfig print(" ✅ Konfigurationsklassen importiert") # Teste verschiedene Konfigurationen dev_config = DevelopmentConfig() prod_config = ProductionConfig() test_config = TestingConfig() print(f" ✅ Development-Config: DEBUG={dev_config.DEBUG}") print(f" ✅ Production-Config: DEBUG={prod_config.DEBUG}") print(f" ✅ Testing-Config: TESTING={test_config.TESTING}") return True except Exception as e: print(f" ❌ Konfigurationsfehler: {e}") return False def test_application_factory(): """Teste Application Factory Pattern""" print("🏭 Teste Application Factory...") try: from app import create_app # Teste verschiedene Konfigurationen configs = ['development', 'production', 'testing'] for config_name in configs: try: app = create_app(config_name) if app and hasattr(app, 'config'): print(f" ✅ {config_name.title()}-Config erfolgreich geladen") else: print(f" ❌ {config_name.title()}-Config fehlgeschlagen") return False except Exception as e: print(f" ❌ {config_name.title()}-Config Fehler: {e}") return False print(" ✅ Application Factory funktioniert") return True except Exception as e: print(f" ❌ Application Factory Fehler: {e}") return False def test_database_functions(): """Teste Datenbankfunktionen""" print("🗄️ Teste Datenbankfunktionen...") try: os.environ['SECRET_KEY'] = 'test_secret_key' os.environ['DATABASE_PATH'] = ':memory:' from app import create_app, init_db, get_db app = create_app('testing') with app.app_context(): # Initialisiere Test-Datenbank init_db() # Teste Datenbankverbindung db = get_db() result = db.execute('SELECT 1').fetchone() if result: print(" ✅ Datenbankverbindung funktioniert") print(" ✅ Tabellen wurden erstellt") return True else: print(" ❌ Datenbankverbindung fehlgeschlagen") return False except Exception as e: print(f" ❌ Datenbankfehler: {e}") return False def test_environment_variables(): """Teste Umgebungsvariablen""" print("🌍 Teste Umgebungsvariablen...") # Lade env.backend falls vorhanden if os.path.exists('env.backend'): print(" ✅ env.backend gefunden") with open('env.backend', 'r') as f: lines = f.readlines() required_vars = [ 'FLASK_APP', 'FLASK_ENV', 'SECRET_KEY', 'DATABASE_PATH' ] found_vars = [] for line in lines: if '=' in line and not line.strip().startswith('#'): var_name = line.split('=')[0].strip() if var_name in required_vars: found_vars.append(var_name) missing_vars = set(required_vars) - set(found_vars) if missing_vars: print(f" ❌ Fehlende Umgebungsvariablen: {', '.join(missing_vars)}") return False else: print(f" ✅ Alle erforderlichen Variablen gefunden: {', '.join(found_vars)}") return True else: print(" ❌ env.backend nicht gefunden") return False def test_wsgi(): """Teste WSGI-Konfiguration""" print("🔧 Teste WSGI-Setup...") try: from wsgi import application if application: print(" ✅ WSGI-Application erfolgreich importiert") print(f" ✅ App-Name: {application.name}") return True else: print(" ❌ WSGI-Application ist None") return False except Exception as e: print(f" ❌ WSGI-Fehler: {e}") return False def test_health_endpoint(): """Teste Health-Check-Endpoint""" print("🏥 Teste Health-Check...") try: # Verwende Test-Konfiguration um Logging-Probleme zu vermeiden from app import create_app app = create_app('testing') with app.test_client() as client: # Teste sowohl /health als auch /monitoring/health und /monitoring/health/simple endpoints_to_test = ['/health', '/monitoring/health/simple', '/monitoring/health'] for endpoint in endpoints_to_test: response = client.get(endpoint) if response.status_code == 200: data = response.get_json() if data and (data.get('status') == 'healthy' or data.get('status') == 'ok'): print(f" ✅ Health-Check funktioniert ({endpoint})") return True else: print(f" ❌ Health-Check-Response ungültig ({endpoint}): {data}") continue else: print(f" ❌ Health-Check fehlgeschlagen ({endpoint}): {response.status_code}") continue # Wenn alle Endpoints fehlschlagen, zeige verfügbare Routen print(" 📋 Verfügbare Health-Routen:") for rule in app.url_map.iter_rules(): if 'health' in rule.rule.lower(): print(f" - {rule.rule} [{', '.join(rule.methods)}]") return False except Exception as e: print(f" ❌ Health-Check-Fehler: {e}") return False def main(): """Haupttest-Funktion""" print("=" * 50) print("🧪 MYP Backend - Konfigurationstest") print("=" * 50) print() tests = [ test_python_environment, test_dependencies, test_configuration, test_application_factory, test_database_functions, test_environment_variables, test_wsgi, test_health_endpoint ] passed = 0 failed = 0 for test in tests: try: if test(): passed += 1 else: failed += 1 except Exception as e: print(f" ❌ Test-Fehler: {e}") failed += 1 print() print("=" * 50) print(f"📊 Test-Ergebnisse: {passed} ✅ | {failed} ❌") print("=" * 50) if failed == 0: print("🎉 Alle Tests bestanden! Backend ist bereit.") return True else: print("⚠️ Einige Tests fehlgeschlagen. Bitte Konfiguration prüfen.") return False if __name__ == '__main__': success = main() sys.exit(0 if success else 1)