from datetime import datetime, timezone from unittest.mock import AsyncMock, MagicMock from uuid import UUID, uuid4 import pytest from core.auth.models import CurrentUser from models.todos import Todo, TodoStatus from v1.todo.schemas import TodoUpdate from v1.todo.service import TodoService def _create_mock_todo() -> Todo: todo = MagicMock(spec=Todo) todo.id = uuid4() todo.owner_id = UUID("00000000-0000-0000-0000-000000000001") todo.title = "Test Todo" todo.description = None todo.priority = 1 todo.order = 0 todo.status = TodoStatus.PENDING todo.completed_at = None now = datetime(2026, 3, 20, 8, 0, 0, tzinfo=timezone.utc) todo.created_at = now todo.updated_at = now return todo @pytest.mark.asyncio async def test_update_refreshes_todo_before_building_response() -> None: user_id = UUID("00000000-0000-0000-0000-000000000001") todo = _create_mock_todo() repository = AsyncMock() repository.get_by_id.return_value = todo repository.update.return_value = todo repository.get_schedule_items.return_value = [] schedule_item_repository = AsyncMock() session = AsyncMock() service = TodoService( repository=repository, schedule_item_repository=schedule_item_repository, session=session, current_user=CurrentUser(id=user_id), ) await service.update( todo.id, TodoUpdate( title="Updated", description=None, priority=None, order=None, status=None, schedule_item_ids=None, ), ) session.commit.assert_awaited_once() session.refresh.assert_awaited_once_with(todo)