test_db.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from __future__ import annotations
  2. import unittest
  3. from unittest.mock import MagicMock, patch
  4. from data_collector_mcp import db
  5. class DatabaseTests(unittest.TestCase):
  6. def test_database_url_requires_value(self) -> None:
  7. with patch.dict("os.environ", {}, clear=True):
  8. with self.assertRaisesRegex(ValueError, "DATABASE_URL is required"):
  9. db.database_url()
  10. def test_database_url_rejects_sqlite(self) -> None:
  11. with patch.dict("os.environ", {"DATABASE_URL": "sqlite:///test.db"}, clear=True):
  12. with self.assertRaisesRegex(ValueError, "SQLite is not supported"):
  13. db.database_url()
  14. def test_database_url_accepts_postgres(self) -> None:
  15. url = "postgresql+psycopg2://user:pass@localhost:5432/data-collector-mcp"
  16. with patch.dict("os.environ", {"DATABASE_URL": url}, clear=True):
  17. self.assertEqual(db.database_url(), url)
  18. def test_check_database_connection_executes_select(self) -> None:
  19. connection = MagicMock()
  20. connect_context = MagicMock()
  21. connect_context.__enter__.return_value = connection
  22. engine = MagicMock()
  23. engine.connect.return_value = connect_context
  24. with patch.object(db, "sql_engine", return_value=engine):
  25. db.check_database_connection()
  26. connection.execute.assert_called_once()
  27. def test_check_database_connection_propagates_errors(self) -> None:
  28. engine = MagicMock()
  29. engine.connect.side_effect = RuntimeError("connection failed")
  30. with patch.object(db, "sql_engine", return_value=engine):
  31. with self.assertRaisesRegex(RuntimeError, "connection failed"):
  32. db.check_database_connection()
  33. if __name__ == "__main__":
  34. unittest.main()