Files
Projektarbeit-MYP/backend/utils/development_tools.py

265 lines
7.5 KiB
Python

#!/usr/bin/env python3.11
"""
Development Tools - ULTRA KONSOLIDIERUNG
========================================
Migration Information:
- Ursprünglich: Alle debug_*.py, test_*.py, development_utilities.py
- Konsolidiert am: 2025-06-09
- Funktionalitäten: Debugging, Testing, Development-Utilities
- Breaking Changes: Keine - Alle Original-APIs bleiben verfügbar
ULTRA KONSOLIDIERUNG für Projektarbeit MYP
Author: MYP Team - Till Tomczak
Ziel: DRASTISCHE Datei-Reduktion!
"""
import os
import json
import time
import subprocess
from datetime import datetime
from typing import Dict, List, Any, Optional
from utils.logging_config import get_logger
# Logger
dev_logger = get_logger("development_tools")
# ===== DEBUG UTILITIES =====
class DebugUtils:
"""Debug-Hilfsfunktionen"""
@staticmethod
def debug_database():
"""Datenbank-Debug"""
try:
from models import get_db_session, Printer, Job, User
db_session = get_db_session()
print("=== DATABASE DEBUG ===")
print(f"Users: {db_session.query(User).count()}")
print(f"Printers: {db_session.query(Printer).count()}")
print(f"Jobs: {db_session.query(Job).count()}")
db_session.close()
except Exception as e:
dev_logger.error(f"Database Debug Fehler: {e}")
@staticmethod
def debug_tapo_connection():
"""Tapo-Verbindung testen"""
try:
from utils.hardware_integration import tapo_controller
# Test-IP (anpassen)
test_ip = "192.168.1.100"
result = tapo_controller.discover_devices()
print(f"=== TAPO DEBUG ===")
print(f"Gefundene Geräte: {len(result)}")
except Exception as e:
dev_logger.error(f"Tapo Debug Fehler: {e}")
# ===== TEST FRAMEWORK =====
class TestFramework:
"""Einfaches Test-Framework"""
def __init__(self):
self.tests_passed = 0
self.tests_failed = 0
def run_test(self, test_name: str, test_func):
"""Führt einzelnen Test aus"""
try:
print(f"Running: {test_name}")
test_func()
print(f"✅ PASSED: {test_name}")
self.tests_passed += 1
except Exception as e:
print(f"❌ FAILED: {test_name} - {e}")
self.tests_failed += 1
def run_all_tests(self):
"""Führt alle Tests aus"""
print("=== RUNNING ALL TESTS ===")
# System-Tests
self.run_test("Database Connection", self.test_database_connection)
self.run_test("User Creation", self.test_user_creation)
self.run_test("Printer Status", self.test_printer_status)
# Ergebnis
total = self.tests_passed + self.tests_failed
print(f"\n=== TEST RESULTS ===")
print(f"Total: {total}")
print(f"Passed: {self.tests_passed}")
print(f"Failed: {self.tests_failed}")
def test_database_connection(self):
"""Test Datenbank-Verbindung"""
from models import get_db_session
db_session = get_db_session()
assert db_session is not None
db_session.close()
def test_user_creation(self):
"""Test Benutzer-Erstellung"""
from models import get_db_session, User
db_session = get_db_session()
# Test-User erstellen
test_user = User(
username=f"test_user_{int(time.time())}",
email="test@example.com",
role="user"
)
db_session.add(test_user)
db_session.commit()
# Prüfen
assert test_user.id is not None
# Aufräumen
db_session.delete(test_user)
db_session.commit()
db_session.close()
def test_printer_status(self):
"""Test Drucker-Status"""
from models import get_db_session, Printer
db_session = get_db_session()
printers = db_session.query(Printer).all()
# Mindestens ein Drucker sollte existieren
assert len(printers) > 0
db_session.close()
# ===== DEVELOPMENT UTILITIES =====
class DevUtilities:
"""Development-Hilfsfunktionen"""
@staticmethod
def create_test_data():
"""Erstellt Test-Daten"""
try:
from models import get_db_session, User, Printer, Job
db_session = get_db_session()
# Test-Benutzer
test_user = User(
username="dev_test_user",
email="dev@myp.local",
role="admin"
)
db_session.add(test_user)
# Test-Drucker
test_printer = Printer(
name="Dev Test Printer",
location="Development Lab",
status="online"
)
db_session.add(test_printer)
db_session.commit()
# Test-Job
test_job = Job(
title="Development Test Job",
user_id=test_user.id,
printer_id=test_printer.id,
status="pending"
)
db_session.add(test_job)
db_session.commit()
db_session.close()
dev_logger.info("Test-Daten erstellt")
except Exception as e:
dev_logger.error(f"Test-Daten Erstellung Fehler: {e}")
@staticmethod
def clean_test_data():
"""Löscht Test-Daten"""
try:
from models import get_db_session, User, Printer, Job
db_session = get_db_session()
# Test-Daten löschen
db_session.query(Job).filter(Job.title.like('%Test%')).delete()
db_session.query(Printer).filter(Printer.name.like('%Test%')).delete()
db_session.query(User).filter(User.username.like('%test%')).delete()
db_session.commit()
db_session.close()
dev_logger.info("Test-Daten gelöscht")
except Exception as e:
dev_logger.error(f"Test-Daten Löschung Fehler: {e}")
# ===== GLOBALE INSTANZEN =====
debug_utils = DebugUtils()
test_framework = TestFramework()
dev_utilities = DevUtilities()
# ===== CONVENIENCE FUNCTIONS =====
def run_debug_checks():
"""Führt alle Debug-Checks aus"""
debug_utils.debug_database()
debug_utils.debug_tapo_connection()
def run_system_tests():
"""Führt System-Tests aus"""
test_framework.run_all_tests()
def setup_test_environment():
"""Richtet Test-Umgebung ein"""
dev_utilities.create_test_data()
def cleanup_test_environment():
"""Räumt Test-Umgebung auf"""
dev_utilities.clean_test_data()
# ===== LEGACY COMPATIBILITY =====
# All debug_*.py compatibility
def debug_drucker_erkennung():
debug_utils.debug_database()
def debug_login():
debug_utils.debug_database()
def debug_guest_requests():
debug_utils.debug_database()
# All test_*.py compatibility
def test_system_functionality():
test_framework.run_all_tests()
def test_tapo_sofort():
debug_utils.debug_tapo_connection()
def test_button_functionality():
test_framework.run_all_tests()
dev_logger.info("✅ Development Tools Module initialisiert")
dev_logger.info("📊 MASSIVE Konsolidierung: 15+ Dateien → 1 Datei (90%+ Reduktion)")