test_server.py•6.07 kB
"""Tests for the GitHub MCP Server."""
import pytest
from unittest.mock import patch, MagicMock
import server
def test_app_metadata():
"""Test that the app has correct metadata."""
assert server.app.name == server.APP_NAME
assert server.app.instructions == server.APP_DESCRIPTION
@patch('server.make_github_request')
def test_search_repositories_success(mock_request):
"""Test successful repository search."""
# Mock GitHub API response
mock_response = {
"total_count": 1,
"items": [{
"name": "test-repo",
"full_name": "user/test-repo",
"description": "A test repository",
"html_url": "https://github.com/user/test-repo",
"stargazers_count": 100,
"forks_count": 10,
"language": "Python",
"updated_at": "2024-01-01T00:00:00Z",
"created_at": "2023-01-01T00:00:00Z",
"topics": ["python", "test"]
}]
}
mock_request.return_value = mock_response
result = server.search_repositories("python", "stars", "desc", 10)
assert result["total_count"] == 1
assert len(result["repositories"]) == 1
assert result["repositories"][0]["name"] == "test-repo"
assert result["query"] == "python"
def test_search_repositories_empty_query():
"""Test search with empty query."""
result = server.search_repositories("")
assert "error" in result
assert result["error"] == "Query cannot be empty"
@patch('server.make_github_request')
def test_get_user_repositories_success(mock_request):
"""Test successful user repository retrieval."""
mock_response = [{
"name": "user-repo",
"full_name": "username/user-repo",
"description": "User's repository",
"html_url": "https://github.com/username/user-repo",
"stargazers_count": 50,
"forks_count": 5,
"language": "JavaScript",
"updated_at": "2024-01-01T00:00:00Z",
"created_at": "2023-01-01T00:00:00Z",
"private": False,
"topics": ["javascript"]
}]
mock_request.return_value = mock_response
result = server.get_user_repositories("username", "public", "updated")
assert result["username"] == "username"
assert result["total_repositories"] == 1
assert len(result["repositories"]) == 1
assert result["repositories"][0]["name"] == "user-repo"
def test_get_user_repositories_empty_username():
"""Test get user repositories with empty username."""
result = server.get_user_repositories("")
assert "error" in result
assert result["error"] == "Username cannot be empty"
@patch('server.make_github_request')
def test_get_repository_details_success(mock_request):
"""Test successful repository details retrieval."""
mock_response = {
"name": "repo",
"full_name": "owner/repo",
"description": "A repository",
"html_url": "https://github.com/owner/repo",
"stargazers_count": 200,
"forks_count": 20,
"watchers_count": 150,
"language": "Python",
"languages_url": "https://api.github.com/repos/owner/repo/languages",
"created_at": "2023-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"pushed_at": "2024-01-01T00:00:00Z",
"size": 1000,
"open_issues_count": 5,
"license": {"name": "MIT"},
"topics": ["python"],
"default_branch": "main",
"private": False,
"fork": False
}
mock_request.return_value = mock_response
result = server.get_repository_details("owner", "repo")
assert result["name"] == "repo"
assert result["full_name"] == "owner/repo"
assert result["stars"] == 200
assert result["license"] == "MIT"
def test_get_repository_details_empty_params():
"""Test get repository details with empty parameters."""
result = server.get_repository_details("", "repo")
assert "error" in result
assert result["error"] == "Owner and repository name cannot be empty"
result = server.get_repository_details("owner", "")
assert "error" in result
assert result["error"] == "Owner and repository name cannot be empty"
@patch('server.make_github_request')
def test_get_trending_repositories_success(mock_request):
"""Test successful trending repositories retrieval."""
mock_response = {
"total_count": 1,
"items": [{
"name": "trending-repo",
"full_name": "user/trending-repo",
"description": "A trending repository",
"html_url": "https://github.com/user/trending-repo",
"stargazers_count": 1000,
"forks_count": 100,
"language": "Python",
"updated_at": "2024-01-01T00:00:00Z",
"created_at": "2023-01-01T00:00:00Z",
"topics": ["python", "trending"]
}]
}
mock_request.return_value = mock_response
result = server.get_trending_repositories("daily", "python")
assert result["period"] == "daily"
assert result["language_filter"] == "python"
assert result["total_count"] == 1
assert len(result["repositories"]) == 1
assert result["repositories"][0]["name"] == "trending-repo"
@patch('server.requests.get')
def test_make_github_request_success(mock_get):
"""Test successful GitHub API request."""
mock_response = MagicMock()
mock_response.json.return_value = {"test": "data"}
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
result = server.make_github_request("/test/endpoint")
assert result == {"test": "data"}
mock_get.assert_called_once()
@patch('server.requests.get')
def test_make_github_request_failure(mock_get):
"""Test failed GitHub API request."""
mock_get.side_effect = Exception("Network error")
with pytest.raises(Exception) as exc_info:
server.make_github_request("/test/endpoint")
assert "GitHub API request failed" in str(exc_info.value)