from unittest.mock import AsyncMock, MagicMock, patch import pytest from scribe.mcp._context import _user_id_ctx @pytest.fixture(autouse=True) def _bind_user(): token = _user_id_ctx.set(7) yield _user_id_ctx.reset(token) def _fake_note(task_kind="work"): n = MagicMock() n.to_dict.return_value = {"id": 1, "title": "T", "task_kind": task_kind} return n @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