File: test_ordered.py

package info (click to toggle)
python-django-tree-queries 0.23-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 480 kB
  • sloc: python: 2,973; javascript: 204; makefile: 26
file content (150 lines) | stat: -rw-r--r-- 6,239 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
from django.test import TestCase

from .models import OrderedModel


class OrderableTreeNodeTestCase(TestCase):
    def test_automatic_position_assignment(self):
        """Test that position is automatically assigned to new nodes"""
        root = OrderedModel.objects.create(name="Root")
        assert root.position == 10

        child1 = OrderedModel.objects.create(name="Child 1", parent=root)
        assert child1.position == 10

        child2 = OrderedModel.objects.create(name="Child 2", parent=root)
        assert child2.position == 20

        child3 = OrderedModel.objects.create(name="Child 3", parent=root)
        assert child3.position == 30

    def test_manual_position_respected(self):
        """Test that manually set positions are not overwritten"""
        root = OrderedModel.objects.create(name="Root", position=100)
        assert root.position == 100

        child = OrderedModel.objects.create(name="Child", parent=root, position=50)
        assert child.position == 50

    def test_position_increments_from_max(self):
        """Test that positions increment from the current maximum"""
        root = OrderedModel.objects.create(name="Root")

        # Create children with custom positions
        OrderedModel.objects.create(name="Child 1", parent=root, position=100)
        OrderedModel.objects.create(name="Child 2", parent=root, position=200)

        # Next auto-assigned position should be max + 10
        child3 = OrderedModel.objects.create(name="Child 3", parent=root)
        assert child3.position == 210

    def test_siblings_ordered_by_position(self):
        """Test that siblings are correctly ordered by position"""
        root = OrderedModel.objects.create(name="Root")

        child1 = OrderedModel.objects.create(name="Child 1", parent=root)
        child2 = OrderedModel.objects.create(name="Child 2", parent=root)
        child3 = OrderedModel.objects.create(name="Child 3", parent=root)

        siblings = list(root.children.all())
        assert siblings[0] == child1
        assert siblings[1] == child2
        assert siblings[2] == child3

    def test_reordering_siblings(self):
        """Test that siblings can be manually reordered"""
        root = OrderedModel.objects.create(name="Root")

        child1 = OrderedModel.objects.create(name="Child 1", parent=root)  # position=10
        child2 = OrderedModel.objects.create(name="Child 2", parent=root)  # position=20
        child3 = OrderedModel.objects.create(name="Child 3", parent=root)  # position=30

        # Move child3 between child1 and child2
        child3.position = 15
        child3.save()

        siblings = list(root.children.all())
        assert siblings[0] == child1
        assert siblings[1] == child3
        assert siblings[2] == child2

    def test_position_per_parent(self):
        """Test that positions are assigned per parent"""
        root1 = OrderedModel.objects.create(name="Root 1")
        root2 = OrderedModel.objects.create(name="Root 2")

        child1_1 = OrderedModel.objects.create(name="Child 1-1", parent=root1)
        child2_1 = OrderedModel.objects.create(name="Child 2-1", parent=root2)

        # Both should get position 10 since they have different parents
        assert child1_1.position == 10
        assert child2_1.position == 10

        child1_2 = OrderedModel.objects.create(name="Child 1-2", parent=root1)
        child2_2 = OrderedModel.objects.create(name="Child 2-2", parent=root2)

        # Both should get position 20
        assert child1_2.position == 20
        assert child2_2.position == 20

    def test_ordering_with_tree_queries(self):
        """Test that ordering works correctly with tree queries"""
        root = OrderedModel.objects.create(name="Root")
        child1 = OrderedModel.objects.create(name="Child 1", parent=root)
        OrderedModel.objects.create(name="Grandchild 1", parent=child1)
        OrderedModel.objects.create(name="Grandchild 2", parent=child1)
        OrderedModel.objects.create(name="Child 2", parent=root)

        # Get tree with tree fields
        nodes = list(OrderedModel.objects.with_tree_fields())

        # Verify depth-first order respects position ordering
        assert nodes[0].name == "Root"
        assert nodes[1].name == "Child 1"
        assert nodes[2].name == "Grandchild 1"
        assert nodes[3].name == "Grandchild 2"
        assert nodes[4].name == "Child 2"

    def test_update_preserves_position(self):
        """Test that updating a node doesn't change its position"""
        root = OrderedModel.objects.create(name="Root")
        child = OrderedModel.objects.create(name="Child", parent=root)

        original_position = child.position
        assert original_position == 10

        # Update the name
        child.name = "Updated Child"
        child.save()

        # Position should remain the same
        assert child.position == original_position

    def test_zero_position_is_replaced(self):
        """Test that position=0 triggers auto-assignment"""
        root = OrderedModel.objects.create(name="Root")

        # Even if we explicitly set position=0, it should be replaced on create
        child = OrderedModel(name="Child", parent=root, position=0)
        child.save()

        assert child.position == 10

        # Create another child to verify positions increment correctly
        child2 = OrderedModel.objects.create(name="Child 2", parent=root)
        assert child2.position == 20

    def test_ordering_inherited_from_meta(self):
        """Test that ordering is inherited from OrderableTreeNode.Meta"""
        # This test verifies that the Meta.ordering is properly inherited
        root = OrderedModel.objects.create(name="Root")
        OrderedModel.objects.create(name="Child 2", parent=root, position=20)
        OrderedModel.objects.create(name="Child 1", parent=root, position=10)
        OrderedModel.objects.create(name="Child 3", parent=root, position=30)

        # Query without explicit ordering should use Meta.ordering
        children = list(OrderedModel.objects.filter(parent=root))

        assert children[0].name == "Child 1"
        assert children[1].name == "Child 2"
        assert children[2].name == "Child 3"