feat: Task 20 — SQLAlchemy-Persistenz

This commit is contained in:
hermes
2026-06-22 13:04:34 +00:00
parent f825165596
commit cd3d9c7072
5 changed files with 208 additions and 52 deletions
+44
View File
@@ -0,0 +1,44 @@
"""Pytest-Konfiguration: Redis-Mock und Datenbank-Reset."""
from __future__ import annotations
import sys
import unittest.mock as mock
import fakeredis
import pytest
from src.database import Base, _engine
# --- Fake redis module that provides real-like exceptions ---
import redis as _real_redis
class _FakeRedis:
"""Wraps fakeredis with the correct redis.exceptions hierarchy."""
@staticmethod
def exceptions():
return _real_redis.exceptions
def __init__(self, *args, **kwargs):
self._conn = fakeredis.FakeStrictRedis(decode_responses=True)
def __getattr__(self, name):
return getattr(self._conn, name)
@property
def exceptions(self):
return _real_redis.exceptions
# Install BEFORE any app code runs
sys.modules["redis"] = mock.MagicMock()
sys.modules["redis"].Redis = _FakeRedis
sys.modules["redis"].exceptions = _real_redis.exceptions
@pytest.fixture(autouse=True)
def reset_db() -> None:
"""Setzt die Datenbank vor jedem Test zurueck."""
Base.metadata.drop_all(bind=_engine)
Base.metadata.create_all(bind=_engine)
+46
View File
@@ -0,0 +1,46 @@
"""Tests für src.database — SQLAlchemy-Engine und Session."""
from __future__ import annotations
from sqlalchemy import inspect
from src.database import Base, get_engine, get_session
from src.models.spiel import SpielDB
class TestDatabase:
"""Tests für die Datenbank-Schicht."""
def test_engine_is_available(self) -> None:
"""engine ist eine SQLAlchemy-Engine."""
engine = get_engine()
assert engine is not None
def test_session_ist_ernzeugbar(self) -> None:
"""session kann erstellt werden."""
session = get_session()
assert session is not None
session.close()
def test_base_metadata_contains_spiel(self) -> None:
"""Base.metadata registriert spiele-Tabelle."""
engine = get_engine()
inspector = inspect(engine)
metadata_tables = set(inspector.get_table_names())
# Nach create_all in game_service sollte spiele existieren
assert "spiele" in metadata_tables, f"Keine spiele-Tabelle in {metadata_tables}"
def test_sqlalchemy_spiel_modell_erstellt(self) -> None:
"""SpielDB-Modell hat korrekte Spalten."""
assert hasattr(SpielDB, "name")
assert hasattr(SpielDB, "min_spieler")
assert hasattr(SpielDB, "max_spieler")
assert hasattr(SpielDB, "dauer_min")
assert hasattr(SpielDB, "komplexitaet")
assert hasattr(SpielDB, "kategorie")
def test_session_get_bind(self) -> None:
"""session.get_bind() gibt engine zurück."""
session = get_session()
assert session.get_bind() is not None
session.close()