Skip to main content
Glama

TimeLooker MCP Server

test_api_integration.py6.61 kB
""" API Integration Tests for TimeLooker FastAPI server. Tests the actual HTTP endpoints and database integration. """ import asyncio import json import os import sys import unittest from unittest.mock import patch, Mock sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import httpx from src.core.models import db_manager from src.utils.logging_config import setup_logging logger = setup_logging(__name__) class TestAPIIntegration(unittest.TestCase): """Test FastAPI server integration.""" @classmethod def setUpClass(cls): """Set up test database and environment.""" # Use in-memory SQLite for testing cls.test_env_vars = { 'DATABASE_URL': 'sqlite:///:memory:', 'OPENAI_API_KEY': 'test-key', 'PAY_TO_ADDRESS': '0x671cE47E4F38051ba3A990Ba306E2885C2Fe4102', 'X402_NETWORK': 'base-sepolia', 'TASK_CREATION_PRICE': '$1.00' } cls.env_patcher = patch.dict(os.environ, cls.test_env_vars) cls.env_patcher.start() # Initialize test database db_manager.create_tables() # API server base URL (assumes server is running on localhost:8000) cls.base_url = "http://localhost:8000" @classmethod def tearDownClass(cls): """Clean up after all tests.""" cls.env_patcher.stop() async def test_health_endpoint(self): """Test the health check endpoint.""" async with httpx.AsyncClient() as client: try: response = await client.get(f"{self.base_url}/health") if response.status_code == 200: data = response.json() self.assertIn("status", data) self.assertEqual(data["status"], "healthy") logger.info("✓ Health endpoint test passed") else: logger.warning(f"Health endpoint returned {response.status_code} - API server may not be running") except httpx.ConnectError: logger.warning("Could not connect to API server - make sure it's running on localhost:8000") async def test_get_tasks_endpoint(self): """Test the get tasks endpoint (free endpoint).""" async with httpx.AsyncClient() as client: try: response = await client.get(f"{self.base_url}/tasks/") # Should work without payment for GET requests if response.status_code == 200: data = response.json() self.assertIn("tasks", data) self.assertIsInstance(data["tasks"], list) logger.info("✓ Get tasks endpoint test passed") else: logger.warning(f"Get tasks endpoint returned {response.status_code}") except httpx.ConnectError: logger.warning("Could not connect to API server for tasks test") async def test_create_task_payment_required(self): """Test that create task endpoint requires payment.""" task_data = { "task_description": "Test monitoring task for API integration", "frequency_minutes": 60, "runtime_minutes": 1440, "recipient_email": "test@example.com" } async with httpx.AsyncClient() as client: try: response = await client.post( f"{self.base_url}/tasks/", json=task_data ) # Should return 402 Payment Required if response.status_code == 402: logger.info("✓ Create task payment requirement test passed") elif response.status_code == 500: logger.info("✓ Create task endpoint accessible (500 likely due to missing payment)") else: logger.warning(f"Unexpected status code: {response.status_code}") except httpx.ConnectError: logger.warning("Could not connect to API server for create task test") def test_database_models(self): """Test that database models work correctly.""" from src.core.models import Task, SearchResult, Execution from src.core.models import get_db_session session = get_db_session() try: # Test creating a task task = Task( task_description="Test task for model validation", frequency_minutes=30, runtime_minutes=120, recipient_email="test@example.com", sender_email="sender@example.com" ) session.add(task) session.commit() # Verify task was created retrieved_task = session.query(Task).filter_by( task_description="Test task for model validation" ).first() self.assertIsNotNone(retrieved_task) self.assertEqual(retrieved_task.frequency_minutes, 30) self.assertEqual(retrieved_task.runtime_minutes, 120) logger.info("✓ Database models test passed") finally: session.close() def run_api_integration_tests(): """Run API integration tests.""" print("🌐 API INTEGRATION TESTS") print("=" * 60) print("Note: These tests require the API server to be running on localhost:8000") print("Start server with: python run_api_server.py") print("=" * 60) # Create test instance test_instance = TestAPIIntegration() test_instance.setUpClass() try: # Run sync tests test_instance.test_database_models() # Run async tests async def run_async_tests(): await test_instance.test_health_endpoint() await test_instance.test_get_tasks_endpoint() await test_instance.test_create_task_payment_required() print("\n✅ All API integration tests completed!") asyncio.run(run_async_tests()) except Exception as e: print(f"\n❌ API integration tests failed: {e}") return False finally: test_instance.tearDownClass() return True if __name__ == "__main__": success = run_api_integration_tests() sys.exit(0 if success else 1)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fortnightly-devs/mcp-x402-task-scheduler'

If you have feedback or need assistance with the MCP directory API, please join our Discord server