#!/usr/bin/env python3
import sys
import os
import unittest
from unittest.mock import patch, MagicMock
import json
# Add parent directory to path to import server
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from server import SleeperMCP
class TestSleeperMCP(unittest.TestCase):
"""Test cases for SleeperMCP class."""
def setUp(self):
"""Set up test fixtures."""
self.mcp = SleeperMCP()
@patch('requests.get')
def test_get_user_info(self, mock_get):
"""Test getUserInfo tool."""
# Mock response
mock_response = MagicMock()
mock_response.json.return_value = {
"username": "sleeperuser",
"user_id": "12345678",
"display_name": "SleeperUser",
"avatar": "cc12ec49965eb7856f84d71cf85306af"
}
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
# Call method
result = self.mcp.get_user_info({"username_or_user_id": "sleeperuser"})
# Assertions
mock_get.assert_called_once_with("https://api.sleeper.app/v1/user/sleeperuser")
self.assertEqual(result["username"], "sleeperuser")
self.assertEqual(result["user_id"], "12345678")
@patch('requests.get')
def test_get_user_leagues(self, mock_get):
"""Test getUserLeagues tool."""
# Mock response
mock_response = MagicMock()
mock_response.json.return_value = [
{
"league_id": "123456789",
"name": "Test League",
"season": "2023",
"total_rosters": 12
}
]
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
# Call method
result = self.mcp.get_user_leagues({
"user_id": "12345678",
"sport": "nfl",
"season": "2023"
})
# Assertions
mock_get.assert_called_once_with("https://api.sleeper.app/v1/user/12345678/leagues/nfl/2023")
self.assertEqual(len(result), 1)
self.assertEqual(result[0]["league_id"], "123456789")
@patch('requests.get')
def test_get_league_info(self, mock_get):
"""Test getLeagueInfo tool."""
# Mock response
mock_response = MagicMock()
mock_response.json.return_value = {
"league_id": "123456789",
"name": "Test League",
"season": "2023",
"total_rosters": 12
}
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
# Call method
result = self.mcp.get_league_info({"league_id": "123456789"})
# Assertions
mock_get.assert_called_once_with("https://api.sleeper.app/v1/league/123456789")
self.assertEqual(result["league_id"], "123456789")
@patch('requests.get')
def test_get_trending_players(self, mock_get):
"""Test getTrendingPlayers tool."""
# Mock response
mock_response = MagicMock()
mock_response.json.return_value = [
{"player_id": "1111", "count": 45},
{"player_id": "2222", "count": 30}
]
mock_response.raise_for_status.return_value = None
mock_get.return_value = mock_response
# Call method
result = self.mcp.get_trending_players({
"sport": "nfl",
"type": "add",
"lookback_hours": 24,
"limit": 10
})
# Assertions
mock_get.assert_called_once_with("https://api.sleeper.app/v1/players/nfl/trending/add?lookback_hours=24&limit=10")
self.assertEqual(len(result), 2)
self.assertEqual(result[0]["player_id"], "1111")
def test_handle_message_list_tools(self):
"""Test handling listTools method."""
# Create message
message = {
"jsonrpc": "2.0",
"id": 1,
"method": "listTools"
}
# Call method
result = self.mcp.handle_message(message)
# Assertions
self.assertEqual(result["jsonrpc"], "2.0")
self.assertEqual(result["id"], 1)
self.assertIn("result", result)
self.assertIsInstance(result["result"], list)
# Check if all tools are listed
tool_names = [tool["name"] for tool in result["result"]]
self.assertIn("getUserInfo", tool_names)
self.assertIn("getLeagueInfo", tool_names)
self.assertIn("getTrendingPlayers", tool_names)
def test_handle_message_invalid_method(self):
"""Test handling an invalid method."""
# Create message
message = {
"jsonrpc": "2.0",
"id": 1,
"method": "invalidMethod"
}
# Call method
result = self.mcp.handle_message(message)
# Assertions
self.assertEqual(result["jsonrpc"], "2.0")
self.assertEqual(result["id"], 1)
self.assertIn("error", result)
self.assertEqual(result["error"]["code"], -32601) # Method not found
def test_handle_message_invalid_jsonrpc(self):
"""Test handling message with invalid JSON-RPC version."""
# Create message
message = {
"jsonrpc": "1.0",
"id": 1,
"method": "listTools"
}
# Call method
result = self.mcp.handle_message(message)
# Assertions
self.assertEqual(result["jsonrpc"], "2.0")
self.assertEqual(result["id"], 1)
self.assertIn("error", result)
self.assertEqual(result["error"]["code"], -32600) # Invalid Request
def run_tests():
"""Run the tests."""
unittest.main()
if __name__ == "__main__":
run_tests()