106 lines
3.1 KiB
Python
106 lines
3.1 KiB
Python
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()
|