mockapi/example_usage.py
2026-03-16 05:47:01 +00:00

145 lines
4.6 KiB
Python

#!/usr/bin/env python3
"""
Example integration test for the Configurable Mock API.
This script demonstrates the core functionality:
1. Starting the FastAPI app (via TestClient)
2. Admin login
3. Creating a mock endpoint
4. Calling the endpoint and verifying response
5. Cleaning up (deleting the endpoint)
Run with: python example_usage_fixed.py
"""
import asyncio
import sys
import os
import json
import logging
# Suppress debug logs for cleaner output
logging.basicConfig(level=logging.WARNING)
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)
logging.getLogger('aiosqlite').setLevel(logging.WARNING)
logging.getLogger('httpx').setLevel(logging.WARNING)
logging.getLogger('asyncio').setLevel(logging.WARNING)
# Set environment variables for testing
os.environ['DEBUG'] = 'True'
os.environ['ADMIN_PASSWORD'] = 'admin123'
os.environ['SECRET_KEY'] = 'test-secret-key'
# Add current directory to path
sys.path.insert(0, '.')
from app import app
from fastapi.testclient import TestClient
from database import init_db
async def setup_database():
"""Initialize database tables."""
print(" Initializing database...")
await init_db()
print(" Database initialized")
def main():
"""Run the integration test."""
print("🚀 Starting Configurable Mock API integration test")
print("=" * 60)
# Initialize database first
asyncio.run(setup_database())
# Create test client
client = TestClient(app)
# 1. Health check
print("\n1. Testing health endpoint...")
resp = client.get("/health")
print(f" Health status: {resp.status_code}")
print(f" Response: {resp.json()}")
if resp.status_code != 200:
print(" ❌ Health check failed")
return
print(" ✅ Health check passed")
# 2. Admin login
print("\n2. Admin login...")
resp = client.post("/admin/login", data={"username": "admin", "password": "admin123"}, follow_redirects=False)
print(f" Login status: {resp.status_code}")
print(f" Redirect location: {resp.headers.get('location')}")
if resp.status_code != 302:
print(" ❌ Login failed")
return
# Check session cookie
cookies = resp.cookies
if "mockapi_session" not in cookies:
print(" ❌ Session cookie not set")
return
print(" ✅ Session cookie set")
# 3. Create a mock endpoint
print("\n3. Creating a mock endpoint...")
endpoint_data = {
"route": "/api/greeting/{name}",
"method": "GET",
"response_body": '{"message": "Hello, {{ name }}!", "server": "{{ server }}"}',
"response_code": 200,
"content_type": "application/json",
"is_active": True,
"variables": '{"server": "mock-api"}',
"headers": '{"X-Custom-Header": "test"}',
"delay_ms": 0,
}
resp = client.post("/admin/endpoints", data=endpoint_data, follow_redirects=False)
print(f" Create endpoint status: {resp.status_code}")
if resp.status_code != 302:
print(f" ❌ Endpoint creation failed: {resp.text}")
return
print(" ✅ Endpoint created (route registered)")
# 4. Call the mock endpoint
print("\n4. Calling the mock endpoint...")
resp = client.get("/api/greeting/World")
print(f" Mock endpoint status: {resp.status_code}")
print(f" Response headers: {{k: v for k, v in resp.headers.items() if k.startswith('X-')}}")
if resp.status_code == 200:
data = resp.json()
print(f" Response: {data}")
if data.get("message") == "Hello, World!" and data.get("server") == "mock-api":
print(" ✅ Mock endpoint works correctly with template variables!")
else:
print(" ❌ Unexpected response content")
else:
print(f" ❌ Mock endpoint failed: {resp.text}")
# 5. Clean up (optional - delete the endpoint)
print("\n5. Cleaning up...")
# Get endpoint ID from the list page
resp = client.get("/admin/endpoints")
if resp.status_code == 200:
# In a real scenario, we'd parse the HTML to find the ID
# For this example, we'll just note that cleanup would happen here
print(" (Endpoint cleanup would happen here in a full implementation)")
print("\n" + "=" * 60)
print("🎉 Integration test completed successfully!")
print("\nTo test manually:")
print("1. Start the server: uvicorn app:app --reload --host 0.0.0.0 --port 8000")
print("2. Visit http://localhost:8000/admin/login (admin/admin123)")
print("3. Create endpoints and test them at http://localhost:8000/api/...")
if __name__ == "__main__":
main()