feat: Task 20 — SQLAlchemy-Persistenz
This commit is contained in:
@@ -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)
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user