Skip to content

Commit 19b0eb1

Browse files
committed
constraints edits for partial indexes
MongoDB doesn't support isnull constraints.
1 parent 211d1c2 commit 19b0eb1

File tree

5 files changed

+24
-19
lines changed

5 files changed

+24
-19
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
@@ -842,10 +842,10 @@ def test_database_constraint(self):
842842

843843
@skipUnlessDBFeature("supports_partial_indexes")
844844
def test_database_constraint_with_condition(self):
845-
UniqueConstraintConditionProduct.objects.create(name="p1")
846-
UniqueConstraintConditionProduct.objects.create(name="p2")
845+
UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
846+
UniqueConstraintConditionProduct.objects.create(name="p2", color="blue")
847847
with self.assertRaises(IntegrityError):
848-
UniqueConstraintConditionProduct.objects.create(name="p1")
848+
UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
849849

850850
def test_model_validation(self):
851851
msg = "Unique constraint product with this Name and Color already exists."
@@ -861,13 +861,14 @@ def test_model_validation_with_condition(self):
861861
Model.validate_constraints().
862862
"""
863863
obj1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="red")
864-
obj2 = UniqueConstraintConditionProduct.objects.create(name="p2")
864+
obj2 = UniqueConstraintConditionProduct.objects.create(name="p2", color="blue")
865865
UniqueConstraintConditionProduct(
866866
name=obj1.name, color="blue"
867867
).validate_constraints()
868868
msg = "Constraint “name_without_color_uniq” is violated."
869869
with self.assertRaisesMessage(ValidationError, msg):
870-
UniqueConstraintConditionProduct(name=obj2.name).validate_constraints()
870+
p = UniqueConstraintConditionProduct(name=obj2.name, color="blue")
871+
p.validate_constraints()
871872

872873
def test_model_validation_constraint_no_code_error(self):
873874
class ValidateNoCodeErrorConstraint(UniqueConstraint):
@@ -938,13 +939,13 @@ def test_validate_fields_unattached(self):
938939

939940
@skipUnlessDBFeature("supports_partial_indexes")
940941
def test_validate_condition(self):
941-
p1 = UniqueConstraintConditionProduct.objects.create(name="p1")
942+
p1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
942943
constraint = UniqueConstraintConditionProduct._meta.constraints[0]
943944
msg = "Constraint “name_without_color_uniq” is violated."
944945
with self.assertRaisesMessage(ValidationError, msg):
945946
constraint.validate(
946947
UniqueConstraintConditionProduct,
947-
UniqueConstraintConditionProduct(name=p1.name, color=None),
948+
UniqueConstraintConditionProduct(name=p1.name, color="blue"),
948949
)
949950
# Values not matching condition are ignored.
950951
constraint.validate(
@@ -962,19 +963,19 @@ def test_validate_condition(self):
962963

963964
@skipUnlessDBFeature("supports_partial_indexes")
964965
def test_validate_condition_custom_error(self):
965-
p1 = UniqueConstraintConditionProduct.objects.create(name="p1")
966+
p1 = UniqueConstraintConditionProduct.objects.create(name="p1", color="blue")
966967
constraint = models.UniqueConstraint(
967968
fields=["name"],
968969
name="name_without_color_uniq",
969-
condition=models.Q(color__isnull=True),
970+
condition=models.Q(color="blue"),
970971
violation_error_code="custom_code",
971972
violation_error_message="Custom message",
972973
)
973974
msg = "Custom message"
974975
with self.assertRaisesMessage(ValidationError, msg) as cm:
975976
constraint.validate(
976977
UniqueConstraintConditionProduct,
977-
UniqueConstraintConditionProduct(name=p1.name, color=None),
978+
UniqueConstraintConditionProduct(name=p1.name, color="blue"),
978979
)
979980
self.assertEqual(cm.exception.code, "custom_code")
980981

@@ -1026,9 +1027,13 @@ def test_validate_expression_condition(self):
10261027
constraint = models.UniqueConstraint(
10271028
Lower("name"),
10281029
name="name_lower_without_color_uniq",
1029-
condition=models.Q(color__isnull=True),
1030+
condition=models.Q(color="blue"),
1031+
)
1032+
p2 = UniqueConstraintProduct.objects.create(name="p2", color="blue")
1033+
non_unique_product = UniqueConstraintProduct(
1034+
name=p2.name.upper(),
1035+
color=p2.color,
10301036
)
1031-
non_unique_product = UniqueConstraintProduct(name=self.p2.name.upper())
10321037
msg = "Constraint “name_lower_without_color_uniq” is violated."
10331038
with self.assertRaisesMessage(ValidationError, msg):
10341039
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

tests/validation/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class Meta:
214214
models.UniqueConstraint(
215215
fields=["name"],
216216
name="name_without_color_uniq_validation",
217-
condition=models.Q(color__isnull=True),
217+
condition=models.Q(color="blue"),
218218
),
219219
]
220220

tests/validation/test_constraints.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ def test_full_clean_with_unique_constraints_disabled(self):
7676

7777
@skipUnlessDBFeature("supports_partial_indexes")
7878
def test_full_clean_with_partial_unique_constraints(self):
79-
UniqueConstraintConditionProduct.objects.create(name="product")
80-
product = UniqueConstraintConditionProduct(name="product")
79+
UniqueConstraintConditionProduct.objects.create(name="product", color="blue")
80+
product = UniqueConstraintConditionProduct(name="product", color="blue")
8181
with self.assertRaises(ValidationError) as cm:
8282
product.full_clean()
8383
self.assertEqual(
@@ -91,8 +91,8 @@ def test_full_clean_with_partial_unique_constraints(self):
9191

9292
@skipUnlessDBFeature("supports_partial_indexes")
9393
def test_full_clean_with_partial_unique_constraints_disabled(self):
94-
UniqueConstraintConditionProduct.objects.create(name="product")
95-
product = UniqueConstraintConditionProduct(name="product")
94+
UniqueConstraintConditionProduct.objects.create(name="product", color="blue")
95+
product = UniqueConstraintConditionProduct(name="product", color="blue")
9696
product.full_clean(validate_constraints=False)
9797

9898
@skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")

0 commit comments

Comments
 (0)