""" Test script for category cycle protection """ import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') django.setup() from products.models import ProductCategory from django.core.exceptions import ValidationError print("="*60) print("TEST 1: Self-reference (A.parent = A)") print("="*60) try: cat = ProductCategory.objects.first() print(f"Category: {cat.name} (id={cat.pk})") cat.parent = cat cat.save() print("[FAIL] Self-reference was NOT blocked!") except ValidationError as e: print("[PASS] Self-reference blocked successfully") print(f"Error: {e.message_dict.get('parent')}") print("\n" + "="*60) print("TEST 2: Simple cycle (A -> B -> A)") print("="*60) try: cats = list(ProductCategory.objects.all()[:2]) cat_a, cat_b = cats[0], cats[1] print(f"Category A: {cat_a.name} (id={cat_a.pk})") print(f"Category B: {cat_b.name} (id={cat_b.pk})") # Create A -> B cat_a.parent = None cat_a.save() cat_b.parent = cat_a cat_b.save() print(f"Created: {cat_a.name} -> {cat_b.name}") # Try to create cycle: A.parent = B cat_a.parent = cat_b cat_a.save() print("[FAIL] Cycle was NOT blocked!") # Cleanup cat_a.parent = None cat_b.parent = None cat_a.save() cat_b.save() except ValidationError as e: print("[PASS] Cycle blocked successfully") print(f"Error: {e.message_dict.get('parent')}") # Cleanup cat_a.parent = None cat_b.parent = None cat_a.save() cat_b.save() print("\n" + "="*60) print("TEST 3: Multi-level cycle (A -> B -> C -> A)") print("="*60) try: cats = list(ProductCategory.objects.all()[:3]) cat_a, cat_b, cat_c = cats[0], cats[1], cats[2] print(f"Category A: {cat_a.name} (id={cat_a.pk})") print(f"Category B: {cat_b.name} (id={cat_b.pk})") print(f"Category C: {cat_c.name} (id={cat_c.pk})") # Create chain A -> B -> C cat_a.parent = None cat_a.save() cat_b.parent = cat_a cat_b.save() cat_c.parent = cat_b cat_c.save() print(f"Created: {cat_a.name} -> {cat_b.name} -> {cat_c.name}") # Try to create cycle: A.parent = C cat_a.parent = cat_c cat_a.save() print("[FAIL] Multi-level cycle was NOT blocked!") # Cleanup cat_a.parent = None cat_b.parent = None cat_c.parent = None cat_a.save() cat_b.save() cat_c.save() except ValidationError as e: print("[PASS] Multi-level cycle blocked successfully") print(f"Error: {e.message_dict.get('parent')}") # Cleanup cat_a.parent = None cat_b.parent = None cat_c.parent = None cat_a.save() cat_b.save() cat_c.save() print("\n" + "="*60) print("TEST 4: Normal operations should work") print("="*60) try: cats = list(ProductCategory.objects.all()[:2]) cat_a, cat_b = cats[0], cats[1] # Reset cat_a.parent = None cat_b.parent = None cat_a.save() cat_b.save() # Create normal hierarchy A -> B cat_b.parent = cat_a cat_b.save() print(f"[PASS] Normal hierarchy created: {cat_a.name} -> {cat_b.name}") # Cleanup cat_b.parent = None cat_b.save() except ValidationError as e: print("[FAIL] Normal operation was blocked!") print(f"Error: {e}") print("\n" + "="*60) print("ALL TESTS COMPLETED") print("="*60)