From 153820772a0da90a25174a4eb4959f16ec02fd67 Mon Sep 17 00:00:00 2001 From: Mathias Scheider Date: Fri, 4 Sep 2026 15:34:02 +0200 Subject: [PATCH] test db setup --- alembic/env.py | 14 +++++--- src/db.py | 12 +++++++ tests/conftest.py | 36 +++++++++++++++++++ tests/test_db.py | 10 ++++++ ...est_category.py => test_model_category.py} | 0 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 tests/conftest.py create mode 100644 tests/test_db.py rename tests/{models/test_category.py => test_model_category.py} (100%) diff --git a/alembic/env.py b/alembic/env.py index fe8aca3..c2e9aac 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -5,6 +5,7 @@ from dotenv import load_dotenv from sqlalchemy import engine_from_config, pool from alembic import context +from src.db import get_set_engine from src.models_db import BaseModelDb load_dotenv() # reads .env into os.environ @@ -64,11 +65,14 @@ def run_migrations_online() -> None: and associate a connection with the context. """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) + if get_set_engine() is not None: + connectable = get_set_engine() + else: + connectable = engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) with connectable.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) diff --git a/src/db.py b/src/db.py index 310e399..4d4ede6 100644 --- a/src/db.py +++ b/src/db.py @@ -9,6 +9,18 @@ from sqlalchemy.orm import Session, sessionmaker DATABASE_URL_DEFAULT = "sqlite:///finanz.db" +# Optional: allow an external engine (e.g. for testing with in-memory SQLite) +_engine: Engine | None = None + + +def set_engine(engine: Engine) -> None: + global _engine + _engine = engine + + +def get_set_engine() -> Engine | None: + return _engine + def get_engine() -> Engine: url = os.environ.get("DATABASE_URL", DATABASE_URL_DEFAULT) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..15f8623 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,36 @@ +#!/bin/python + +import os +from collections.abc import Generator + +os.environ["DATABASE_URL"] = "sqlite://" + +import pytest +from alembic.config import Config +from sqlalchemy import StaticPool, create_engine +from sqlalchemy.orm import Session, sessionmaker + +from alembic import command +from src.db import set_engine + + +@pytest.fixture() +def db_session() -> Generator[Session]: + engine = create_engine( + "sqlite://", + connect_args={"check_same_thread": False}, + poolclass=StaticPool, + ) + + set_engine(engine) + + alembic_cfg = Config("alembic.ini") + command.upgrade(alembic_cfg, "head") + + SessionLocal = sessionmaker(bind=engine) + session = SessionLocal() + try: + yield session + finally: + session.close() + engine.dispose() diff --git a/tests/test_db.py b/tests/test_db.py new file mode 100644 index 0000000..bc23364 --- /dev/null +++ b/tests/test_db.py @@ -0,0 +1,10 @@ +#!/bin/python + +from sqlalchemy import inspect +from sqlalchemy.orm import Session + + +def test_db_reachable_and_not_empty(db_session: Session): + inspector = inspect(db_session.get_bind()) + tables = inspector.get_table_names() + assert tables diff --git a/tests/models/test_category.py b/tests/test_model_category.py similarity index 100% rename from tests/models/test_category.py rename to tests/test_model_category.py