test_validate.py•4.63 kB
"""Tests for mcp_validate tool."""
import pytest
from unittest.mock import AsyncMock, patch
class TestMcpValidate:
"""Test validation functionality."""
@pytest.mark.asyncio
async def test_validate_invalid_tool(self):
"""Test validation of invalid tool name."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(tool="invalid", params={})
assert "valid:false" in result
assert "INVALID_TOOL" in result
@pytest.mark.asyncio
async def test_validate_read_missing_mode(self):
"""Test validation of read without mode."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(tool="read", params={})
assert "valid:false" in result
assert "MISSING_PARAM" in result
assert "mode" in result
@pytest.mark.asyncio
async def test_validate_read_valid_tree(self):
"""Test validation of valid tree read."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(
tool="read",
params={"mode": "tree", "max_depth": 2}
)
assert "valid:true" in result
assert "estimated_tokens" in result
@pytest.mark.asyncio
async def test_validate_read_list_missing_tab(self):
"""Test validation of list mode without tab."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(
tool="read",
params={"mode": "list"}
)
assert "valid:false" in result
assert "tab" in result
@pytest.mark.asyncio
async def test_validate_read_item_tab_not_found(self):
"""Test validation with non-existent tab."""
from mcp_copyq.tools.validate import mcp_validate
with patch("mcp_copyq.tools.validate.client") as mock:
mock.tab_exists = AsyncMock(return_value=False)
result = await mcp_validate(
tool="read",
params={"mode": "item", "tab": "nonexistent", "index": 0}
)
assert "valid:false" in result
assert "TAB_NOT_FOUND" in result
@pytest.mark.asyncio
async def test_validate_read_index_out_of_bounds(self):
"""Test validation with invalid index."""
from mcp_copyq.tools.validate import mcp_validate
with patch("mcp_copyq.tools.validate.client") as mock:
mock.tab_exists = AsyncMock(return_value=True)
mock.get_count = AsyncMock(return_value=5)
result = await mcp_validate(
tool="read",
params={"mode": "item", "tab": "info", "index": 10}
)
assert "valid:false" in result
assert "INDEX_OUT_OF_BOUNDS" in result
@pytest.mark.asyncio
async def test_validate_write_add_valid(self):
"""Test validation of valid add."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(
tool="write",
params={"mode": "add", "tab": "info", "text": "New item"}
)
assert "valid:true" in result
@pytest.mark.asyncio
async def test_validate_write_update_missing_field(self):
"""Test validation of update without field."""
from mcp_copyq.tools.validate import mcp_validate
with patch("mcp_copyq.tools.validate.client") as mock:
mock.tab_exists = AsyncMock(return_value=True)
mock.get_count = AsyncMock(return_value=5)
result = await mcp_validate(
tool="write",
params={"mode": "update", "tab": "info", "index": 0}
)
assert "valid:false" in result
assert "field" in result
@pytest.mark.asyncio
async def test_validate_write_tab_create_permission(self):
"""Test validation of tab_create permission."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(
tool="write",
params={"mode": "tab_create", "path": "info/subtab"}
)
assert "valid:false" in result
assert "PERMISSION_DENIED" in result
@pytest.mark.asyncio
async def test_validate_warnings(self):
"""Test validation returns warnings."""
from mcp_copyq.tools.validate import mcp_validate
result = await mcp_validate(
tool="read",
params={"mode": "tree", "max_depth": 15} # exceeds limit
)
# Should still be valid but with warning
assert "valid:true" in result
assert "warnings" in result