Adding test case for self-referencing documents with cascade deletes
This commit is contained in:
		| @@ -1344,6 +1344,37 @@ class QuerySetTest(unittest.TestCase): | ||||
|         self.Person.objects(name='Test User').delete() | ||||
|         self.assertEqual(1, BlogPost.objects.count()) | ||||
|  | ||||
|     def test_reverse_delete_rule_cascade_self_referencing(self): | ||||
|         """Ensure self-referencing CASCADE deletes do not result in infinite loop | ||||
|         """ | ||||
|         class Category(Document): | ||||
|             name = StringField() | ||||
|             parent = ReferenceField('self', reverse_delete_rule=CASCADE) | ||||
|  | ||||
|         num_children = 3 | ||||
|         base = Category(name='Root') | ||||
|         base.save() | ||||
|  | ||||
|         # Create a simple parent-child tree | ||||
|         for i in range(num_children): | ||||
|             child_name = 'Child-%i' % i | ||||
|             child = Category(name=child_name, parent=base) | ||||
|             child.save() | ||||
|  | ||||
|             for i in range(num_children): | ||||
|                 child_child_name = 'Child-Child-%i' % i | ||||
|                 child_child = Category(name=child_child_name, parent=child) | ||||
|                 child_child.save() | ||||
|  | ||||
|         tree_size = 1 + num_children + (num_children * num_children) | ||||
|         self.assertEquals(tree_size, Category.objects.count()) | ||||
|         self.assertEquals(num_children, Category.objects(parent=base).count()) | ||||
|  | ||||
|         # The delete should effectively wipe out the Category collection | ||||
|         # without resulting in infinite parent-child cascade recursion | ||||
|         base.delete() | ||||
|         self.assertEquals(0, Category.objects.count()) | ||||
|  | ||||
|     def test_reverse_delete_rule_nullify(self): | ||||
|         """Ensure nullification of references to deleted documents. | ||||
|         """ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user