| """ |
| Performance Tests for MCP Tools |
| |
| Tests performance characteristics of all MCP tools: |
| - list_tasks completes in <500ms for 1000 tasks |
| - create_task completes in <100ms |
| - mark_complete completes in <100ms |
| - update_task completes in <100ms |
| - delete_task completes in <100ms |
| """ |
|
|
| import pytest |
| import time |
|
|
| from src.tools.list_tasks import list_tasks_internal |
| from src.tools.create_task import create_task_internal |
| from src.tools.mark_complete import mark_complete_internal |
| from src.tools.update_task import update_task_internal |
| from src.tools.delete_task import delete_task_internal |
| from tests.utils.task_helpers import create_multiple_tasks, create_test_task |
|
|
|
|
| @pytest.mark.performance |
| @pytest.mark.asyncio |
| async def test_list_tasks_completes_in_under_500ms_for_1000_tasks(mock_mcp_context, test_session): |
| """ |
| Test: list_tasks completes in <500ms for 1000 tasks |
| |
| Verifies that list_tasks meets performance target with large dataset. |
| """ |
| |
| create_multiple_tasks(test_session, mock_mcp_context.user_id, count=1000, title_prefix="Task") |
|
|
| |
| start_time = time.time() |
| result = await list_tasks_internal(ctx=mock_mcp_context) |
| duration_ms = (time.time() - start_time) * 1000 |
|
|
| |
| assert result["total"] == 1000 |
| assert duration_ms < 500, f"list_tasks took {duration_ms}ms, expected <500ms" |
|
|
|
|
| @pytest.mark.performance |
| @pytest.mark.asyncio |
| async def test_create_task_completes_in_under_100ms(mock_mcp_context): |
| """ |
| Test: create_task completes in <100ms |
| |
| Verifies that create_task meets performance target. |
| """ |
| |
| start_time = time.time() |
| result = await create_task_internal( |
| ctx=mock_mcp_context, |
| title="Performance test task" |
| ) |
| duration_ms = (time.time() - start_time) * 1000 |
|
|
| |
| assert result["status"] == "success" |
| assert duration_ms < 100, f"create_task took {duration_ms}ms, expected <100ms" |
|
|
|
|
| @pytest.mark.performance |
| @pytest.mark.asyncio |
| async def test_mark_complete_completes_in_under_100ms(mock_mcp_context, test_session): |
| """ |
| Test: mark_complete completes in <100ms |
| |
| Verifies that mark_complete meets performance target. |
| """ |
| |
| task = create_test_task(test_session, mock_mcp_context.user_id, title="Test") |
|
|
| |
| start_time = time.time() |
| result = await mark_complete_internal( |
| ctx=mock_mcp_context, |
| task_id=task.id |
| ) |
| duration_ms = (time.time() - start_time) * 1000 |
|
|
| |
| assert result["status"] == "success" |
| assert duration_ms < 100, f"mark_complete took {duration_ms}ms, expected <100ms" |
|
|
|
|
| @pytest.mark.performance |
| @pytest.mark.asyncio |
| async def test_update_task_completes_in_under_100ms(mock_mcp_context, test_session): |
| """ |
| Test: update_task completes in <100ms |
| |
| Verifies that update_task meets performance target. |
| """ |
| |
| task = create_test_task(test_session, mock_mcp_context.user_id, title="Test") |
|
|
| |
| start_time = time.time() |
| result = await update_task_internal( |
| ctx=mock_mcp_context, |
| task_id=task.id, |
| title="Updated" |
| ) |
| duration_ms = (time.time() - start_time) * 1000 |
|
|
| |
| assert result["status"] == "success" |
| assert duration_ms < 100, f"update_task took {duration_ms}ms, expected <100ms" |
|
|
|
|
| @pytest.mark.performance |
| @pytest.mark.asyncio |
| async def test_delete_task_completes_in_under_100ms(mock_mcp_context, test_session): |
| """ |
| Test: delete_task completes in <100ms |
| |
| Verifies that delete_task meets performance target. |
| """ |
| |
| task = create_test_task(test_session, mock_mcp_context.user_id, title="Test") |
|
|
| |
| start_time = time.time() |
| result = await delete_task_internal( |
| ctx=mock_mcp_context, |
| task_id=task.id |
| ) |
| duration_ms = (time.time() - start_time) * 1000 |
|
|
| |
| assert result["status"] == "success" |
| assert duration_ms < 100, f"delete_task took {duration_ms}ms, expected <100ms" |
|
|