"""Gemeinsame Test-Vorbereitung. Jeder Test bekommt eine eigene, frische SQLite-Datei in einem temporären Verzeichnis - keine geteilten Zustände zwischen Tests, und die echte Datenbank unter data/ wird nie angefasst. """ import pytest from fastapi.testclient import TestClient from sqlalchemy.orm import sessionmaker from app.database import Basis, engine_erzeugen, get_db from app.main import app from app.seed import stammdaten_anlegen @pytest.fixture def db_sitzung(tmp_path): engine = engine_erzeugen(f"sqlite:///{tmp_path/'test.sqlite'}") Basis.metadata.create_all(engine) Sitzung = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False) with Sitzung() as db: stammdaten_anlegen(db) yield db engine.dispose() @pytest.fixture def client(db_sitzung): """TestClient, der auf dieselbe Testdatenbank zeigt wie db_sitzung.""" def _db(): yield db_sitzung app.dependency_overrides[get_db] = _db # Bewusst ohne "with": nur dann startet Starlette den Lifespan, und der # würde die echte Datenbank unter data/ anlegen und befüllen. Die # Stammdaten stehen in der Testdatenbank ohnehin schon (db_sitzung). yield TestClient(app) app.dependency_overrides.clear() @pytest.fixture def kategorie_id(client): return client.get("/api/v1/categories").json()[0]["id"]