LinkDesk/backend/test_diagnostic_performance.py

216 lines
7.3 KiB
Python

#!/usr/bin/env python3
"""
Diagnostic Performance Test
This test helps diagnose the performance issues by testing different scenarios.
"""
import requests
import time
import traceback
BASE_URL = "http://localhost:8000"
def login():
"""Login and get access token"""
response = requests.post(f"{BASE_URL}/auth/login", json={
"email": "admin@vfx.com",
"password": "admin123"
})
if response.status_code == 200:
return response.json()["access_token"]
return None
def test_basic_endpoints():
"""Test basic endpoint functionality."""
print("=== Basic Endpoint Test ===")
token = login()
if not token:
print("❌ Login failed")
return
headers = {"Authorization": f"Bearer {token}"}
# Test 1: Simple shot endpoint without parameters
print("Testing basic shot endpoint...")
try:
start_time = time.time()
response = requests.get(f"{BASE_URL}/shots/", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
shots = response.json()
print(f" Shots returned: {len(shots)}")
if shots:
print(f" Sample shot keys: {list(shots[0].keys())}")
else:
print(f" Error: {response.text}")
except Exception as e:
print(f" Exception: {e}")
traceback.print_exc()
# Test 2: Simple asset endpoint without parameters
print("\nTesting basic asset endpoint...")
try:
start_time = time.time()
response = requests.get(f"{BASE_URL}/assets/", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
assets = response.json()
print(f" Assets returned: {len(assets)}")
if assets:
print(f" Sample asset keys: {list(assets[0].keys())}")
else:
print(f" Error: {response.text}")
except Exception as e:
print(f" Exception: {e}")
traceback.print_exc()
# Test 3: Shot endpoint with small limit
print("\nTesting shot endpoint with limit=1...")
try:
start_time = time.time()
response = requests.get(f"{BASE_URL}/shots/?limit=1", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
shots = response.json()
print(f" Shots returned: {len(shots)}")
else:
print(f" Error: {response.text}")
except Exception as e:
print(f" Exception: {e}")
# Test 4: Asset endpoint with small limit
print("\nTesting asset endpoint with limit=1...")
try:
start_time = time.time()
response = requests.get(f"{BASE_URL}/assets/?limit=1", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
assets = response.json()
print(f" Assets returned: {len(assets)}")
else:
print(f" Error: {response.text}")
except Exception as e:
print(f" Exception: {e}")
def test_with_project_filter():
"""Test with project filtering to see if that helps performance."""
print("\n=== Project Filter Test ===")
token = login()
if not token:
print("❌ Login failed")
return
headers = {"Authorization": f"Bearer {token}"}
# Get a project ID first
try:
response = requests.get(f"{BASE_URL}/projects/", headers=headers)
if response.status_code == 200:
projects = response.json()
if projects:
project_id = projects[0]['id']
print(f"Using project ID: {project_id}")
# Test shots with project filter
print("Testing shots with project filter...")
start_time = time.time()
response = requests.get(f"{BASE_URL}/shots/?project_id={project_id}&limit=10", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
shots = response.json()
print(f" Shots returned: {len(shots)}")
# Test assets with project filter
print("Testing assets with project filter...")
start_time = time.time()
response = requests.get(f"{BASE_URL}/assets/?project_id={project_id}&limit=10", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
assets = response.json()
print(f" Assets returned: {len(assets)}")
else:
print(f" Error: {response.text}")
else:
print("No projects found")
else:
print(f"Failed to get projects: {response.status_code}")
except Exception as e:
print(f"Exception: {e}")
traceback.print_exc()
def test_individual_endpoints():
"""Test individual shot/asset by ID."""
print("\n=== Individual Item Test ===")
token = login()
if not token:
print("❌ Login failed")
return
headers = {"Authorization": f"Bearer {token}"}
# Get a shot ID and test individual shot
try:
response = requests.get(f"{BASE_URL}/shots/?limit=1", headers=headers)
if response.status_code == 200:
shots = response.json()
if shots:
shot_id = shots[0]['id']
print(f"Testing individual shot {shot_id}...")
start_time = time.time()
response = requests.get(f"{BASE_URL}/shots/{shot_id}", headers=headers)
end_time = time.time()
print(f" Status: {response.status_code}")
print(f" Time: {(end_time - start_time) * 1000:.2f}ms")
if response.status_code == 200:
shot = response.json()
print(f" Shot: {shot['name']}")
print(f" Task count: {shot.get('task_count', 'N/A')}")
except Exception as e:
print(f"Exception: {e}")
if __name__ == "__main__":
print("Diagnostic Performance Test")
print("=" * 40)
# Check server
try:
response = requests.get(f"{BASE_URL}/docs", timeout=5)
print(f"Server status: {response.status_code}")
except Exception as e:
print(f"❌ Server connection failed: {e}")
exit(1)
test_basic_endpoints()
test_with_project_filter()
test_individual_endpoints()