lct-hack/backend/tests/test_db_pool_config.py
2026-09-26 17:13:45 +00:00

54 lines
1.6 KiB
Python

from types import SimpleNamespace
import pytest
from pydantic import ValidationError
from app.config import Settings
def test_database_pool_defaults_fit_two_backend_node_budget():
settings = Settings(_env_file=None)
assert settings.db_pool_size == 20
assert settings.db_pool_max_overflow == 10
# Two backend nodes use at most 60 application connections, leaving room
# under PostgreSQL's common 100-connection default for admin/backup work.
assert 2 * (settings.db_pool_size + settings.db_pool_max_overflow) == 60
@pytest.mark.parametrize("values", [{"db_pool_size": 0}, {"db_pool_max_overflow": -1}])
def test_database_pool_rejects_invalid_limits(values):
with pytest.raises(ValidationError):
Settings(_env_file=None, **values)
def test_engine_uses_configured_pool_limits(monkeypatch):
from app.db import base
observed = {}
sentinel = object()
def capture(url, **options):
observed["url"] = url
observed.update(options)
return sentinel
settings = SimpleNamespace(
database_url="postgresql+asyncpg://lct:test@localhost/lct",
db_pool_size=12,
db_pool_max_overflow=7,
)
monkeypatch.setattr(base, "get_settings", lambda: settings)
monkeypatch.setattr(base, "create_async_engine", capture)
base.reset()
try:
assert base.get_engine() is sentinel
finally:
base.reset()
assert observed == {
"url": settings.database_url,
"pool_pre_ping": True,
"pool_size": 12,
"max_overflow": 7,
"hide_parameters": True,
}