diff --git a/src/a2a/server/tasks/task_manager.py b/src/a2a/server/tasks/task_manager.py index 5474e155..cf763396 100644 --- a/src/a2a/server/tasks/task_manager.py +++ b/src/a2a/server/tasks/task_manager.py @@ -41,6 +41,9 @@ def __init__( initial_message: The `Message` that initiated the task, if any. Used when creating a new task object. """ + if task_id is not None and not (isinstance(task_id, str) and task_id): + raise ValueError('Task ID must be a non-empty string') + self.task_id = task_id self.context_id = context_id self.task_store = task_store diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index 95297971..0f32864b 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -45,6 +45,20 @@ def task_manager(mock_task_store: AsyncMock) -> TaskManager: ) +@pytest.mark.parametrize('invalid_task_id', ['', 123]) +def test_task_manager_invalid_task_id( + mock_task_store: AsyncMock, invalid_task_id: Any +): + """Test that TaskManager raises ValueError for an invalid task_id.""" + with pytest.raises(ValueError, match='Task ID must be a non-empty string'): + TaskManager( + task_id=invalid_task_id, + context_id='test_context', + task_store=mock_task_store, + initial_message=None, + ) + + @pytest.mark.asyncio async def test_get_task_existing( task_manager: TaskManager, mock_task_store: AsyncMock