summaryrefslogtreecommitdiff
path: root/tests/constraints
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes@5monkeys.se>2019-10-31 13:33:53 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-06-04 12:26:22 +0200
commit8c7992f658e1125f8dc20b19206e8bbbe4187372 (patch)
treeba09524a9a3d27bb33f22dc92dec4b60a80f37e1 /tests/constraints
parentf997b5e6ae85e2df2342b1a7812fe8130206c957 (diff)
downloaddjango-8c7992f658e1125f8dc20b19206e8bbbe4187372.tar.gz
Fixed #30913 -- Added support for covering indexes on PostgreSQL 11+.
Diffstat (limited to 'tests/constraints')
-rw-r--r--tests/constraints/models.py17
-rw-r--r--tests/constraints/tests.py61
2 files changed, 77 insertions, 1 deletions
diff --git a/tests/constraints/models.py b/tests/constraints/models.py
index 3d091f6ccf..947d1b4ff1 100644
--- a/tests/constraints/models.py
+++ b/tests/constraints/models.py
@@ -81,6 +81,23 @@ class UniqueConstraintDeferrable(models.Model):
]
+class UniqueConstraintInclude(models.Model):
+ name = models.CharField(max_length=255)
+ color = models.CharField(max_length=32, null=True)
+
+ class Meta:
+ required_db_features = {
+ 'supports_table_check_constraints',
+ }
+ constraints = [
+ models.UniqueConstraint(
+ fields=['name'],
+ name='name_include_color_uniq',
+ include=['color'],
+ ),
+ ]
+
+
class AbstractModel(models.Model):
age = models.IntegerField()
diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py
index 8eb62a940d..02320e30b1 100644
--- a/tests/constraints/tests.py
+++ b/tests/constraints/tests.py
@@ -8,7 +8,8 @@ from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from .models import (
ChildModel, Product, UniqueConstraintConditionProduct,
- UniqueConstraintDeferrable, UniqueConstraintProduct,
+ UniqueConstraintDeferrable, UniqueConstraintInclude,
+ UniqueConstraintProduct,
)
@@ -181,6 +182,20 @@ class UniqueConstraintTests(TestCase):
self.assertEqual(constraint_1, constraint_1)
self.assertNotEqual(constraint_1, constraint_2)
+ def test_eq_with_include(self):
+ constraint_1 = models.UniqueConstraint(
+ fields=['foo', 'bar'],
+ name='include',
+ include=['baz_1'],
+ )
+ constraint_2 = models.UniqueConstraint(
+ fields=['foo', 'bar'],
+ name='include',
+ include=['baz_2'],
+ )
+ self.assertEqual(constraint_1, constraint_1)
+ self.assertNotEqual(constraint_1, constraint_2)
+
def test_repr(self):
fields = ['foo', 'bar']
name = 'unique_fields'
@@ -214,6 +229,18 @@ class UniqueConstraintTests(TestCase):
"deferrable=Deferrable.IMMEDIATE>",
)
+ def test_repr_with_include(self):
+ constraint = models.UniqueConstraint(
+ fields=['foo', 'bar'],
+ name='include_fields',
+ include=['baz_1', 'baz_2'],
+ )
+ self.assertEqual(
+ repr(constraint),
+ "<UniqueConstraint: fields=('foo', 'bar') name='include_fields' "
+ "include=('baz_1', 'baz_2')>",
+ )
+
def test_deconstruction(self):
fields = ['foo', 'bar']
name = 'unique_fields'
@@ -250,6 +277,20 @@ class UniqueConstraintTests(TestCase):
'deferrable': models.Deferrable.DEFERRED,
})
+ def test_deconstruction_with_include(self):
+ fields = ['foo', 'bar']
+ name = 'unique_fields'
+ include = ['baz_1', 'baz_2']
+ constraint = models.UniqueConstraint(fields=fields, name=name, include=include)
+ path, args, kwargs = constraint.deconstruct()
+ self.assertEqual(path, 'django.db.models.UniqueConstraint')
+ self.assertEqual(args, ())
+ self.assertEqual(kwargs, {
+ 'fields': tuple(fields),
+ 'name': name,
+ 'include': tuple(include),
+ })
+
def test_database_constraint(self):
with self.assertRaises(IntegrityError):
UniqueConstraintProduct.objects.create(name=self.p1.name, color=self.p1.color)
@@ -333,3 +374,21 @@ class UniqueConstraintTests(TestCase):
name='name_invalid',
deferrable='invalid',
)
+
+ @skipUnlessDBFeature(
+ 'supports_table_check_constraints',
+ 'supports_covering_indexes',
+ )
+ def test_include_database_constraint(self):
+ UniqueConstraintInclude.objects.create(name='p1', color='red')
+ with self.assertRaises(IntegrityError):
+ UniqueConstraintInclude.objects.create(name='p1', color='blue')
+
+ def test_invalid_include_argument(self):
+ msg = 'UniqueConstraint.include must be a list or tuple.'
+ with self.assertRaisesMessage(ValueError, msg):
+ models.UniqueConstraint(
+ name='uniq_include',
+ fields=['field'],
+ include='other',
+ )