Initial commit: Django inventory system
This commit is contained in:
134
myproject/test_cycles.py
Normal file
134
myproject/test_cycles.py
Normal file
@@ -0,0 +1,134 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user