Просмотр исходного кода

fix #670: added asserts for cats tree structure

Rafał Pitoń 8 лет назад
Родитель
Сommit
497b7baad1

+ 182 - 32
misago/categories/tests/test_categories_admin_views.py

@@ -7,7 +7,49 @@ from misago.threads.models import Thread
 from ..models import Category
 
 
-class CategoryAdminViewsTests(AdminTestCase):
+class CategoryAdminTestCate(AdminTestCase):
+    def assertValidTree(self, expected_tree):
+        root = Category.objects.root_category()
+        queryset = Category.objects.filter(tree_id=root.tree_id).order_by('lft')
+
+        current_tree = []
+        for category in queryset:
+            current_tree.append((
+                category,
+                category.level,
+                category.lft - root.lft + 1,
+                category.rght - root.lft + 1,
+            ))
+
+        if len(expected_tree) != len(current_tree):
+            self.fail('nodes tree is %s items long, should be %s' % (
+                len(current_tree), len(expected_tree)))
+
+        for i, category in enumerate(expected_tree):
+            _category = current_tree[i]
+            if category[0] != _category[0]:
+                self.fail((
+                    'expected category at index #%s to be %s, '
+                    'found %s instead'
+                ) % (i, category[0], _category[0]))
+            if category[1] != _category[1]:
+                self.fail((
+                    'expected level at index #%s to be %s, '
+                    'found %s instead'
+                ) % (i, category[1], _category[1]))
+            if category[2] != _category[2]:
+                self.fail((
+                    'expected lft at index #%s to be %s, '
+                    'found %s instead'
+                ) % (i, category[2], _category[2]))
+            if category[3] != _category[3]:
+                self.fail((
+                    'expected lft at index #%s to be %s, '
+                    'found %s instead'
+                ) % (i, category[3], _category[3]))
+
+
+class CategoryAdminViewsTests(CategoryAdminTestCate):
     def test_link_registered(self):
         """admin nav contains categories link"""
         response = self.client.get(
@@ -36,6 +78,7 @@ class CategoryAdminViewsTests(AdminTestCase):
     def test_new_view(self):
         """new category view has no showstoppers"""
         root = Category.objects.root_category()
+        first_category = Category.objects.get(slug='first-category')
 
         response = self.client.get(
             reverse('misago:admin:categories:nodes:new'))
@@ -58,6 +101,32 @@ class CategoryAdminViewsTests(AdminTestCase):
 
         test_category = Category.objects.get(slug='test-category')
 
+        self.assertValidTree([
+            (root, 0, 1, 6),
+            (first_category, 1, 2, 3),
+            (test_category, 1, 4, 5),
+        ])
+
+        response = self.client.post(
+            reverse('misago:admin:categories:nodes:new'),
+            data={
+                'name': 'Test Other Category',
+                'description': 'Lorem ipsum dolor met',
+                'new_parent': root.pk,
+                'prune_started_after': 0,
+                'prune_replied_after': 0,
+            })
+        self.assertEqual(response.status_code, 302)
+
+        test_other_category = Category.objects.get(slug='test-other-category')
+
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (first_category, 1, 2, 3),
+            (test_category, 1, 4, 5),
+            (test_other_category, 1, 6, 7),
+        ])
+
         response = self.client.post(
             reverse('misago:admin:categories:nodes:new'),
             data={
@@ -69,6 +138,16 @@ class CategoryAdminViewsTests(AdminTestCase):
             })
         self.assertEqual(response.status_code, 302)
 
+        test_subcategory = Category.objects.get(slug='test-subcategory')
+
+        self.assertValidTree([
+            (root, 0, 1, 10),
+            (first_category, 1, 2, 3),
+            (test_category, 1, 4, 7),
+            (test_subcategory, 2, 5, 6),
+            (test_other_category, 1, 8, 9),
+        ])
+
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
         self.assertContains(response, 'Test Subcategory')
@@ -77,6 +156,7 @@ class CategoryAdminViewsTests(AdminTestCase):
         """edit category view has no showstoppers"""
         private_threads = Category.objects.private_threads()
         root = Category.objects.root_category()
