96 lines
3.7 KiB
Python
96 lines
3.7 KiB
Python
from django.core.exceptions import ValidationError
|
|
from django.test import TestCase, skipUnlessDBFeature
|
|
|
|
from .models import (
|
|
ChildProduct,
|
|
ChildUniqueConstraintProduct,
|
|
Product,
|
|
UniqueConstraintConditionProduct,
|
|
UniqueConstraintProduct,
|
|
)
|
|
|
|
|
|
class PerformConstraintChecksTest(TestCase):
|
|
@skipUnlessDBFeature("supports_table_check_constraints")
|
|
def test_full_clean_with_check_constraints(self):
|
|
product = Product(price=10, discounted_price=15)
|
|
with self.assertRaises(ValidationError) as cm:
|
|
product.full_clean()
|
|
self.assertEqual(
|
|
cm.exception.message_dict,
|
|
{
|
|
"__all__": [
|
|
"Constraint “price_gt_discounted_price_validation” is violated."
|
|
]
|
|
},
|
|
)
|
|
|
|
@skipUnlessDBFeature("supports_table_check_constraints")
|
|
def test_full_clean_with_check_constraints_on_child_model(self):
|
|
product = ChildProduct(price=10, discounted_price=15)
|
|
with self.assertRaises(ValidationError) as cm:
|
|
product.full_clean()
|
|
self.assertEqual(
|
|
cm.exception.message_dict,
|
|
{
|
|
"__all__": [
|
|
"Constraint “price_gt_discounted_price_validation” is violated."
|
|
]
|
|
},
|
|
)
|
|
|
|
@skipUnlessDBFeature("supports_table_check_constraints")
|
|
def test_full_clean_with_check_constraints_disabled(self):
|
|
product = Product(price=10, discounted_price=15)
|
|
product.full_clean(validate_constraints=False)
|
|
|
|
def test_full_clean_with_unique_constraints(self):
|
|
UniqueConstraintProduct.objects.create(name="product", color="yellow", rank=1)
|
|
tests = [
|
|
UniqueConstraintProduct(name="product", color="yellow", rank=1),
|
|
# Child model.
|
|
ChildUniqueConstraintProduct(name="product", color="yellow", rank=1),
|
|
]
|
|
for product in tests:
|
|
with self.subTest(model=product.__class__.__name__):
|
|
with self.assertRaises(ValidationError) as cm:
|
|
product.full_clean()
|
|
self.assertEqual(
|
|
cm.exception.message_dict,
|
|
{
|
|
"__all__": [
|
|
"Unique constraint product with this Name and Color "
|
|
"already exists."
|
|
],
|
|
"rank": [
|
|
"Unique constraint product with this Rank already exists."
|
|
],
|
|
},
|
|
)
|
|
|
|
def test_full_clean_with_unique_constraints_disabled(self):
|
|
UniqueConstraintProduct.objects.create(name="product", color="yellow", rank=1)
|
|
product = UniqueConstraintProduct(name="product", color="yellow", rank=1)
|
|
product.full_clean(validate_constraints=False)
|
|
|
|
@skipUnlessDBFeature("supports_partial_indexes")
|
|
def test_full_clean_with_partial_unique_constraints(self):
|
|
UniqueConstraintConditionProduct.objects.create(name="product")
|
|
product = UniqueConstraintConditionProduct(name="product")
|
|
with self.assertRaises(ValidationError) as cm:
|
|
product.full_clean()
|
|
self.assertEqual(
|
|
cm.exception.message_dict,
|
|
{
|
|
"__all__": [
|
|
"Constraint “name_without_color_uniq_validation” is violated."
|
|
]
|
|
},
|
|
)
|
|
|
|
@skipUnlessDBFeature("supports_partial_indexes")
|
|
def test_full_clean_with_partial_unique_constraints_disabled(self):
|
|
UniqueConstraintConditionProduct.objects.create(name="product")
|
|
product = UniqueConstraintConditionProduct(name="product")
|
|
product.full_clean(validate_constraints=False)
|