Skip to content

Commit d03cf96

Browse files
committed
constraints edits for partial indexes
MongoDB doesn't support isnull constraints.
1 parent 70ba0a1 commit d03cf96

File tree

3 files changed

+19
-14
lines changed

3 files changed

+19
-14
lines changed

tests/constraints/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class Meta:
5858
models.UniqueConstraint(
5959
fields=["name"],
6060
name="name_without_color_uniq",
61-
condition=models.Q(color__isnull=True),
61+
condition=models.Q(color="blue"),
6262
),
6363
]
6464

tests/constraints/tests.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -821,10 +821,10 @@ def test_database_constraint(self):
821821

822822
@skipUnlessDBFeature("supports_partial_indexes")
823823
def test_database_constraint_with_condition(self):
824-
UniqueConstraintConditionProduct.objects.create(name="p1")
825-
UniqueConstraintConditionProduct.objects.create(name="p2")
824+
UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
825+
UniqueConstraintConditionProduct.objects.create(name="p2", color="blue")
826826
with self.assertRaises(IntegrityError):
827-
UniqueConstraintConditionProduct.objects.create(name="p1")
827+
UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
828828

829829
def test_model_validation(self):
830830
msg = "Unique constraint product with this Name and Color already exists."
@@ -840,13 +840,14 @@ def test_model_validation_with_condition(self):
840840
Model.validate_constraints().
841841
"""
842842
obj1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="red")
843-
obj2 = UniqueConstraintConditionProduct.objects.create(name="p2")
843+
obj2 = UniqueConstraintConditionProduct.objects.create(name="p2", color="blue")
844844
UniqueConstraintConditionProduct(
845845
name=obj1.name, color="blue"
846846
).validate_constraints()
847847
msg = "Constraint “name_without_color_uniq” is violated."
848848
with self.assertRaisesMessage(ValidationError, msg):
849-
UniqueConstraintConditionProduct(name=obj2.name).validate_constraints()
849+
p = UniqueConstraintConditionProduct(name=obj2.name, color="blue")
850+
p.validate_constraints()
850851

851852
def test_model_validation_constraint_no_code_error(self):
852853
class ValidateNoCodeErrorConstraint(UniqueConstraint):
@@ -917,13 +918,13 @@ def test_validate_fields_unattached(self):
917918

918919
@skipUnlessDBFeature("supports_partial_indexes")
919920
def test_validate_condition(self):
920-
p1 = UniqueConstraintConditionProduct.objects.create(name="p1")
921+
p1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
921922
constraint = UniqueConstraintConditionProduct._meta.constraints[0]
922923
msg = "Constraint “name_without_color_uniq” is violated."
923924
with self.assertRaisesMessage(ValidationError, msg):
924925
constraint.validate(
925926
UniqueConstraintConditionProduct,
926-
UniqueConstraintConditionProduct(name=p1.name, color=None),
927+
UniqueConstraintConditionProduct(name=p1.name, color="blue"),
927928
)
928929
# Values not matching condition are ignored.
929930
constraint.validate(
@@ -941,19 +942,19 @@ def test_validate_condition(self):
941942

942943
@skipUnlessDBFeature("supports_partial_indexes")
943944
def test_validate_condition_custom_error(self):
944-
p1 = UniqueConstraintConditionProduct.objects.create(name="p1")
945+
p1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
945946
constraint = models.UniqueConstraint(
946947
fields=["name"],
947948
name="name_without_color_uniq",
948-
condition=models.Q(color__isnull=True),
949+
condition=models.Q(color="blue"),
949950
violation_error_code="custom_code",
950951
violation_error_message="Custom message",
951952
)
952953
msg = "Custom message"
953954
with self.assertRaisesMessage(ValidationError, msg) as cm:
954955
constraint.validate(
955956
UniqueConstraintConditionProduct,
956-
UniqueConstraintConditionProduct(name=p1.name, color=None),
957+
UniqueConstraintConditionProduct(name=p1.name, color="blue"),
957958
)
958959
self.assertEqual(cm.exception.code, "custom_code")
959960

@@ -1006,9 +1007,13 @@ def test_validate_expression_condition(self):
10061007
constraint = models.UniqueConstraint(
10071008
Lower("name"),
10081009
name="name_lower_without_color_uniq",
1009-
condition=models.Q(color__isnull=True),
1010+
condition=models.Q(color="blue"),
1011+
)
1012+
p2 = UniqueConstraintProduct.objects.create(name="p2", color="blue")
1013+
non_unique_product = UniqueConstraintProduct(
1014+
name=p2.name.upper(),
1015+
color=p2.color,
10101016
)
1011-
non_unique_product = UniqueConstraintProduct(name=self.p2.name.upper())
10121017
msg = "Constraint “name_lower_without_color_uniq” is violated."
10131018
with self.assertRaisesMessage(ValidationError, msg):
10141019
constraint.validate(UniqueConstraintProduct, non_unique_product)

tests/introspection/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class Meta:
9797
models.UniqueConstraint(
9898
fields=["name"],
9999
name="cond_name_without_color_uniq",
100-
condition=models.Q(color__isnull=True),
100+
condition=models.Q(color="blue"),
101101
),
102102
]
103103

0 commit comments

Comments
 (0)