Files
ewoooc/tests/test_database_manager_cache.py
OoO 74d64092bc
All checks were successful
CD Pipeline / deploy (push) Successful in 1m35s
fix(db): 收斂 DatabaseManager PostgreSQL 連線池
2026-04-30 10:08:31 +08:00

62 lines
2.0 KiB
Python

from database.manager import DatabaseManager
def test_database_manager_reuses_engine_for_same_sqlite_path(tmp_path):
DatabaseManager._instance_cache.clear()
db_url = f"sqlite:///{tmp_path / 'cache.db'}"
first = DatabaseManager(db_url)
second = DatabaseManager(db_url)
try:
assert second.engine is first.engine
assert second.Session is first.Session
finally:
DatabaseManager._instance_cache.clear()
first.engine.dispose()
def test_database_manager_uses_bounded_postgres_pool(monkeypatch):
import config
import database.manager as manager
captured = {}
class FakeEngine:
def dispose(self):
pass
class FakeSession:
pass
def fake_create_engine(url, **kwargs):
captured["url"] = url
captured["kwargs"] = kwargs
return FakeEngine()
def fake_sessionmaker(bind):
captured["session_bind"] = bind
return FakeSession
DatabaseManager._instance_cache.clear()
monkeypatch.setattr(config, "DATABASE_TYPE", "postgresql")
monkeypatch.setattr(config, "DATABASE_PATH", "postgresql://example/db")
monkeypatch.setattr(manager, "create_engine", fake_create_engine)
monkeypatch.setattr(manager, "sessionmaker", fake_sessionmaker)
monkeypatch.setattr(manager, "ensure_metadata_initialized", lambda *args, **kwargs: None)
monkeypatch.setattr(DatabaseManager, "_init_autoheal_tables", lambda self: None)
db = DatabaseManager()
assert captured["url"] == "postgresql://example/db"
assert captured["kwargs"]["pool_pre_ping"] is True
assert captured["kwargs"]["pool_size"] == 2
assert captured["kwargs"]["max_overflow"] == 3
assert captured["kwargs"]["pool_recycle"] == 1800
assert captured["kwargs"]["pool_timeout"] == 30
assert captured["kwargs"]["connect_args"]["connect_timeout"] == 10
assert "statement_timeout=60000" in captured["kwargs"]["connect_args"]["options"]
assert db.engine is captured["session_bind"]
DatabaseManager._instance_cache.clear()