diff options
author | Hannes Ljungberg <hannes@5monkeys.se> | 2019-10-31 13:33:53 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-06-04 12:26:22 +0200 |
commit | 8c7992f658e1125f8dc20b19206e8bbbe4187372 (patch) | |
tree | ba09524a9a3d27bb33f22dc92dec4b60a80f37e1 /tests/constraints | |
parent | f997b5e6ae85e2df2342b1a7812fe8130206c957 (diff) | |
download | django-8c7992f658e1125f8dc20b19206e8bbbe4187372.tar.gz |
Fixed #30913 -- Added support for covering indexes on PostgreSQL 11+.
Diffstat (limited to 'tests/constraints')
-rw-r--r-- | tests/constraints/models.py | 17 | ||||
-rw-r--r-- | tests/constraints/tests.py | 61 |
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', + ) |