+        first_category = Category.objects.get(slug='first-category')
 
         response = self.client.get(
             reverse('misago:admin:categories:nodes:edit', kwargs={
@@ -100,6 +180,7 @@ class CategoryAdminViewsTests(AdminTestCase):
                 'prune_replied_after': 0,
             })
         self.assertEqual(response.status_code, 302)
+
         test_category = Category.objects.get(slug='test-category')
 
         response = self.client.get(
@@ -122,6 +203,35 @@ class CategoryAdminViewsTests(AdminTestCase):
             })
         self.assertEqual(response.status_code, 302)
 
+        self.assertValidTree([
+            (root, 0, 1, 6),
+            (first_category, 1, 2, 3),
+            (test_category, 1, 4, 5),
+        ])
+
+        response = self.client.get(
+            reverse('misago:admin:categories:nodes:index'))
+        self.assertContains(response, 'Test Category Edited')
+
+        response = self.client.post(
+            reverse('misago:admin:categories:nodes:edit', kwargs={
+                'pk': test_category.pk
+            }),
+            data={
+                'name': 'Test Category Edited',
+                'new_parent': first_category.pk,
+                'role': 'category',
+                'prune_started_after': 0,
+                'prune_replied_after': 0,
+            })
+        self.assertEqual(response.status_code, 302)
+
+        self.assertValidTree([
+            (root, 0, 1, 6),
+            (first_category, 1, 2, 5),
+            (test_category, 2, 3, 4),
+        ])
+
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
         self.assertContains(response, 'Test Category Edited')
@@ -129,6 +239,7 @@ class CategoryAdminViewsTests(AdminTestCase):
     def test_move_views(self):
         """move up/down views have no showstoppers"""
         root = Category.objects.root_category()
+        first_category = Category.objects.get(slug='first-category')
 
         self.client.post(reverse('misago:admin:categories:nodes:new'), data={
             'name': 'Category A',
@@ -136,6 +247,7 @@ class CategoryAdminViewsTests(AdminTestCase):
             'prune_started_after': 0,
             'prune_replied_after': 0,
         })
+        category_a = Category.objects.get(slug='category-a')
 
         self.client.post(reverse('misago:admin:categories:nodes:new'), data={
             'name': 'Category B',
@@ -143,8 +255,6 @@ class CategoryAdminViewsTests(AdminTestCase):
             'prune_started_after': 0,
             'prune_replied_after': 0,
         })
-
-
         category_b = Category.objects.get(slug='category-b')
 
         response = self.client.post(
@@ -153,13 +263,12 @@ class CategoryAdminViewsTests(AdminTestCase):
             }))
         self.assertEqual(response.status_code, 302)
 
-        self.client.get(reverse('misago:admin:categories:nodes:index'))
-        response = self.client.get(
-            reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        position_a = response.content.find(b'Category A')
-        position_b = response.content.find(b'Category B')
-        self.assertTrue(position_a > position_b)
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (first_category, 1, 2, 3),
+            (category_b, 1, 4, 5),
+            (category_a, 1, 6, 7),
+        ])
 
         response = self.client.post(
             reverse('misago:admin:categories:nodes:up', kwargs={
@@ -167,13 +276,12 @@ class CategoryAdminViewsTests(AdminTestCase):
             }))
         self.assertEqual(response.status_code, 302)
 
-        self.client.get(reverse('misago:admin:categories:nodes:index'))
-        response = self.client.get(
-            reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        position_a = response.content.find(b'Category A')
-        position_b = response.content.find(b'Category B')
-        self.assertTrue(position_a > position_b)
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (category_b, 1, 2, 3),
+            (first_category, 1, 4, 5),
+            (category_a, 1, 6, 7),
+        ])
 
         response = self.client.post(
             reverse('misago:admin:categories:nodes:down', kwargs={
@@ -181,13 +289,12 @@ class CategoryAdminViewsTests(AdminTestCase):
             }))
         self.assertEqual(response.status_code, 302)
 
-        self.client.get(reverse('misago:admin:categories:nodes:index'))
-        response = self.client.get(
-            reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        position_a = response.content.find(b'Category A')
-        position_b = response.content.find(b'Category B')
-        self.assertTrue(position_a > position_b)
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (first_category, 1, 2, 3),
+            (category_b, 1, 4, 5),
+            (category_a, 1, 6, 7),
+        ])
 
         response = self.client.post(
             reverse('misago:admin:categories:nodes:down', kwargs={
@@ -195,19 +302,32 @@ class CategoryAdminViewsTests(AdminTestCase):
             }))
         self.assertEqual(response.status_code, 302)
 
