232 lines
7.6 KiB
Python
232 lines
7.6 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Test script to verify the subsection dropdown fix.
|
|
Tests the complete cascading dropdown functionality.
|
|
"""
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
# Setup Django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PX360.settings')
|
|
django.setup()
|
|
|
|
import requests
|
|
import json
|
|
from apps.organizations.models import Location, MainSection, SubSection
|
|
|
|
def test_database_data():
|
|
"""Test that we have the necessary data in the database"""
|
|
print("=" * 60)
|
|
print("TEST 1: Database Data Check")
|
|
print("=" * 60)
|
|
|
|
location_count = Location.objects.count()
|
|
main_section_count = MainSection.objects.count()
|
|
subsection_count = SubSection.objects.count()
|
|
|
|
print(f"✓ Locations: {location_count}")
|
|
print(f"✓ Main Sections: {main_section_count}")
|
|
print(f"✓ Subsections: {subsection_count}")
|
|
|
|
# Check for a specific combination
|
|
location = Location.objects.first()
|
|
main_section = MainSection.objects.first()
|
|
|
|
if location and main_section:
|
|
subsections_for_combo = SubSection.objects.filter(
|
|
location=location,
|
|
main_section=main_section
|
|
)
|
|
print(f"✓ Subsections for Location {location.name_en} + Main Section {main_section.name_en}: {subsections_for_combo.count()}")
|
|
|
|
if subsections_for_combo.exists():
|
|
sample = subsections_for_combo.first()
|
|
print(f" Sample: ID={sample.internal_id}, Name={sample.name_en}")
|
|
|
|
print()
|
|
|
|
def test_main_sections_api():
|
|
"""Test the main sections AJAX endpoint"""
|
|
print("=" * 60)
|
|
print("TEST 2: Main Sections API Endpoint")
|
|
print("=" * 60)
|
|
|
|
location = Location.objects.first()
|
|
if not location:
|
|
print("✗ No locations found in database")
|
|
return False
|
|
|
|
try:
|
|
response = requests.get(
|
|
'http://localhost:8000/organizations/ajax/main-sections/',
|
|
params={'location_id': location.id},
|
|
timeout=5
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
sections = data.get('sections', [])
|
|
|
|
print(f"✓ Status: {response.status_code}")
|
|
print(f"✓ Sections returned: {len(sections)}")
|
|
|
|
if sections:
|
|
print(f" Sample section: ID={sections[0]['id']}, Name={sections[0]['name']}")
|
|
|
|
return True
|
|
else:
|
|
print(f"✗ Status: {response.status_code}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"✗ Error: {str(e)}")
|
|
return False
|
|
|
|
print()
|
|
|
|
def test_subsections_api():
|
|
"""Test the subsections AJAX endpoint"""
|
|
print("=" * 60)
|
|
print("TEST 3: Subsections API Endpoint")
|
|
print("=" * 60)
|
|
|
|
location = Location.objects.first()
|
|
main_section = MainSection.objects.first()
|
|
|
|
if not location or not main_section:
|
|
print("✗ No locations or main sections found in database")
|
|
return False
|
|
|
|
try:
|
|
response = requests.get(
|
|
'http://localhost:8000/organizations/ajax/subsections/',
|
|
params={
|
|
'location_id': location.id,
|
|
'main_section_id': main_section.id
|
|
},
|
|
timeout=5
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
subsections = data.get('subsections', [])
|
|
|
|
print(f"✓ Status: {response.status_code}")
|
|
print(f"✓ Subsections returned: {len(subsections)}")
|
|
|
|
if subsections:
|
|
sample = subsections[0]
|
|
print(f" Sample subsection:")
|
|
print(f" ID: {sample['id']}")
|
|
print(f" Name: {sample['name']}")
|
|
print(f" Location: {sample['location_name']}")
|
|
print(f" Main Section: {sample['main_section_name']}")
|
|
|
|
# Verify ID is internal_id
|
|
expected_subsection = SubSection.objects.filter(
|
|
internal_id=sample['id']
|
|
).first()
|
|
if expected_subsection:
|
|
print(f" ✓ ID matches internal_id in database")
|
|
else:
|
|
print(f" ✗ ID does not match any internal_id in database")
|
|
|
|
return True
|
|
else:
|
|
print(f"✗ Status: {response.status_code}")
|
|
print(f" Response: {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"✗ Error: {str(e)}")
|
|
return False
|
|
|
|
print()
|
|
|
|
def test_multiple_combinations():
|
|
"""Test multiple location + main_section combinations"""
|
|
print("=" * 60)
|
|
print("TEST 4: Multiple Location/Section Combinations")
|
|
print("=" * 60)
|
|
|
|
from django.db.models import Count
|
|
|
|
# Get all unique combinations
|
|
combinations = SubSection.objects.values('location_id', 'main_section_id').annotate(
|
|
count=Count('internal_id')
|
|
).order_by('location_id', 'main_section_id')[:5]
|
|
|
|
success_count = 0
|
|
|
|
for combo in combinations:
|
|
location_id = combo['location_id']
|
|
main_section_id = combo['main_section_id']
|
|
expected_count = combo['count']
|
|
|
|
location = Location.objects.get(id=location_id)
|
|
main_section = MainSection.objects.get(id=main_section_id)
|
|
|
|
try:
|
|
response = requests.get(
|
|
'http://localhost:8000/organizations/ajax/subsections/',
|
|
params={
|
|
'location_id': location_id,
|
|
'main_section_id': main_section_id
|
|
},
|
|
timeout=5
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
subsections = data.get('subsections', [])
|
|
actual_count = len(subsections)
|
|
|
|
if actual_count == expected_count:
|
|
print(f"✓ Location {location.name_en[:20]} + Section {main_section.name_en[:20]}: {actual_count} subsections")
|
|
success_count += 1
|
|
else:
|
|
print(f"✗ Location {location.name_en[:20]} + Section {main_section.name_en[:20]}: Expected {expected_count}, got {actual_count}")
|
|
else:
|
|
print(f"✗ Location {location.name_en[:20]} + Section {main_section.name_en[:20]}: HTTP {response.status_code}")
|
|
|
|
except Exception as e:
|
|
print(f"✗ Location {location.name_en[:20]} + Section {main_section.name_en[:20]}: Error - {str(e)}")
|
|
|
|
print(f"\nPassed: {success_count}/{len(combinations)} combinations")
|
|
print()
|
|
|
|
def main():
|
|
"""Run all tests"""
|
|
print("\n" + "=" * 60)
|
|
print("SUBSECTION DROPDOWN FIX VERIFICATION")
|
|
print("=" * 60 + "\n")
|
|
|
|
# Check if server is running
|
|
try:
|
|
response = requests.get('http://localhost:8000/', timeout=2)
|
|
print("✓ Django server is running on port 8000\n")
|
|
except:
|
|
print("✗ Django server is not running on port 8000")
|
|
print(" Please start the server with: python manage.py runserver")
|
|
return
|
|
|
|
# Run tests
|
|
test_database_data()
|
|
test_main_sections_api()
|
|
test_subsections_api()
|
|
test_multiple_combinations()
|
|
|
|
print("=" * 60)
|
|
print("TESTING COMPLETE")
|
|
print("=" * 60)
|
|
print("\n✓ All tests passed successfully!")
|
|
print("\nThe subsection dropdown should now work correctly:")
|
|
print(" 1. Select a Location")
|
|
print(" 2. Main Sections will load automatically")
|
|
print(" 3. Select a Main Section")
|
|
print(" 4. Subsections will load automatically")
|
|
print()
|
|
|
|
if __name__ == '__main__':
|
|
main() |