Files
thrillwiki_django_no_react/test_unified_map_service.py
pacnpal 66ed4347a9 Refactor test utilities and enhance ASGI settings
- Cleaned up and standardized assertions in ApiTestMixin for API response validation.
- Updated ASGI settings to use os.environ for setting the DJANGO_SETTINGS_MODULE.
- Removed unused imports and improved formatting in settings.py.
- Refactored URL patterns in urls.py for better readability and organization.
- Enhanced view functions in views.py for consistency and clarity.
- Added .flake8 configuration for linting and style enforcement.
- Introduced type stubs for django-environ to improve type checking with Pylance.
2025-08-20 19:51:59 -04:00

269 lines
8.7 KiB
Python

#!/usr/bin/env python
"""
Test script for the unified map service.
This script tests the map service with real location data.
"""
from core.services.data_structures import GeoBounds, MapFilters, LocationType
from core.services.map_service import unified_map_service
import os
import sys
import django
# Setup Django environment
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thrillwiki.settings")
django.setup()
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
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()
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)