mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 09:51:09 -05:00
- Implement tests for RideLocation and CompanyHeadquarters models to verify functionality and data integrity. - Create a manual trigger test script for trending content calculation endpoint, including authentication and unauthorized access tests. - Develop a manufacturer sync test to ensure ride manufacturers are correctly associated with ride models. - Add tests for ParkLocation model, including coordinate setting and distance calculations between parks. - Implement a RoadTripService test suite covering geocoding, route calculation, park discovery, and error handling. - Create a unified map service test script to validate map functionality, API endpoints, and performance metrics.
5.6 KiB
5.6 KiB
ThrillWiki Hybrid Filtering Endpoints Test Suite
This repository contains a comprehensive test script for the newly synchronized Parks and Rides hybrid filtering endpoints.
Quick Start
-
Start the Django server:
cd backend && uv run manage.py runserver 8000 -
Run the test script:
./test_hybrid_endpoints.shOr with a custom base URL:
./test_hybrid_endpoints.sh http://localhost:8000
What Gets Tested
Parks Hybrid Filtering (/api/v1/parks/hybrid/)
- ✅ Basic hybrid filtering (automatic strategy selection)
- ✅ Search functionality (
?search=disney) - ✅ Status filtering (
?status=OPERATING,CLOSED_TEMP) - ✅ Geographic filtering (
?country=United%20States&state=Florida,California) - ✅ Numeric range filtering (
?opening_year_min=1990&rating_min=4.0) - ✅ Park statistics filtering (
?size_min=100&ride_count_min=10) - ✅ Operator filtering (
?operator=disney,universal) - ✅ Progressive loading (
?offset=50) - ✅ Filter metadata (
/filter-metadata/) - ✅ Scoped metadata (
/filter-metadata/?scoped=true&country=United%20States)
Rides Hybrid Filtering (/api/v1/rides/hybrid/)
- ✅ Basic hybrid filtering (automatic strategy selection)
- ✅ Search functionality (
?search=coaster) - ✅ Category filtering (
?category=RC,DR) - ✅ Status and park filtering (
?status=OPERATING&park_slug=cedar-point) - ✅ Manufacturer/designer filtering (
?manufacturer=bolliger-mabillard) - ✅ Roller coaster specific filtering (
?roller_coaster_type=INVERTED&has_inversions=true) - ✅ Performance filtering (
?height_ft_min=200&speed_mph_min=70) - ✅ Quality metrics (
?rating_min=4.5&capacity_min=1000) - ✅ Accessibility filtering (
?height_requirement_min=48&height_requirement_max=54) - ✅ Progressive loading (
?offset=25&category=RC) - ✅ Filter metadata (
/filter-metadata/) - ✅ Scoped metadata (
/filter-metadata/?scoped=true&category=RC)
Advanced Testing
- ✅ Complex combination queries
- ✅ Edge cases (empty results, invalid parameters)
- ✅ Performance timing comparisons
- ✅ Error handling validation
Key Features Demonstrated
🔄 Automatic Strategy Selection
- ≤200 records: Client-side filtering (loads all data for frontend filtering)
- >200 records: Server-side filtering (database filtering with pagination)
📊 Progressive Loading
- Initial load: 50 records
- Progressive batches: 25 records
- Seamless pagination for large datasets
🔍 Comprehensive Filtering
- Parks: 17+ filter parameters including geographic, temporal, and statistical filters
- Rides: 17+ filter parameters including roller coaster specs, performance metrics, and accessibility
📋 Dynamic Filter Metadata
- Real-time filter options based on current data
- Scoped metadata for contextual filtering
- Ranges and categorical options automatically generated
⚡ Performance Optimized
- 5-minute intelligent caching
- Strategic database indexing
- Optimized queries with prefetch_related
Response Format
Both endpoints return consistent response structures:
{
"parks": [...], // or "rides": [...]
"total_count": 123,
"strategy": "client_side", // or "server_side"
"has_more": false,
"next_offset": null,
"filter_metadata": {
"categorical": {
"countries": ["United States", "Canada", ...],
"categories": ["RC", "DR", "FR", ...],
// ... more options
},
"ranges": {
"opening_year": {"min": 1800, "max": 2025},
"rating": {"min": 1.0, "max": 10.0},
// ... more ranges
}
}
}
Dependencies
- curl: Required for making HTTP requests
- jq: Optional but recommended for pretty JSON formatting
Example Usage
Basic Parks Query
curl "http://localhost:8000/api/v1/parks/hybrid/"
Search for Disney Parks
curl "http://localhost:8000/api/v1/parks/hybrid/?search=disney"
Filter Roller Coasters with Inversions
curl "http://localhost:8000/api/v1/rides/hybrid/?category=RC&has_inversions=true&height_ft_min=100"
Get Filter Metadata
curl "http://localhost:8000/api/v1/parks/hybrid/filter-metadata/"
Integration Guide
Frontend Integration
- Use filter metadata to build dynamic filter interfaces
- Implement progressive loading for better UX
- Handle both client-side and server-side strategies
- Cache filter metadata to reduce API calls
Performance Considerations
- Monitor response times and adjust thresholds as needed
- Use progressive loading for datasets >200 records
- Implement proper error handling for edge cases
- Consider implementing request debouncing for search
Troubleshooting
Server Not Running
❌ Server not available at http://localhost:8000
💡 Make sure to start the Django server first:
cd backend && uv run manage.py runserver 8000
Missing jq
⚠️ jq not found - JSON responses will not be pretty-printed
Install jq for better output formatting:
# macOS
brew install jq
# Ubuntu/Debian
sudo apt-get install jq
Next Steps
- Integrate into Frontend: Use these endpoints in your React/Next.js application
- Build Filter UI: Create dynamic filter interfaces using the metadata
- Implement Progressive Loading: Handle large datasets efficiently
- Monitor Performance: Track response times and optimize as needed
- Add Caching: Implement client-side caching for better UX
🎢 Happy filtering! These endpoints provide a powerful, scalable foundation for building advanced search and filtering experiences in your theme park application.