mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-22 09:11:09 -05:00
Add comprehensive audit reports, design assessment, and non-authenticated features testing for ThrillWiki application
- Created critical functionality audit report identifying 7 critical issues affecting production readiness. - Added design assessment report highlighting exceptional design quality and minor cosmetic fixes needed. - Documented non-authenticated features testing results confirming successful functionality and public access. - Implemented ride search form with autocomplete functionality and corresponding templates for search results. - Developed tests for ride autocomplete functionality, ensuring proper filtering and authentication checks.
This commit is contained in:
140
search/tests/test_ride_autocomplete.py
Normal file
140
search/tests/test_ride_autocomplete.py
Normal file
@@ -0,0 +1,140 @@
|
||||
from django.test import TestCase, RequestFactory, override_settings
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
from django.core.exceptions import PermissionDenied
|
||||
|
||||
from search.mixins import RideAutocomplete
|
||||
from rides.models import Ride
|
||||
from parks.models import Park
|
||||
from companies.models import Company
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class RideAutocompleteTest(TestCase):
|
||||
"""Test cases for RideAutocomplete functionality."""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test data."""
|
||||
self.factory = RequestFactory()
|
||||
self.user = User.objects.create_user(
|
||||
username='testuser',
|
||||
password='testpass123'
|
||||
)
|
||||
|
||||
# Create test company and park
|
||||
self.company = Company.objects.create(
|
||||
name='Test Company'
|
||||
)
|
||||
self.park = Park.objects.create(
|
||||
name='Test Park',
|
||||
owner=self.company,
|
||||
status='OPERATING'
|
||||
)
|
||||
|
||||
# Create test rides
|
||||
self.ride1 = Ride.objects.create(
|
||||
name='Thunder Mountain',
|
||||
park=self.park,
|
||||
category='RC',
|
||||
status='OPERATING'
|
||||
)
|
||||
self.ride2 = Ride.objects.create(
|
||||
name='Space Mountain',
|
||||
park=self.park,
|
||||
category='RC',
|
||||
status='OPERATING'
|
||||
)
|
||||
self.ride3 = Ride.objects.create(
|
||||
name='Pirates Adventure',
|
||||
park=self.park,
|
||||
category='DR',
|
||||
status='OPERATING'
|
||||
)
|
||||
|
||||
@override_settings(AUTOCOMPLETE_BLOCK_UNAUTHENTICATED=True)
|
||||
def test_autocomplete_requires_authentication(self):
|
||||
"""Test that autocomplete requires authentication."""
|
||||
request = self.factory.get('/search/rides/autocomplete/?q=mountain')
|
||||
request.user = AnonymousUser()
|
||||
|
||||
autocomplete = RideAutocomplete()
|
||||
|
||||
with self.assertRaises(PermissionDenied):
|
||||
autocomplete.auth_check(request)
|
||||
|
||||
def test_autocomplete_allows_authenticated_users(self):
|
||||
"""Test that autocomplete allows authenticated users."""
|
||||
request = self.factory.get('/search/rides/autocomplete/?q=mountain')
|
||||
request.user = self.user
|
||||
|
||||
autocomplete = RideAutocomplete()
|
||||
|
||||
# Should not raise an exception
|
||||
autocomplete.auth_check(request)
|
||||
|
||||
def test_search_results_filtering(self):
|
||||
"""Test that search results are properly filtered."""
|
||||
autocomplete = RideAutocomplete()
|
||||
|
||||
# Search for "mountain" should return both mountain rides
|
||||
results = autocomplete.get_search_results('mountain', {})
|
||||
self.assertEqual(results.count(), 2)
|
||||
|
||||
# Search for "space" should return only Space Mountain
|
||||
results = autocomplete.get_search_results('space', {})
|
||||
self.assertEqual(results.count(), 1)
|
||||
self.assertEqual(results.first().name, 'Space Mountain')
|
||||
|
||||
# Search for "pirates" should return Pirates Adventure
|
||||
results = autocomplete.get_search_results('pirates', {})
|
||||
self.assertEqual(results.count(), 1)
|
||||
self.assertEqual(results.first().name, 'Pirates Adventure')
|
||||
|
||||
def test_search_results_include_park_data(self):
|
||||
"""Test that search results include related park data."""
|
||||
autocomplete = RideAutocomplete()
|
||||
results = autocomplete.get_search_results('mountain', {})
|
||||
|
||||
# Verify park data is accessible (select_related working)
|
||||
for ride in results:
|
||||
self.assertEqual(ride.park.name, 'Test Park')
|
||||
|
||||
def test_search_results_limited_to_ten(self):
|
||||
"""Test that search results are limited to 10 items."""
|
||||
# Create 15 rides with similar names
|
||||
for i in range(15):
|
||||
Ride.objects.create(
|
||||
name=f'Test Coaster {i}',
|
||||
park=self.park,
|
||||
category='RC',
|
||||
status='OPERATING'
|
||||
)
|
||||
|
||||
autocomplete = RideAutocomplete()
|
||||
results = autocomplete.get_search_results('test', {})
|
||||
|
||||
# Should be limited to 10 results
|
||||
self.assertEqual(results.count(), 10)
|
||||
|
||||
def test_format_result(self):
|
||||
"""Test that results are properly formatted."""
|
||||
autocomplete = RideAutocomplete()
|
||||
formatted = autocomplete.format_result(self.ride1)
|
||||
|
||||
self.assertEqual(formatted['key'], str(self.ride1.pk))
|
||||
self.assertEqual(formatted['label'], 'Thunder Mountain')
|
||||
self.assertEqual(formatted['extra'], 'at Test Park')
|
||||
|
||||
def test_case_insensitive_search(self):
|
||||
"""Test that search is case insensitive."""
|
||||
autocomplete = RideAutocomplete()
|
||||
|
||||
# Test different cases
|
||||
results_lower = autocomplete.get_search_results('thunder', {})
|
||||
results_upper = autocomplete.get_search_results('THUNDER', {})
|
||||
results_mixed = autocomplete.get_search_results('Thunder', {})
|
||||
|
||||
self.assertEqual(results_lower.count(), 1)
|
||||
self.assertEqual(results_upper.count(), 1)
|
||||
self.assertEqual(results_mixed.count(), 1)
|
||||
Reference in New Issue
Block a user