Init Repo
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Test script to validate the asset router optimization implementation.
|
||||
This script tests the optimized asset endpoints to ensure they work correctly
|
||||
and provide the expected performance improvements.
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
from typing import Dict, List
|
||||
|
||||
# Configuration
|
||||
BASE_URL = "http://localhost:8000"
|
||||
API_BASE = f"{BASE_URL}/api"
|
||||
|
||||
def get_auth_headers() -> Dict[str, str]:
|
||||
"""Get authentication headers for API requests."""
|
||||
# Login to get access token
|
||||
login_data = {
|
||||
"username": "admin",
|
||||
"password": "admin123"
|
||||
}
|
||||
|
||||
response = requests.post(f"{API_BASE}/auth/login", json=login_data)
|
||||
if response.status_code != 200:
|
||||
raise Exception(f"Login failed: {response.text}")
|
||||
|
||||
token_data = response.json()
|
||||
access_token = token_data["access_token"]
|
||||
|
||||
return {
|
||||
"Authorization": f"Bearer {access_token}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def test_list_assets_optimization():
|
||||
"""Test the optimized list_assets endpoint."""
|
||||
print("Testing optimized list_assets endpoint...")
|
||||
|
||||
headers = get_auth_headers()
|
||||
|
||||
# Test basic asset listing
|
||||
start_time = time.time()
|
||||
response = requests.get(f"{API_BASE}/assets/", headers=headers)
|
||||
end_time = time.time()
|
||||
|
||||
print(f"List assets response time: {end_time - start_time:.3f}s")
|
||||
|
||||
if response.status_code != 200:
|
||||
print(f"❌ List assets failed: {response.status_code} - {response.text}")
|
||||
return False
|
||||
|
||||
assets = response.json()
|
||||
print(f"✅ Retrieved {len(assets)} assets")
|
||||
|
||||
# Verify response structure
|
||||
if assets:
|
||||
asset = assets[0]
|
||||
required_fields = ['id', 'name', 'category', 'task_status', 'task_details', 'task_count']
|
||||
missing_fields = [field for field in required_fields if field not in asset]
|
||||
|
||||
if missing_fields:
|
||||
print(f"❌ Missing fields in asset response: {missing_fields}")
|
||||
return False
|
||||
|
||||
print(f"✅ Asset response structure is correct")
|
||||
print(f" - Task status: {asset.get('task_status', {})}")
|
||||
print(f" - Task details count: {len(asset.get('task_details', []))}")
|
||||
print(f" - Task count: {asset.get('task_count', 0)}")
|
||||
|
||||
return True
|
||||
|
||||
def test_get_asset_optimization():
|
||||
"""Test the optimized get_asset endpoint."""
|
||||
print("\nTesting optimized get_asset endpoint...")
|
||||
|
||||
headers = get_auth_headers()
|
||||
|
||||
# First get list of assets to find an asset ID
|
||||
response = requests.get(f"{API_BASE}/assets/", headers=headers)
|
||||
if response.status_code != 200:
|
||||
print("❌ Could not get assets list for testing")
|
||||
return False
|
||||
|
||||
assets = response.json()
|
||||
if not assets:
|
||||
print("❌ No assets found for testing")
|
||||
return False
|
||||
|
||||
asset_id = assets[0]['id']
|
||||
|
||||
# Test single asset retrieval
|
||||
start_time = time.time()
|
||||
response = requests.get(f"{API_BASE}/assets/{asset_id}", headers=headers)
|
||||
end_time = time.time()
|
||||
|
||||
print(f"Get asset response time: {end_time - start_time:.3f}s")
|
||||
|
||||
if response.status_code != 200:
|
||||
print(f"❌ Get asset failed: {response.status_code} - {response.text}")
|
||||
return False
|
||||
|
||||
asset = response.json()
|
||||
print(f"✅ Retrieved asset: {asset['name']}")
|
||||
|
||||
# Verify response structure
|
||||
required_fields = ['id', 'name', 'category', 'task_count']
|
||||
missing_fields = [field for field in required_fields if field not in asset]
|
||||
|
||||
if missing_fields:
|
||||
print(f"❌ Missing fields in asset response: {missing_fields}")
|
||||
return False
|
||||
|
||||
print(f"✅ Asset response structure is correct")
|
||||
print(f" - Task count: {asset.get('task_count', 0)}")
|
||||
|
||||
return True
|
||||
|
||||
def test_asset_task_status_endpoint():
|
||||
"""Test the asset task status endpoint."""
|
||||
print("\nTesting asset task status endpoint...")
|
||||
|
||||
headers = get_auth_headers()
|
||||
|
||||
# First get list of assets to find an asset ID
|
||||
response = requests.get(f"{API_BASE}/assets/", headers=headers)
|
||||
if response.status_code != 200:
|
||||
print("❌ Could not get assets list for testing")
|
||||
return False
|
||||
|
||||
assets = response.json()
|
||||
if not assets:
|
||||
print("❌ No assets found for testing")
|
||||
return False
|
||||
|
||||
asset_id = assets[0]['id']
|
||||
|
||||
# Test asset task status retrieval
|
||||
start_time = time.time()
|
||||
response = requests.get(f"{API_BASE}/assets/{asset_id}/task-status", headers=headers)
|
||||
end_time = time.time()
|
||||
|
||||
print(f"Get asset task status response time: {end_time - start_time:.3f}s")
|
||||
|
||||
if response.status_code != 200:
|
||||
print(f"❌ Get asset task status failed: {response.status_code} - {response.text}")
|
||||
return False
|
||||
|
||||
task_details = response.json()
|
||||
print(f"✅ Retrieved {len(task_details)} task details")
|
||||
|
||||
# Verify response structure
|
||||
if task_details:
|
||||
task = task_details[0]
|
||||
required_fields = ['task_type', 'status', 'task_id']
|
||||
missing_fields = [field for field in required_fields if field not in task]
|
||||
|
||||
if missing_fields:
|
||||
print(f"❌ Missing fields in task detail response: {missing_fields}")
|
||||
return False
|
||||
|
||||
print(f"✅ Task detail response structure is correct")
|
||||
print(f" - Task type: {task.get('task_type')}")
|
||||
print(f" - Status: {task.get('status')}")
|
||||
|
||||
return True
|
||||
|
||||
def test_asset_filtering():
|
||||
"""Test asset filtering functionality."""
|
||||
print("\nTesting asset filtering...")
|
||||
|
||||
headers = get_auth_headers()
|
||||
|
||||
# Test filtering by category
|
||||
response = requests.get(f"{API_BASE}/assets/?category=characters", headers=headers)
|
||||
if response.status_code == 200:
|
||||
assets = response.json()
|
||||
print(f"✅ Category filter works: {len(assets)} character assets")
|
||||
else:
|
||||
print(f"⚠️ Category filter test skipped: {response.status_code}")
|
||||
|
||||
# Test task status filtering
|
||||
response = requests.get(f"{API_BASE}/assets/?task_status_filter=modeling:not_started", headers=headers)
|
||||
if response.status_code == 200:
|
||||
assets = response.json()
|
||||
print(f"✅ Task status filter works: {len(assets)} assets with modeling not_started")
|
||||
else:
|
||||
print(f"⚠️ Task status filter test skipped: {response.status_code}")
|
||||
|
||||
return True
|
||||
|
||||
def main():
|
||||
"""Run all optimization tests."""
|
||||
print("🚀 Starting Asset Router Optimization Tests")
|
||||
print("=" * 50)
|
||||
|
||||
try:
|
||||
# Test all endpoints
|
||||
tests = [
|
||||
test_list_assets_optimization,
|
||||
test_get_asset_optimization,
|
||||
test_asset_task_status_endpoint,
|
||||
test_asset_filtering
|
||||
]
|
||||
|
||||
results = []
|
||||
for test in tests:
|
||||
try:
|
||||
result = test()
|
||||
results.append(result)
|
||||
except Exception as e:
|
||||
print(f"❌ Test failed with exception: {e}")
|
||||
results.append(False)
|
||||
|
||||
# Summary
|
||||
print("\n" + "=" * 50)
|
||||
print("📊 Test Results Summary")
|
||||
print("=" * 50)
|
||||
|
||||
passed = sum(results)
|
||||
total = len(results)
|
||||
|
||||
print(f"✅ Passed: {passed}/{total}")
|
||||
if passed == total:
|
||||
print("🎉 All asset router optimization tests passed!")
|
||||
else:
|
||||
print(f"❌ {total - passed} tests failed")
|
||||
|
||||
return passed == total
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Test suite failed: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = main()
|
||||
exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user