diff --git a/schemes/__init__.py b/schemes/__init__.py index 00d50ddc..5bddc9b9 100644 --- a/schemes/__init__.py +++ b/schemes/__init__.py @@ -137,7 +137,8 @@ def _create_engine(app: Flask) -> Engine: @inject.autoparams() def _create_capital_schemes_engine(config: Config, engine: Engine) -> Engine: database_uri = config.get("CAPITAL_SCHEMES_DATABASE_URI") - return create_engine(database_uri) if database_uri else engine + engine_options = config["SQLALCHEMY_ENGINE_OPTIONS"] + return create_engine(database_uri, **engine_options) if database_uri else engine @inject.params(engine=Engine, capital_schemes_engine=(Engine, CapitalSchemeEntity)) diff --git a/schemes/config.py b/schemes/config.py index 32452ca0..6ff21179 100644 --- a/schemes/config.py +++ b/schemes/config.py @@ -10,6 +10,7 @@ class Config: # Flask-SQLAlchemy SQLALCHEMY_DATABASE_URI = "sqlite+pysqlite:///:memory:" + SQLALCHEMY_ENGINE_OPTIONS = {"pool_recycle": int(timedelta(minutes=30).total_seconds())} # Flask-Session SESSION_TYPE = "sqlalchemy" diff --git a/tests/integration/test_database.py b/tests/integration/test_database.py new file mode 100644 index 00000000..7775e8e0 --- /dev/null +++ b/tests/integration/test_database.py @@ -0,0 +1,24 @@ +from typing import Any, Mapping + +import inject +import pytest +from sqlalchemy import Engine + +from schemes.infrastructure.database import CapitalSchemeEntity + + +@pytest.mark.usefixtures("client") +class TestDatabase: + @pytest.fixture(name="config", scope="class") + def config_fixture(self, config: Mapping[str, Any]) -> Mapping[str, Any]: + return dict(config) | {"CAPITAL_SCHEMES_DATABASE_URI": "sqlite+pysqlite:///:memory:"} + + def test_pool_recycles_connections(self) -> None: + engine = inject.instance(Engine) + + assert engine.pool._recycle == 1800 + + def test_capital_schemes_pool_recycles_connections(self) -> None: + engine = inject.instance((Engine, CapitalSchemeEntity)) + + assert isinstance(engine, Engine) and engine.pool._recycle == 1800