from unittest.mock import AsyncMock, patch import pytest from tests.helpers import fake_note pytestmark = pytest.mark.usefixtures("_bind_user") @pytest.mark.asyncio async def test_create_task_passes_kind(): # kind=plan is retired (plans are milestones); 'issue' exercises passthrough. mock = AsyncMock(return_value=fake_note(task_kind="issue")) with patch("scribe.mcp.tools.tasks.notes_svc.create_note", mock): from scribe.mcp.tools.tasks import create_task await create_task(title="P", kind="issue") assert mock.call_args.kwargs["task_kind"] == "issue" @pytest.mark.asyncio async def test_list_tasks_passes_kind_filter(): mock = AsyncMock(return_value=([], 0)) with patch("scribe.mcp.tools.tasks.notes_svc.list_notes", mock): from scribe.mcp.tools.tasks import list_tasks await list_tasks(kind="plan") assert mock.call_args.kwargs["task_kind"] == "plan" @pytest.mark.asyncio async def test_list_tasks_kind_empty_means_no_filter(): mock = AsyncMock(return_value=([], 0)) with patch("scribe.mcp.tools.tasks.notes_svc.list_notes", mock): from scribe.mcp.tools.tasks import list_tasks await list_tasks() assert mock.call_args.kwargs["task_kind"] is None @pytest.mark.asyncio async def test_create_task_passes_spike(): """The kind a failed rule-check asks for (milestone 312). Time-boxed, and its output is knowledge rather than a change — filing one as `work` makes a finished investigation look like an abandoned change. """ mock = AsyncMock(return_value=fake_note(task_kind="spike")) with patch("scribe.mcp.tools.tasks.notes_svc.create_note", mock): from scribe.mcp.tools.tasks import create_task await create_task(title="Can the runner be given a bash shell?", kind="spike") assert mock.call_args.kwargs["task_kind"] == "spike"