2025-08-24 15:13:14 -04:00
|
|
|
"""Unit tests for the backend.services.users module."""
|
|
|
|
|
|
|
|
|
|
from unittest.mock import AsyncMock
|
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from sqlalchemy import select
|
2025-08-24 16:00:51 -04:00
|
|
|
from sqlalchemy.exc import SQLAlchemyError
|
2025-08-24 15:13:14 -04:00
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
|
|
2025-10-06 12:59:10 -04:00
|
|
|
from backend.models import User # Add this import for the User model
|
2025-08-24 15:13:14 -04:00
|
|
|
from backend.services.users import get_users
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
2025-08-25 21:38:31 -04:00
|
|
|
@pytest.mark.parametrize("mock_logger", ["backend.services.users"], indirect=True)
|
2025-08-24 15:13:14 -04:00
|
|
|
async def test_get_users_success(
|
2025-10-06 12:59:10 -04:00
|
|
|
async_session: AsyncSession, sample_users: list[User], mock_logger: MagicMock
|
2025-08-24 15:13:14 -04:00
|
|
|
) -> None:
|
|
|
|
|
"""Test successful retrieval of all users from the database.
|
|
|
|
|
|
2025-08-26 15:47:08 -04:00
|
|
|
Args:
|
|
|
|
|
async_session: The asynchronous database session.
|
2025-09-22 11:54:03 -04:00
|
|
|
sample_users: The list of sample user objects to return.
|
2025-08-26 15:47:08 -04:00
|
|
|
mock_logger: The mocked logger instance.
|
2025-08-24 15:13:14 -04:00
|
|
|
"""
|
|
|
|
|
mock_scalars_result = AsyncMock()
|
2025-08-24 16:00:51 -04:00
|
|
|
mock_scalars_result.all = MagicMock(return_value=sample_users)
|
2025-08-24 15:13:14 -04:00
|
|
|
mock_scalars = AsyncMock(return_value=mock_scalars_result)
|
2025-08-26 09:45:41 -04:00
|
|
|
async_session.scalars = mock_scalars # type: ignore [method-assign]
|
2025-08-24 15:13:14 -04:00
|
|
|
|
2025-10-06 12:59:10 -04:00
|
|
|
result: list[User] = await get_users(async_session)
|
2025-08-24 15:13:14 -04:00
|
|
|
|
|
|
|
|
assert isinstance(result, list)
|
|
|
|
|
assert len(result) == 2
|
|
|
|
|
assert result == sample_users
|
|
|
|
|
async_session.scalars.assert_called_once()
|
|
|
|
|
assert async_session.scalars.call_args.args[0].compare(select(User))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
2025-08-25 21:38:31 -04:00
|
|
|
@pytest.mark.parametrize("mock_logger", ["backend.services.users"], indirect=True)
|
2025-08-24 16:00:51 -04:00
|
|
|
async def test_get_users_empty(
|
2025-08-25 21:38:31 -04:00
|
|
|
async_session: AsyncSession, mock_logger: MagicMock
|
2025-08-24 16:00:51 -04:00
|
|
|
) -> None:
|
2025-08-24 15:13:14 -04:00
|
|
|
"""Test retrieval of users when the database is empty.
|
|
|
|
|
|
2025-08-26 15:47:08 -04:00
|
|
|
Args:
|
|
|
|
|
async_session: The asynchronous database session.
|
|
|
|
|
mock_logger: The mocked logger instance.
|
2025-08-24 15:13:14 -04:00
|
|
|
"""
|
|
|
|
|
mock_scalars_result = AsyncMock()
|
2025-08-24 16:00:51 -04:00
|
|
|
mock_scalars_result.all = MagicMock(return_value=[])
|
2025-08-24 15:13:14 -04:00
|
|
|
mock_scalars = AsyncMock(return_value=mock_scalars_result)
|
2025-08-26 09:45:41 -04:00
|
|
|
async_session.scalars = mock_scalars # type: ignore [method-assign]
|
2025-08-24 15:13:14 -04:00
|
|
|
|
2025-10-06 12:59:10 -04:00
|
|
|
result: list[User] = await get_users(async_session)
|
2025-08-24 15:13:14 -04:00
|
|
|
|
|
|
|
|
assert isinstance(result, list)
|
|
|
|
|
assert len(result) == 0
|
|
|
|
|
async_session.scalars.assert_called_once()
|
|
|
|
|
assert async_session.scalars.call_args.args[0].compare(select(User))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
2025-08-25 21:38:31 -04:00
|
|
|
@pytest.mark.parametrize("mock_logger", ["backend.services.users"], indirect=True)
|
2025-08-24 15:13:14 -04:00
|
|
|
async def test_get_users_database_error(
|
2025-08-25 21:38:31 -04:00
|
|
|
async_session: AsyncSession, mock_logger: MagicMock
|
2025-08-24 15:13:14 -04:00
|
|
|
) -> None:
|
|
|
|
|
"""Test handling of database errors in get_users.
|
|
|
|
|
|
2025-08-26 15:47:08 -04:00
|
|
|
Verifies that get_users raises an exception on database failure.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
async_session: The asynchronous database session.
|
|
|
|
|
mock_logger: The mocked logger instance.
|
2025-08-24 15:13:14 -04:00
|
|
|
"""
|
2025-08-26 09:45:41 -04:00
|
|
|
async_session.scalars = AsyncMock( # type: ignore [method-assign]
|
|
|
|
|
side_effect=SQLAlchemyError("Database error")
|
|
|
|
|
)
|
2025-08-24 15:13:14 -04:00
|
|
|
|
2025-08-24 16:00:51 -04:00
|
|
|
with pytest.raises(SQLAlchemyError):
|
2025-08-24 15:13:14 -04:00
|
|
|
await get_users(async_session)
|
|
|
|
|
async_session.scalars.assert_called_once()
|