import pytest from fastapi.testclient import TestClient from sqlalchemy import create_engine, event from sqlalchemy.orm import Session from sqlalchemy.pool import StaticPool from app.db import Base, get_session import app.models # noqa: F401 ensures all ORM tables are registered on Base.metadata @pytest.fixture def db(): engine = create_engine( "sqlite://", poolclass=StaticPool, connect_args={"check_same_thread": False}, ) # SQLite does not enforce foreign keys unless told to per-connection. Turn # enforcement on so the tests catch FK violations (missing cascades) the # same way Postgres would in production. @event.listens_for(engine, "connect") def _fk_pragma(dbapi_conn, _): cur = dbapi_conn.cursor() cur.execute("PRAGMA foreign_keys=ON") cur.close() Base.metadata.create_all(engine) with Session(engine) as session: yield session @pytest.fixture def client(db, monkeypatch): monkeypatch.setenv("FB_API_KEY", "test-key") from app.config import get_settings get_settings.cache_clear() from app.auth import hash_password monkeypatch.setenv("FB_GUI_PASSWORD_HASH", hash_password("geheim")) get_settings.cache_clear() from app.main import app def _override_get_session(): yield db app.dependency_overrides[get_session] = _override_get_session with TestClient(app) as c: yield c app.dependency_overrides.clear() get_settings.cache_clear()