Skip to content

Commit 1a38716

Browse files
committed
✅(backend) add comprehensive tests for label alphabetical ordering
- Add API tests for label ordering by slug in hierarchical structure - Add model tests for Label ordering configuration and behavior - Test ordering with numbers, accents, and mixed case scenarios - Verify alphabetical ordering across multiple mailboxes - Ensure consistent ordering behavior for hierarchical labels
1 parent ecbb2fa commit 1a38716

File tree

2 files changed

+264
-0
lines changed

2 files changed

+264
-0
lines changed

src/backend/core/tests/api/test_labels.py

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,3 +1032,146 @@ def test_model_level_cascading_deletion(self, mailbox):
10321032
assert not models.Label.objects.filter(name="Work/Meetings").exists()
10331033
assert not models.Label.objects.filter(name="Work/Projects/Urgent").exists()
10341034
assert models.Label.objects.count() == 0
1035+
1036+
def test_list_labels_alphabetical_order_by_slug(self, api_client, mailbox, user):
1037+
"""Test that labels are returned in alphabetical order by slug."""
1038+
# Create labels in random order to test ordering
1039+
LabelFactory(mailbox=mailbox, name="Zebra")
1040+
LabelFactory(mailbox=mailbox, name="Alpha")
1041+
LabelFactory(mailbox=mailbox, name="Charlie")
1042+
LabelFactory(mailbox=mailbox, name="Beta")
1043+
1044+
url = reverse("labels-list")
1045+
response = api_client.get(url)
1046+
assert response.status_code == status.HTTP_200_OK
1047+
data = response.json()
1048+
1049+
# Verify labels are ordered alphabetically by slug
1050+
assert len(data) == 4
1051+
assert data[0]["slug"] == "alpha"
1052+
assert data[1]["slug"] == "beta"
1053+
assert data[2]["slug"] == "charlie"
1054+
assert data[3]["slug"] == "zebra"
1055+
1056+
def test_list_labels_alphabetical_order_with_numbers(
1057+
self, api_client, mailbox, user
1058+
):
1059+
"""Test that labels with numbers in slugs are ordered correctly."""
1060+
# Create labels with numbers in different positions
1061+
LabelFactory(mailbox=mailbox, name="Label 10")
1062+
LabelFactory(mailbox=mailbox, name="Label 1")
1063+
LabelFactory(mailbox=mailbox, name="Label 2")
1064+
LabelFactory(mailbox=mailbox, name="10 Label")
1065+
LabelFactory(mailbox=mailbox, name="1 Label")
1066+
1067+
url = reverse("labels-list")
1068+
response = api_client.get(url)
1069+
assert response.status_code == status.HTTP_200_OK
1070+
data = response.json()
1071+
1072+
# Verify alphabetical ordering (not numerical)
1073+
assert len(data) == 5
1074+
assert data[0]["slug"] == "1-label"
1075+
assert data[1]["slug"] == "10-label"
1076+
assert data[2]["slug"] == "label-1"
1077+
assert data[3]["slug"] == "label-10"
1078+
assert data[4]["slug"] == "label-2"
1079+
1080+
def test_list_labels_alphabetical_order_with_accents(
1081+
self, api_client, mailbox, user
1082+
):
1083+
"""Test that labels with accented characters are ordered correctly."""
1084+
# Create labels with accented characters
1085+
LabelFactory(mailbox=mailbox, name="État civil")
1086+
LabelFactory(mailbox=mailbox, name="Enfance")
1087+
LabelFactory(mailbox=mailbox, name="Urbanisme")
1088+
1089+
url = reverse("labels-list")
1090+
response = api_client.get(url)
1091+
assert response.status_code == status.HTTP_200_OK
1092+
data = response.json()
1093+
1094+
# Verify alphabetical ordering by slug
1095+
assert len(data) == 3
1096+
assert data[0]["slug"] == "enfance"
1097+
assert data[1]["slug"] == "etat-civil"
1098+
assert data[2]["slug"] == "urbanisme"
1099+
1100+
def test_list_labels_alphabetical_order_hierarchical(
1101+
self, api_client, mailbox, user
1102+
):
1103+
"""Test that hierarchical labels maintain alphabetical order within each level."""
1104+
# Create hierarchical labels in random order
1105+
LabelFactory(mailbox=mailbox, name="Work/Meetings")
1106+
LabelFactory(mailbox=mailbox, name="Work/Projects")
1107+
LabelFactory(mailbox=mailbox, name="Personal/Family")
1108+
LabelFactory(mailbox=mailbox, name="Personal/Friends")
1109+
1110+
url = reverse("labels-list")
1111+
response = api_client.get(url)
1112+
assert response.status_code == status.HTTP_200_OK
1113+
data = response.json()
1114+
1115+
# Verify top-level labels are ordered alphabetically
1116+
assert len(data) == 2
1117+
assert data[0]["slug"] == "personal"
1118+
assert data[1]["slug"] == "work"
1119+
1120+
# Verify children within each parent are ordered alphabetically
1121+
personal_children = data[0]["children"]
1122+
assert len(personal_children) == 2
1123+
assert personal_children[0]["slug"] == "personal-family"
1124+
assert personal_children[1]["slug"] == "personal-friends"
1125+
1126+
work_children = data[1]["children"]
1127+
assert len(work_children) == 2
1128+
assert work_children[0]["slug"] == "work-meetings"
1129+
assert work_children[1]["slug"] == "work-projects"
1130+
1131+
def test_list_labels_alphabetical_order_mixed_mailboxes(
1132+
self, api_client, mailbox, user
1133+
):
1134+
"""Test that labels from different mailboxes maintain alphabetical order."""
1135+
# Create another mailbox
1136+
other_mailbox = MailboxFactory()
1137+
other_mailbox.accesses.create(user=user, role=models.MailboxRoleChoices.ADMIN)
1138+
1139+
# Create labels in both mailboxes
1140+
LabelFactory(mailbox=mailbox, name="Zebra")
1141+
LabelFactory(mailbox=mailbox, name="Alpha")
1142+
LabelFactory(mailbox=other_mailbox, name="Charlie")
1143+
LabelFactory(mailbox=other_mailbox, name="Beta")
1144+
1145+
url = reverse("labels-list")
1146+
response = api_client.get(url)
1147+
assert response.status_code == status.HTTP_200_OK
1148+
data = response.json()
1149+
1150+
# Verify all labels are ordered alphabetically by slug regardless of mailbox
1151+
assert len(data) == 4
1152+
assert data[0]["slug"] == "alpha"
1153+
assert data[1]["slug"] == "beta"
1154+
assert data[2]["slug"] == "charlie"
1155+
assert data[3]["slug"] == "zebra"
1156+
1157+
def test_list_labels_alphabetical_order_case_insensitive(
1158+
self, api_client, mailbox, user
1159+
):
1160+
"""Test that label ordering is case-insensitive."""
1161+
# Create labels with mixed case
1162+
LabelFactory(mailbox=mailbox, name="ZEBRA")
1163+
LabelFactory(mailbox=mailbox, name="alpha")
1164+
LabelFactory(mailbox=mailbox, name="Charlie")
1165+
LabelFactory(mailbox=mailbox, name="BETA")
1166+
1167+
url = reverse("labels-list")
1168+
response = api_client.get(url)
1169+
assert response.status_code == status.HTTP_200_OK
1170+
data = response.json()
1171+
1172+
# Verify case-insensitive alphabetical ordering
1173+
assert len(data) == 4
1174+
assert data[0]["slug"] == "alpha"
1175+
assert data[1]["slug"] == "beta"
1176+
assert data[2]["slug"] == "charlie"
1177+
assert data[3]["slug"] == "zebra"
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
"""Tests for Label model ordering changes from migration 0018."""
2+
3+
import pytest
4+
5+
from core import factories
6+
from core import models as core_models
7+
8+
9+
@pytest.mark.django_db
10+
class TestLabelOrdering:
11+
"""Test Label model ordering changes from migration 0018."""
12+
13+
def test_label_ordering_by_slug(self):
14+
"""Test that Labels are ordered by slug field."""
15+
# Create labels in random order
16+
factories.LabelFactory(name="Charlie", slug="charlie")
17+
factories.LabelFactory(name="Alpha", slug="alpha")
18+
factories.LabelFactory(name="Beta", slug="beta")
19+
20+
# Get all labels from database (should be ordered by slug)
21+
labels = list(core_models.Label.objects.all())
22+
23+
# Verify ordering is by slug (alphabetical)
24+
assert len(labels) == 3
25+
assert labels[0].slug == "alpha"
26+
assert labels[1].slug == "beta"
27+
assert labels[2].slug == "charlie"
28+
29+
def test_label_ordering_with_hierarchical_slugs(self):
30+
"""Test that Labels with hierarchical slugs are ordered correctly."""
31+
mailbox = factories.MailboxFactory()
32+
# Create labels with hierarchical names/slugs
33+
factories.LabelFactory(name="Work", mailbox=mailbox)
34+
factories.LabelFactory(name="Work/Projects", mailbox=mailbox)
35+
factories.LabelFactory(name="Work/Meetings", mailbox=mailbox)
36+
factories.LabelFactory(name="Personal", mailbox=mailbox)
37+
38+
# Get all labels from database (should be ordered by slug)
39+
labels = list(core_models.Label.objects.all())
40+
41+
# Verify ordering is by slug (alphabetical)
42+
assert len(labels) == 4
43+
44+
# Find our labels in the ordered list
45+
assert labels[0].slug == "personal"
46+
assert labels[1].slug == "work"
47+
assert labels[2].slug == "work-meetings"
48+
assert labels[3].slug == "work-projects"
49+
50+
def test_label_ordering_with_accents(self):
51+
"""Test that Labels with accented characters are ordered correctly."""
52+
# Create labels with accented characters
53+
factories.LabelFactory(name="État civil")
54+
factories.LabelFactory(name="Enfance")
55+
factories.LabelFactory(name="Urbanisme")
56+
57+
# Get all labels from database (should be ordered by slug)
58+
labels = list(core_models.Label.objects.all())
59+
60+
# Verify ordering is by slug (alphabetical)
61+
assert len(labels) == 3
62+
63+
# Find our labels in the ordered list
64+
assert labels[0].slug == "enfance"
65+
assert labels[1].slug == "etat-civil"
66+
assert labels[2].slug == "urbanisme"
67+
68+
def test_label_meta_ordering_attribute(self):
69+
"""Test that Label model has correct ordering in Meta class."""
70+
# Check that the Meta class has the correct ordering
71+
assert core_models.Label._meta.ordering == ["slug"]
72+
73+
def test_label_queryset_ordering(self):
74+
"""Test that Label queryset respects the ordering."""
75+
# Create labels in random order
76+
factories.LabelFactory(name="Zebra", slug="zebra")
77+
factories.LabelFactory(name="Alpha", slug="alpha")
78+
factories.LabelFactory(name="Beta", slug="beta")
79+
80+
# Get queryset without explicit ordering
81+
labels = core_models.Label.objects.all()
82+
83+
# Verify the queryset is ordered by slug
84+
label_slugs = list(labels.values_list("slug", flat=True))
85+
assert label_slugs == sorted(label_slugs)
86+
87+
def test_label_ordering_with_same_mailbox(self):
88+
"""Test that Labels are ordered correctly within the same mailbox."""
89+
mailbox = factories.MailboxFactory()
90+
91+
# Create labels in random order for the same mailbox
92+
factories.LabelFactory(name="Charlie", slug="charlie", mailbox=mailbox)
93+
factories.LabelFactory(name="Alpha", slug="alpha", mailbox=mailbox)
94+
factories.LabelFactory(name="Beta", slug="beta", mailbox=mailbox)
95+
96+
# Get labels for this specific mailbox
97+
labels = list(mailbox.labels.all())
98+
99+
# Verify ordering is by slug (alphabetical)
100+
assert len(labels) == 3
101+
assert labels[0].slug == "alpha"
102+
assert labels[1].slug == "beta"
103+
assert labels[2].slug == "charlie"
104+
105+
def test_label_ordering_with_numbers(self):
106+
"""Test that Labels with numbers in slugs are ordered correctly."""
107+
# Create labels with numbers in slugs
108+
factories.LabelFactory(name="Label 1")
109+
factories.LabelFactory(name="Label 10")
110+
factories.LabelFactory(name="Label 2")
111+
112+
# Get all labels from database (should be ordered by slug)
113+
labels = list(core_models.Label.objects.all())
114+
115+
# Verify ordering is by slug (alphabetical, not numerical)
116+
assert len(labels) == 3
117+
118+
# Find our labels in the ordered list
119+
assert labels[0].slug == "label-1"
120+
assert labels[1].slug == "label-10"
121+
assert labels[2].slug == "label-2"

0 commit comments

Comments
 (0)