from pathlib import Path import pytest from alembic import command from alembic.config import Config from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import app.db as app_db from app.config import get_settings from app.main import create_app def _make_alembic_config(database_url: str) -> Config: config = Config("alembic_location.ini") config.set_main_option("sqlalchemy.url", database_url) return config def _make_poo_alembic_config(database_url: str) -> Config: config = Config("alembic_poo.ini") config.set_main_option("sqlalchemy.url", database_url) return config @pytest.fixture def test_database_urls(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): location_database_path = tmp_path / "location_test.db" poo_database_path = tmp_path / "poo_placeholder.db" location_database_url = f"sqlite:///{location_database_path}" poo_database_url = f"sqlite:///{poo_database_path}" monkeypatch.setenv("LOCATION_DATABASE_URL", location_database_url) monkeypatch.setenv("POO_DATABASE_URL", poo_database_url) get_settings.cache_clear() try: yield { "location_path": location_database_path, "location_url": location_database_url, "poo_path": poo_database_path, "poo_url": poo_database_url, } finally: get_settings.cache_clear() @pytest.fixture def ready_location_database(test_database_urls): command.upgrade(_make_alembic_config(test_database_urls["location_url"]), "head") return test_database_urls @pytest.fixture def ready_poo_database(test_database_urls): command.upgrade(_make_poo_alembic_config(test_database_urls["poo_url"]), "head") return test_database_urls @pytest.fixture def app(ready_location_database, ready_poo_database): yield create_app() @pytest.fixture def client(app): with TestClient(app) as test_client: yield test_client @pytest.fixture def location_client(ready_location_database, ready_poo_database, monkeypatch: pytest.MonkeyPatch): database_url = ready_location_database["location_url"] engine = create_engine(database_url, connect_args={"check_same_thread": False}) session_local = sessionmaker(bind=engine, autoflush=False, autocommit=False) monkeypatch.setattr(app_db, "engine", engine) monkeypatch.setattr(app_db, "SessionLocal", session_local) fastapi_app = create_app() with TestClient(fastapi_app) as client: yield client, engine engine.dispose() @pytest.fixture def poo_client(ready_location_database, ready_poo_database, monkeypatch: pytest.MonkeyPatch): database_url = ready_poo_database["poo_url"] engine = create_engine(database_url, connect_args={"check_same_thread": False}) session_local = sessionmaker(bind=engine, autoflush=False, autocommit=False) import app.poo_db as poo_db monkeypatch.setattr(poo_db, "poo_engine", engine) monkeypatch.setattr(poo_db, "PooSessionLocal", session_local) fastapi_app = create_app() with TestClient(fastapi_app) as client: yield client, engine engine.dispose()