45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""Tests for the shared background task database helper."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
|
|
from app.tasks.db import task_db
|
|
|
|
|
|
class FakeSettings:
|
|
database_path = "/tmp/fake.db"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_task_db_opens_and_closes_connection() -> None:
|
|
"""``task_db`` must open a DB connection and close it after use."""
|
|
fake_db = AsyncMock()
|
|
fake_db.close = AsyncMock()
|
|
|
|
with patch("app.tasks.db.open_db", new_callable=AsyncMock, return_value=fake_db) as mock_open_db:
|
|
async with task_db(FakeSettings()) as db:
|
|
assert db is fake_db
|
|
|
|
mock_open_db.assert_awaited_once_with("/tmp/fake.db")
|
|
fake_db.close.assert_awaited_once()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_task_db_closes_connection_on_exception() -> None:
|
|
"""``task_db`` must close the connection even when the body raises."""
|
|
fake_db = AsyncMock()
|
|
fake_db.close = AsyncMock()
|
|
|
|
with patch(
|
|
"app.tasks.db.open_db",
|
|
new_callable=AsyncMock,
|
|
return_value=fake_db,
|
|
), pytest.raises(RuntimeError, match="boom"):
|
|
async with task_db(FakeSettings()):
|
|
raise RuntimeError("boom")
|
|
|
|
fake_db.close.assert_awaited_once()
|