diff --git a/test_mcp_labels.py b/test_mcp_labels.py new file mode 100644 index 0000000..636f621 --- /dev/null +++ b/test_mcp_labels.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +""" +Test MCP Server Label Fetching +Verifies that the Gitea MCP server can fetch all 43 labels (27 org + 16 repo) +""" +import sys +import os +import asyncio + +# Add mcp-servers/gitea to path +sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'mcp-servers', 'gitea')) + +from mcp_server.gitea_client import GiteaClient +from mcp_server.tools.labels import LabelTools + +async def test_label_fetching(): + """Test that MCP server can fetch all labels""" + print("="*60) + print("Testing MCP Server Label Fetching") + print("="*60) + + # Initialize client (loads from ~/.config/claude/gitea.env and .env) + print("\n1. Initializing Gitea client...") + print(" Loading configuration from:") + print(" - System: ~/.config/claude/gitea.env") + print(" - Project: .env") + + client = GiteaClient() + print(f" ✅ Client initialized") + print(f" - API URL: {client.base_url}") + print(f" - Owner: {client.owner}") + print(f" - Repo: {client.repo}") + print(f" - Mode: {client.mode}") + + # Initialize label tools + print("\n2. Initializing label tools...") + label_tools = LabelTools(client) + print(" ✅ Label tools initialized") + + # Fetch all labels + print("\n3. Fetching labels from Gitea...") + result = await label_tools.get_labels() + + org_labels = result['organization'] + repo_labels = result['repository'] + total_count = result['total_count'] + + print(f" ✅ Labels fetched successfully") + print(f" - Organization labels: {len(org_labels)}") + print(f" - Repository labels: {len(repo_labels)}") + print(f" - Total: {total_count}") + + # Verify counts + print("\n4. Verifying label counts...") + expected_org = 27 + expected_repo = 16 + expected_total = 43 + + all_passed = True + + if len(org_labels) == expected_org: + print(f" ✅ Organization labels: {len(org_labels)} (expected: {expected_org})") + else: + print(f" ❌ Organization labels: {len(org_labels)} (expected: {expected_org})") + all_passed = False + + if len(repo_labels) == expected_repo: + print(f" ✅ Repository labels: {len(repo_labels)} (expected: {expected_repo})") + else: + print(f" ❌ Repository labels: {len(repo_labels)} (expected: {expected_repo})") + all_passed = False + + if total_count == expected_total: + print(f" ✅ Total labels: {total_count} (expected: {expected_total})") + else: + print(f" ❌ Total labels: {total_count} (expected: {expected_total})") + all_passed = False + + # Show label breakdown + print("\n5. Label Breakdown:") + + # Categorize org labels + org_categories = {} + for label in org_labels: + category = label['name'].split('/')[0] + if category not in org_categories: + org_categories[category] = [] + org_categories[category].append(label['name']) + + print("\n Organization Labels by Category:") + for category, labels in sorted(org_categories.items()): + print(f" - {category}: {len(labels)} labels") + for label in sorted(labels): + print(f" • {label}") + + # Categorize repo labels + repo_categories = {} + for label in repo_labels: + category = label['name'].split('/')[0] + if category not in repo_categories: + repo_categories[category] = [] + repo_categories[category].append(label['name']) + + print("\n Repository Labels by Category:") + for category, labels in sorted(repo_categories.items()): + print(f" - {category}: {len(labels)} labels") + for label in sorted(labels): + print(f" • {label}") + + # Test label suggestion + print("\n6. Testing Label Suggestion:") + test_contexts = [ + "Fix critical bug in authentication service causing login failures", + "Add new feature to export reports to PDF format", + "Refactor backend API to extract authentication service" + ] + + for context in test_contexts: + suggested = await label_tools.suggest_labels(context) + print(f"\n Context: \"{context}\"") + print(f" Suggested labels: {', '.join(suggested)}") + + # Final result + print("\n" + "="*60) + if all_passed: + print("✅ SUCCESS: MCP Server can fetch all 43 labels correctly!") + print("="*60) + return 0 + else: + print("❌ FAILED: Label count mismatch detected") + print("="*60) + return 1 + +if __name__ == "__main__": + exit_code = asyncio.run(test_label_fetching()) + sys.exit(exit_code)