"""Unit tests for search_processes MCP tool.
Tests the search_processes tool implementation per mcp-tools.json contract.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from pathlib import Path
class TestSearchProcessesImpl:
"""Tests for search_processes_impl function (T023)."""
def test_search_processes_impl_success(self, temp_dir: Path) -> None:
"""Test successful process search."""
from sso_mcp_server.processes.service import ProcessService
from sso_mcp_server.tools.search_processes import search_processes_impl
(temp_dir / "deploy.md").write_text(
"""---
name: Deployment Process
description: How to deploy
---
Deploy to production.
"""
)
(temp_dir / "review.md").write_text(
"""---
name: Code Review
description: Review code
---
Review process.
"""
)
service = ProcessService(temp_dir)
result = search_processes_impl("deploy", service)
assert "error" not in result
assert result["query"] == "deploy"
assert result["count"] >= 1
assert result["total_processes"] == 2
assert "results" in result
assert result["results"][0]["name"] == "Deployment Process"
def test_search_processes_impl_no_matches(self, temp_dir: Path) -> None:
"""Test search with no matches returns message."""
from sso_mcp_server.processes.service import ProcessService
from sso_mcp_server.tools.search_processes import search_processes_impl
(temp_dir / "test.md").write_text(
"""---
name: Test Process
---
Content.
"""
)
service = ProcessService(temp_dir)
result = search_processes_impl("nonexistent", service)
assert "error" not in result
assert result["count"] == 0
assert result["results"] == []
assert "message" in result # Should have helpful message
def test_search_processes_impl_includes_relevance(self, temp_dir: Path) -> None:
"""Test that search results include relevance score."""
from sso_mcp_server.processes.service import ProcessService
from sso_mcp_server.tools.search_processes import search_processes_impl
(temp_dir / "deploy.md").write_text(
"""---
name: Deploy Guide
description: Deployment guide
---
Deploy steps.
"""
)
service = ProcessService(temp_dir)
result = search_processes_impl("deploy", service)
assert len(result["results"]) == 1
assert "relevance_score" in result["results"][0]
assert result["results"][0]["relevance_score"] > 0
def test_search_processes_impl_includes_snippet(self, temp_dir: Path) -> None:
"""Test that search results include content snippets."""
from sso_mcp_server.processes.service import ProcessService
from sso_mcp_server.tools.search_processes import search_processes_impl
(temp_dir / "guide.md").write_text(
"""---
name: Guide
---
This guide covers deployment in detail.
"""
)
service = ProcessService(temp_dir)
result = search_processes_impl("deployment", service)
assert len(result["results"]) == 1
assert "snippet" in result["results"][0]
def test_search_processes_impl_max_50_results(self, temp_dir: Path) -> None:
"""Test that search returns max 50 results (FR-012a)."""
from sso_mcp_server.processes.service import ProcessService
from sso_mcp_server.tools.search_processes import search_processes_impl
# Create 60 files
for i in range(60):
(temp_dir / f"process-{i}.md").write_text(
f"""---
name: Process {i}
description: keyword test
---
Content with keyword.
"""
)
service = ProcessService(temp_dir)
result = search_processes_impl("keyword", service)
assert result["count"] <= 50
assert len(result["results"]) <= 50
assert result["total_processes"] == 60