test_postgres_client_manager.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from unittest.mock import AsyncMock, MagicMock, patch
  2. import pytest
  3. from lightrag.kg.postgres_impl import ClientManager
  4. @pytest.fixture(autouse=True)
  5. def reset_client_manager_state() -> None:
  6. ClientManager._instances = {"db": None, "ref_count": 0, "vector_signature": None}
  7. def test_pg_vector_storage_enables_vector() -> None:
  8. config = ClientManager.get_config("PGVectorStorage")
  9. assert config["enable_vector"] is True
  10. def test_non_pg_vector_storage_disables_vector() -> None:
  11. config = ClientManager.get_config("NanoVectorDBStorage")
  12. assert config["enable_vector"] is False
  13. def test_milvus_storage_disables_vector() -> None:
  14. config = ClientManager.get_config("MilvusVectorDBStorage")
  15. assert config["enable_vector"] is False
  16. def test_qdrant_storage_disables_vector() -> None:
  17. config = ClientManager.get_config("QdrantVectorDBStorage")
  18. assert config["enable_vector"] is False
  19. def test_none_vector_storage_defaults_to_true() -> None:
  20. # Backward compatibility: when vector_storage is unknown (None), default to True.
  21. config = ClientManager.get_config(None)
  22. assert config["enable_vector"] is True
  23. def test_no_args_defaults_to_true() -> None:
  24. # Backward compatibility: calling without arguments preserves prior behavior.
  25. config = ClientManager.get_config()
  26. assert config["enable_vector"] is True
  27. @pytest.mark.asyncio
  28. async def test_get_client_reuses_shared_pool_for_same_vector_settings() -> None:
  29. db = MagicMock()
  30. db.initdb = AsyncMock()
  31. db.check_tables = AsyncMock()
  32. with patch("lightrag.kg.postgres_impl.PostgreSQLDB", return_value=db) as db_cls:
  33. first = await ClientManager.get_client("PGVectorStorage")
  34. second = await ClientManager.get_client("PGVectorStorage")
  35. assert first is db
  36. assert second is db
  37. assert ClientManager._instances["ref_count"] == 2
  38. db_cls.assert_called_once()
  39. db.initdb.assert_awaited_once()
  40. db.check_tables.assert_awaited_once()
  41. @pytest.mark.asyncio
  42. async def test_get_client_rejects_conflicting_vector_storage_settings() -> None:
  43. db = MagicMock()
  44. db.initdb = AsyncMock()
  45. db.check_tables = AsyncMock()
  46. with patch("lightrag.kg.postgres_impl.PostgreSQLDB", return_value=db):
  47. await ClientManager.get_client("NanoVectorDBStorage")
  48. with pytest.raises(RuntimeError, match="process-wide"):
  49. await ClientManager.get_client("PGVectorStorage")