from datetime import datetime, timezone from unittest.mock import AsyncMock, MagicMock import pytest from sqlalchemy.ext.asyncio import AsyncSession from src.repository.auditlog_repository import AuditLogRepository def _result_with_scalars(items): result = MagicMock() scalars = MagicMock() scalars.first.return_value = items[0] if items else None scalars.all.return_value = items result.scalars.return_value = scalars return result @pytest.fixture def mock_db(): return AsyncMock(spec=AsyncSession) @pytest.fixture def repository(mock_db): return AuditLogRepository(mock_db) @pytest.mark.asyncio async def test_get_returns_audit_log(repository, mock_db): row = MagicMock(id=10, user_id=1, event_type="WRITE") mock_db.execute.return_value = _result_with_scalars([row]) result = await repository.get(10) assert result is row mock_db.execute.assert_awaited_once() @pytest.mark.asyncio async def test_get_returns_none_for_missing_id(repository, mock_db): mock_db.execute.return_value = _result_with_scalars([]) result = await repository.get(999999) assert result is None @pytest.mark.asyncio async def test_get_all_applies_filters(repository, mock_db): row = MagicMock(id=11, user_id=2, org_unit_id=7, event_type="UPDATE") mock_db.execute.return_value = _result_with_scalars([row]) result = await repository.get_all( limit=10, offset=5, user_id=2, org_unit_id=7, task_id=3, form_id=4, event_type="UPDATE", date_from=datetime(2026, 1, 1, tzinfo=timezone.utc), date_to=datetime(2026, 12, 31, tzinfo=timezone.utc), ) assert result == [row] mock_db.execute.assert_awaited_once()