|
2 | 2 | Unit tests for database connection management. |
3 | 3 | """ |
4 | 4 |
|
5 | | -import pytest |
6 | 5 | from unittest.mock import AsyncMock, MagicMock, patch |
7 | 6 |
|
8 | | -from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession |
| 7 | +import pytest |
| 8 | +from sqlalchemy.ext.asyncio import AsyncEngine |
9 | 9 |
|
10 | 10 | from app.exceptions import DatabaseConnectionException |
11 | 11 | from db.connection import ( |
12 | 12 | DatabaseManager, |
13 | 13 | _get_async_url, |
14 | | - get_database, |
15 | 14 | close_database, |
| 15 | + get_database, |
16 | 16 | ) |
17 | 17 |
|
18 | 18 |
|
@@ -110,48 +110,54 @@ def test_dialect_property(self, mock_settings: MagicMock) -> None: |
110 | 110 | @pytest.mark.asyncio |
111 | 111 | async def test_initialize_success(self, mock_settings: MagicMock) -> None: |
112 | 112 | """Test successful database initialization.""" |
113 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
114 | | - with patch("db.connection.create_async_engine") as mock_engine: |
115 | | - mock_engine.return_value = MagicMock(spec=AsyncEngine) |
| 113 | + with ( |
| 114 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 115 | + patch("db.connection.create_async_engine") as mock_engine, |
| 116 | + ): |
| 117 | + mock_engine.return_value = MagicMock(spec=AsyncEngine) |
116 | 118 |
|
117 | | - manager = DatabaseManager(url="sqlite:///test.db") |
118 | | - await manager.initialize() |
| 119 | + manager = DatabaseManager(url="sqlite:///test.db") |
| 120 | + await manager.initialize() |
119 | 121 |
|
120 | | - assert manager._is_initialized is True |
121 | | - assert manager._engine is not None |
122 | | - mock_engine.assert_called_once() |
| 122 | + assert manager._is_initialized is True |
| 123 | + assert manager._engine is not None |
| 124 | + mock_engine.assert_called_once() |
123 | 125 |
|
124 | 126 | @pytest.mark.asyncio |
125 | 127 | async def test_initialize_already_initialized( |
126 | 128 | self, mock_settings: MagicMock |
127 | 129 | ) -> None: |
128 | 130 | """Test that initialize is idempotent.""" |
129 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
130 | | - with patch("db.connection.create_async_engine") as mock_engine: |
131 | | - mock_engine.return_value = MagicMock(spec=AsyncEngine) |
| 131 | + with ( |
| 132 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 133 | + patch("db.connection.create_async_engine") as mock_engine, |
| 134 | + ): |
| 135 | + mock_engine.return_value = MagicMock(spec=AsyncEngine) |
132 | 136 |
|
133 | | - manager = DatabaseManager(url="sqlite:///test.db") |
134 | | - await manager.initialize() |
135 | | - await manager.initialize() # Second call should be no-op |
| 137 | + manager = DatabaseManager(url="sqlite:///test.db") |
| 138 | + await manager.initialize() |
| 139 | + await manager.initialize() # Second call should be no-op |
136 | 140 |
|
137 | | - # Should only be called once |
138 | | - assert mock_engine.call_count == 1 |
| 141 | + # Should only be called once |
| 142 | + assert mock_engine.call_count == 1 |
139 | 143 |
|
140 | 144 | @pytest.mark.asyncio |
141 | 145 | async def test_initialize_failure(self, mock_settings: MagicMock) -> None: |
142 | 146 | """Test database initialization failure.""" |
143 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
144 | | - with patch( |
| 147 | + with ( |
| 148 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 149 | + patch( |
145 | 150 | "db.connection.create_async_engine", |
146 | 151 | side_effect=Exception("Connection failed"), |
147 | | - ): |
148 | | - manager = DatabaseManager(url="sqlite:///test.db") |
| 152 | + ), |
| 153 | + ): |
| 154 | + manager = DatabaseManager(url="sqlite:///test.db") |
149 | 155 |
|
150 | | - with pytest.raises(DatabaseConnectionException) as exc_info: |
151 | | - await manager.initialize() |
| 156 | + with pytest.raises(DatabaseConnectionException) as exc_info: |
| 157 | + await manager.initialize() |
152 | 158 |
|
153 | | - assert "Failed to initialize database" in str(exc_info.value.message) |
154 | | - assert manager._is_initialized is False |
| 159 | + assert "Failed to initialize database" in str(exc_info.value.message) |
| 160 | + assert manager._is_initialized is False |
155 | 161 |
|
156 | 162 | @pytest.mark.asyncio |
157 | 163 | async def test_close(self, mock_settings: MagicMock) -> None: |
@@ -221,44 +227,50 @@ def reset_global_manager(self) -> None: |
221 | 227 | @pytest.mark.asyncio |
222 | 228 | async def test_get_database_creates_manager(self, mock_settings: MagicMock) -> None: |
223 | 229 | """Test get_database creates and initializes manager.""" |
224 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
225 | | - with patch("db.connection.create_async_engine") as mock_engine: |
226 | | - mock_engine.return_value = MagicMock(spec=AsyncEngine) |
| 230 | + with ( |
| 231 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 232 | + patch("db.connection.create_async_engine") as mock_engine, |
| 233 | + ): |
| 234 | + mock_engine.return_value = MagicMock(spec=AsyncEngine) |
227 | 235 |
|
228 | | - manager = await get_database() |
| 236 | + manager = await get_database() |
229 | 237 |
|
230 | | - assert manager is not None |
231 | | - assert manager._is_initialized is True |
| 238 | + assert manager is not None |
| 239 | + assert manager._is_initialized is True |
232 | 240 |
|
233 | 241 | @pytest.mark.asyncio |
234 | 242 | async def test_get_database_returns_same_instance( |
235 | 243 | self, mock_settings: MagicMock |
236 | 244 | ) -> None: |
237 | 245 | """Test get_database returns the same instance.""" |
238 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
239 | | - with patch("db.connection.create_async_engine") as mock_engine: |
240 | | - mock_engine.return_value = MagicMock(spec=AsyncEngine) |
| 246 | + with ( |
| 247 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 248 | + patch("db.connection.create_async_engine") as mock_engine, |
| 249 | + ): |
| 250 | + mock_engine.return_value = MagicMock(spec=AsyncEngine) |
241 | 251 |
|
242 | | - manager1 = await get_database() |
243 | | - manager2 = await get_database() |
| 252 | + manager1 = await get_database() |
| 253 | + manager2 = await get_database() |
244 | 254 |
|
245 | | - assert manager1 is manager2 |
| 255 | + assert manager1 is manager2 |
246 | 256 |
|
247 | 257 | @pytest.mark.asyncio |
248 | 258 | async def test_close_database(self, mock_settings: MagicMock) -> None: |
249 | 259 | """Test close_database closes the global manager.""" |
250 | | - with patch("db.connection.get_settings", return_value=mock_settings): |
251 | | - with patch("db.connection.create_async_engine") as mock_engine: |
252 | | - mock_engine_instance = MagicMock(spec=AsyncEngine) |
253 | | - mock_engine_instance.dispose = AsyncMock() |
254 | | - mock_engine.return_value = mock_engine_instance |
| 260 | + with ( |
| 261 | + patch("db.connection.get_settings", return_value=mock_settings), |
| 262 | + patch("db.connection.create_async_engine") as mock_engine, |
| 263 | + ): |
| 264 | + mock_engine_instance = MagicMock(spec=AsyncEngine) |
| 265 | + mock_engine_instance.dispose = AsyncMock() |
| 266 | + mock_engine.return_value = mock_engine_instance |
255 | 267 |
|
256 | | - await get_database() |
257 | | - await close_database() |
| 268 | + await get_database() |
| 269 | + await close_database() |
258 | 270 |
|
259 | | - import db.connection |
| 271 | + import db.connection |
260 | 272 |
|
261 | | - assert db.connection._db_manager is None |
| 273 | + assert db.connection._db_manager is None |
262 | 274 |
|
263 | 275 | @pytest.mark.asyncio |
264 | 276 | async def test_close_database_when_not_initialized(self) -> None: |
|
0 commit comments