mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 12:51:09 -05:00
235 lines
8.4 KiB
Python
235 lines
8.4 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Test script for the unified map service.
|
|
This script tests the map service with real location data.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
# Setup Django environment
|
|
os***REMOVED***iron.setdefault('DJANGO_SETTINGS_MODULE', 'thrillwiki.settings')
|
|
django.setup()
|
|
|
|
from core.services.map_service import unified_map_service
|
|
from core.services.data_structures import GeoBounds, MapFilters, LocationType
|
|
|
|
|
|
def test_basic_map_service():
|
|
"""Test basic map service functionality."""
|
|
print("=" * 60)
|
|
print("TESTING UNIFIED MAP SERVICE")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
# Test 1: Get all locations (no filters)
|
|
print("\n1. Testing get_map_data() with no filters:")
|
|
response = unified_map_service.get_map_data(zoom_level=10, cluster=False)
|
|
print(f" Total locations found: {len(response.locations)}")
|
|
print(f" Clusters: {len(response.clusters)}")
|
|
print(f" Query time: {response.query_time_ms}ms")
|
|
print(f" Cache hit: {response.cache_hit}")
|
|
|
|
if response.locations:
|
|
print(f" Sample location: {response.locations[0].name} ({response.locations[0].type.value})")
|
|
|
|
# Test 2: Get locations with bounds (Ohio area - Cedar Point region)
|
|
print("\n2. Testing get_map_data() with bounds (Ohio):")
|
|
ohio_bounds = GeoBounds(north=42.0, south=40.0, east=-80.5, west=-84.5)
|
|
response = unified_map_service.get_map_data(
|
|
bounds=ohio_bounds,
|
|
zoom_level=8,
|
|
cluster=False
|
|
)
|
|
print(f" Locations in Ohio bounds: {len(response.locations)}")
|
|
print(f" Query time: {response.query_time_ms}ms")
|
|
|
|
# Test 3: Test clustering
|
|
print("\n3. Testing clustering functionality:")
|
|
response = unified_map_service.get_map_data(
|
|
bounds=ohio_bounds,
|
|
zoom_level=6, # Lower zoom should trigger clustering
|
|
cluster=True
|
|
)
|
|
print(f" Locations (unclustered): {len(response.locations)}")
|
|
print(f" Clusters: {len(response.clusters)}")
|
|
print(f" Clustered: {response.clustered}")
|
|
|
|
if response.clusters:
|
|
cluster = response.clusters[0]
|
|
print(f" Sample cluster: {cluster.count} points at {cluster.coordinates}")
|
|
|
|
# Test 4: Test filtering by type
|
|
print("\n4. Testing location type filtering:")
|
|
filters = MapFilters(location_types={LocationType.PARK})
|
|
response = unified_map_service.get_map_data(
|
|
filters=filters,
|
|
zoom_level=10,
|
|
cluster=False
|
|
)
|
|
print(f" Parks only: {len(response.locations)}")
|
|
|
|
# Test 5: Test search functionality
|
|
print("\n5. Testing search functionality:")
|
|
results = unified_map_service.search_locations(
|
|
query="Cedar Point",
|
|
limit=5
|
|
)
|
|
print(f" Search results for 'Cedar Point': {len(results)}")
|
|
if results:
|
|
print(f" First result: {results[0].name} ({results[0].type.value})")
|
|
|
|
# Test 6: Test location detail retrieval
|
|
print("\n6. Testing location detail retrieval:")
|
|
if response.locations:
|
|
location = response.locations[0]
|
|
location_type, location_id = location.id.split('_', 1)
|
|
detail = unified_map_service.get_location_details(location_type, int(location_id))
|
|
if detail:
|
|
print(f" Retrieved details for: {detail.name}")
|
|
print(f" Coordinates: {detail.coordinates}")
|
|
print(f" Metadata keys: {list(detail.metadata.keys())}")
|
|
else:
|
|
print(" No details found")
|
|
|
|
# Test 7: Test service statistics
|
|
print("\n7. Testing service statistics:")
|
|
stats = unified_map_service.get_service_stats()
|
|
print(f" Cache hit rate: {stats['cache_performance']['hit_rate_percent']}%")
|
|
print(f" Supported location types: {stats['supported_location_types']}")
|
|
print(f" Max unclustered points: {stats['max_unclustered_points']}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✅ ALL TESTS PASSED!")
|
|
print("The unified map service is working correctly.")
|
|
print("=" * 60)
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ ERROR: {str(e)}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def test_api_endpoints():
|
|
"""Test the API endpoints."""
|
|
print("\n" + "=" * 60)
|
|
print("TESTING API ENDPOINTS")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
from django.test import Client
|
|
from django.urls import reverse
|
|
|
|
client = Client()
|
|
|
|
# Test 1: Main locations endpoint
|
|
print("\n1. Testing /api/map/locations/")
|
|
response = client.get('/api/map/locations/')
|
|
print(f" Status: {response.status_code}")
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f" Response status: {data.get('status')}")
|
|
print(f" Locations: {len(data.get('data', {}).get('locations', []))}")
|
|
|
|
# Test 2: Bounds endpoint
|
|
print("\n2. Testing /api/map/bounds/")
|
|
response = client.get('/api/map/bounds/?north=42&south=40&east=-80&west=-84')
|
|
print(f" Status: {response.status_code}")
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f" Locations in bounds: {len(data.get('data', {}).get('locations', []))}")
|
|
|
|
# Test 3: Search endpoint
|
|
print("\n3. Testing /api/map/search/")
|
|
response = client.get('/api/map/search/?q=park')
|
|
print(f" Status: {response.status_code}")
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f" Search results: {len(data.get('data', {}).get('locations', []))}")
|
|
|
|
# Test 4: Stats endpoint
|
|
print("\n4. Testing /api/map/stats/")
|
|
response = client.get('/api/map/stats/')
|
|
print(f" Status: {response.status_code}")
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f" Service version: {data.get('data', {}).get('service_version')}")
|
|
|
|
print("\n✅ API ENDPOINTS WORKING!")
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ API ERROR: {str(e)}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def test_performance():
|
|
"""Test performance characteristics."""
|
|
print("\n" + "=" * 60)
|
|
print("TESTING PERFORMANCE")
|
|
print("=" * 60)
|
|
|
|
import time
|
|
|
|
try:
|
|
# Test response times
|
|
times = []
|
|
for i in range(5):
|
|
start = time.time()
|
|
response = unified_map_service.get_map_data(zoom_level=10, cluster=True)
|
|
end = time.time()
|
|
times.append((end - start) * 1000) # Convert to ms
|
|
|
|
avg_time = sum(times) / len(times)
|
|
print(f"\n Average response time: {avg_time:.2f}ms")
|
|
print(f" Min time: {min(times):.2f}ms")
|
|
print(f" Max time: {max(times):.2f}ms")
|
|
|
|
# Test cache performance
|
|
print(f"\n Testing cache performance:")
|
|
start = time.time()
|
|
response1 = unified_map_service.get_map_data(zoom_level=10, use_cache=True)
|
|
time1 = time.time() - start
|
|
|
|
start = time.time()
|
|
response2 = unified_map_service.get_map_data(zoom_level=10, use_cache=True)
|
|
time2 = time.time() - start
|
|
|
|
print(f" First call: {time1*1000:.2f}ms (cache miss: {not response1.cache_hit})")
|
|
print(f" Second call: {time2*1000:.2f}ms (cache hit: {response2.cache_hit})")
|
|
|
|
if response2.cache_hit and time2 < time1:
|
|
print(" ✅ Cache is working and providing performance benefit!")
|
|
|
|
print("\n✅ PERFORMANCE TESTS COMPLETED!")
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ PERFORMANCE ERROR: {str(e)}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("Starting unified map service tests...")
|
|
|
|
success = True
|
|
success &= test_basic_map_service()
|
|
success &= test_api_endpoints()
|
|
success &= test_performance()
|
|
|
|
if success:
|
|
print("\n🎉 ALL TESTS COMPLETED SUCCESSFULLY!")
|
|
print("The unified map service implementation is working correctly.")
|
|
else:
|
|
print("\n💥 SOME TESTS FAILED!")
|
|
sys.exit(1) |