-        self.client.get(reverse('misago:admin:categories:nodes:index'))
-        response = self.client.get(
-            reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        position_a = response.content.find(b'Category A')
-        position_b = response.content.find(b'Category B')
-        self.assertTrue(position_a < position_b)
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (first_category, 1, 2, 3),
+            (category_a, 1, 4, 5),
+            (category_b, 1, 6, 7),
+        ])
+
+        response = self.client.post(
+            reverse('misago:admin:categories:nodes:down', kwargs={
+                'pk': category_b.pk
+            }))
+        self.assertEqual(response.status_code, 302)
+
+        self.assertValidTree([
+            (root, 0, 1, 8),
+            (first_category, 1, 2, 3),
+            (category_a, 1, 4, 5),
+            (category_b, 1, 6, 7),
+        ])
 
 
-class CategoryAdminDeleteViewTests(AdminTestCase):
+class CategoryAdminDeleteViewTests(CategoryAdminTestCate):
     def setUp(self):
         super(CategoryAdminDeleteViewTests, self).setUp()
         self.root = Category.objects.root_category()
+        self.first_category = Category.objects.get(slug='first-category')
 
         """
         Create categories tree for test cases:
@@ -253,6 +373,8 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
             'prune_started_after': 0,
             'prune_replied_after': 0,
         })
+        self.category_c = Category.objects.get(slug='subcategory-c')
+
         self.client.post(reverse('misago:admin:categories:nodes:new'), data={
             'name': 'Subcategory D',
             'new_parent': self.category_b.pk,
@@ -267,6 +389,7 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
             'prune_started_after': 0,
             'prune_replied_after': 0,
         })
+        self.category_f = Category.objects.get(slug='category-f')
 
     def test_delete_category_move_contents(self):
         """category was deleted and its contents were moved"""
@@ -292,6 +415,16 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
         self.assertEqual(Category.objects.all_categories().count(), 6)
         self.assertEqual(Thread.objects.count(), 10)
 
+        self.assertValidTree([
+            (self.root, 0, 1, 14),
+            (self.first_category, 1, 2, 3),
+            (self.category_a, 1, 4, 5),
+            (self.category_e, 1, 6, 13),
+            (self.category_f, 2, 7, 8),
+            (self.category_c, 2, 9, 10),
+            (self.category_d, 2, 11, 12),
+        ])
+
     def test_delete_category_and_contents(self):
         """category and its contents were deleted"""
         for i in range(10):
@@ -316,6 +449,13 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
         self.assertEqual(Category.objects.all_categories().count(), 4)
         self.assertEqual(Thread.objects.count(), 0)
 
+        self.assertValidTree([
+            (self.root, 0, 1, 10),
+            (self.first_category, 1, 2, 3),
+            (self.category_a, 1, 4, 5),
+            (self.category_e, 1, 6, 9),
+            (self.category_f, 2, 7, 8),
+        ])
 
     def test_delete_leaf_category(self):
         """category was deleted and its contents were moved"""
@@ -341,3 +481,13 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
 
         self.assertEqual(Category.objects.all_categories().count(), 6)
         self.assertEqual(Thread.objects.count(), 0)
+
+        self.assertValidTree([
+            (self.root, 0, 1, 14),
+            (self.first_category, 1, 2, 3),
+            (self.category_a, 1, 4, 9),
+            (self.category_b, 2, 5, 8),
+            (self.category_c, 3, 6, 7),
+            (self.category_e, 1, 10, 13),
+            (self.category_f, 2, 11, 12),
+        ])

+ 0 - 2
misago/categories/views/categoriesadmin.py

@@ -120,8 +120,6 @@ class DeleteCategory(CategoryAdmin, generic.ModelFormView):
                     move_threads_to = child
         else:
             for child in target.get_descendants().order_by('-lft'):
-                # refresh child
-                child = Category.objects.get(pk=child.pk)
                 child.delete_content()
                 child.delete()