import os import pytest from sqlalchemy.orm import Session from app.utils.database import get_db, get_db_credentials from tests.utils.db_mocks import mock_env, mock_ssm, session_mock def test_get_db_credentials_env(mock_env): """Test getting DB credentials from environment variables""" conn_str = get_db_credentials() assert conn_str == "postgresql://testuser:testpass@localhost/testdb" def test_get_db_credentials_ssm(mock_ssm): """Test getting DB credentials from SSM""" os.environ.pop("MOCK_AUTH", None) conn_str = get_db_credentials() expected_conn = "postgresql://mocked_value:mocked_value@mocked_value/mocked_value" assert expected_conn in conn_str mock_ssm.get_parameter.assert_called() def test_get_db_credentials_ssm_exception(mock_ssm): """Test SSM credential fetching failure raises RuntimeError""" os.environ.pop("MOCK_AUTH", None) mock_ssm.get_parameter.side_effect = Exception("SSM timeout") with pytest.raises(RuntimeError) as excinfo: get_db_credentials() assert "Failed to fetch DB credentials from SSM: SSM timeout" in str(excinfo.value) def test_session_creation(): """Test database session creation""" session = session_mock() assert isinstance(session, Session) session.close() def test_get_db_generator(): """Test get_db dependency generator""" db_gen = get_db() db = next(db_gen) assert isinstance(db, Session) try: next(db_gen) # Should raise StopIteration except StopIteration: pass def test_init_db(mocker, mock_env): """Test database initialization creates tables""" mock_create_all = mocker.patch("app.models.Base.metadata.create_all") # Mock get_db_credentials to return SQLite test connection mocker.patch( "app.utils.database.get_db_credentials", return_value="sqlite:///:memory:", ) from app.utils.database import engine, init_db init_db() # Verify create_all was called with the engine mock_create_all.assert_called_once_with(bind=engine)