diff options
Diffstat (limited to 'tests/constraints')
| -rw-r--r-- | tests/constraints/models.py | 17 | ||||
| -rw-r--r-- | tests/constraints/tests.py | 25 |
2 files changed, 28 insertions, 14 deletions
diff --git a/tests/constraints/models.py b/tests/constraints/models.py index fb6ef620f0..d207de6e73 100644 --- a/tests/constraints/models.py +++ b/tests/constraints/models.py @@ -2,12 +2,13 @@ from django.db import models class Product(models.Model): - name = models.CharField(max_length=255) - color = models.CharField(max_length=32, null=True) price = models.IntegerField(null=True) discounted_price = models.IntegerField(null=True) class Meta: + required_db_features = { + 'supports_table_check_constraints', + } constraints = [ models.CheckConstraint( check=models.Q(price__gt=models.F('discounted_price')), @@ -17,6 +18,15 @@ class Product(models.Model): check=models.Q(price__gt=0), name='%(app_label)s_%(class)s_price_gt_0', ), + ] + + +class UniqueConstraintProduct(models.Model): + name = models.CharField(max_length=255) + color = models.CharField(max_length=32, null=True) + + class Meta: + constraints = [ models.UniqueConstraint(fields=['name', 'color'], name='name_color_uniq'), models.UniqueConstraint( fields=['name'], @@ -31,6 +41,9 @@ class AbstractModel(models.Model): class Meta: abstract = True + required_db_features = { + 'supports_table_check_constraints', + } constraints = [ models.CheckConstraint( check=models.Q(age__gte=18), diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py index 7ac478a89f..3b28c99e7f 100644 --- a/tests/constraints/tests.py +++ b/tests/constraints/tests.py @@ -3,7 +3,7 @@ from django.db import IntegrityError, connection, models from django.db.models.constraints import BaseConstraint from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature -from .models import ChildModel, Product +from .models import ChildModel, Product, UniqueConstraintProduct def get_constraints(table): @@ -69,9 +69,9 @@ class CheckConstraintTests(TestCase): @skipUnlessDBFeature('supports_table_check_constraints') def test_database_constraint(self): - Product.objects.create(name='Valid', price=10, discounted_price=5) + Product.objects.create(price=10, discounted_price=5) with self.assertRaises(IntegrityError): - Product.objects.create(name='Invalid', price=10, discounted_price=20) + Product.objects.create(price=10, discounted_price=20) @skipUnlessDBFeature('supports_table_check_constraints', 'can_introspect_check_constraints') def test_name(self): @@ -92,9 +92,9 @@ class CheckConstraintTests(TestCase): class UniqueConstraintTests(TestCase): @classmethod def setUpTestData(cls): - cls.p1, cls.p2 = Product.objects.bulk_create([ - Product(name='p1', color='red'), - Product(name='p2'), + cls.p1, cls.p2 = UniqueConstraintProduct.objects.bulk_create([ + UniqueConstraintProduct(name='p1', color='red'), + UniqueConstraintProduct(name='p2'), ]) def test_eq(self): @@ -177,19 +177,20 @@ class UniqueConstraintTests(TestCase): def test_database_constraint(self): with self.assertRaises(IntegrityError): - Product.objects.create(name=self.p1.name, color=self.p1.color) + UniqueConstraintProduct.objects.create(name=self.p1.name, color=self.p1.color) def test_model_validation(self): - with self.assertRaisesMessage(ValidationError, 'Product with this Name and Color already exists.'): - Product(name=self.p1.name, color=self.p1.color).validate_unique() + msg = 'Unique constraint product with this Name and Color already exists.' + with self.assertRaisesMessage(ValidationError, msg): + UniqueConstraintProduct(name=self.p1.name, color=self.p1.color).validate_unique() def test_model_validation_with_condition(self): """Partial unique constraints are ignored by Model.validate_unique().""" - Product(name=self.p1.name, color='blue').validate_unique() - Product(name=self.p2.name).validate_unique() + UniqueConstraintProduct(name=self.p1.name, color='blue').validate_unique() + UniqueConstraintProduct(name=self.p2.name).validate_unique() def test_name(self): - constraints = get_constraints(Product._meta.db_table) + constraints = get_constraints(UniqueConstraintProduct._meta.db_table) expected_name = 'name_color_uniq' self.assertIn(expected_name, constraints) |
