diff options
author | Hannes Ljungberg <hannes@5monkeys.se> | 2020-06-11 21:37:12 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-06-16 07:19:00 +0200 |
commit | 7edc6e53a746af995e3b89d53d37938dd8fc46aa (patch) | |
tree | 9cf8c4745a2051d87606f121080ee1098e7b2092 /tests/constraints | |
parent | 69e0d9c553bb55dde8d7d1d479a78bfa7093f406 (diff) | |
download | django-7edc6e53a746af995e3b89d53d37938dd8fc46aa.tar.gz |
Fixed #31702 -- Added support for PostgreSQL opclasses in UniqueConstraint.
Diffstat (limited to 'tests/constraints')
-rw-r--r-- | tests/constraints/tests.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py index 02320e30b1..4ec1f2a8e8 100644 --- a/tests/constraints/tests.py +++ b/tests/constraints/tests.py @@ -196,6 +196,20 @@ class UniqueConstraintTests(TestCase): self.assertEqual(constraint_1, constraint_1) self.assertNotEqual(constraint_1, constraint_2) + def test_eq_with_opclasses(self): + constraint_1 = models.UniqueConstraint( + fields=['foo', 'bar'], + name='opclasses', + opclasses=['text_pattern_ops', 'varchar_pattern_ops'], + ) + constraint_2 = models.UniqueConstraint( + fields=['foo', 'bar'], + name='opclasses', + opclasses=['varchar_pattern_ops', 'text_pattern_ops'], + ) + self.assertEqual(constraint_1, constraint_1) + self.assertNotEqual(constraint_1, constraint_2) + def test_repr(self): fields = ['foo', 'bar'] name = 'unique_fields' @@ -241,6 +255,18 @@ class UniqueConstraintTests(TestCase): "include=('baz_1', 'baz_2')>", ) + def test_repr_with_opclasses(self): + constraint = models.UniqueConstraint( + fields=['foo', 'bar'], + name='opclasses_fields', + opclasses=['text_pattern_ops', 'varchar_pattern_ops'], + ) + self.assertEqual( + repr(constraint), + "<UniqueConstraint: fields=('foo', 'bar') name='opclasses_fields' " + "opclasses=['text_pattern_ops', 'varchar_pattern_ops']>", + ) + def test_deconstruction(self): fields = ['foo', 'bar'] name = 'unique_fields' @@ -291,6 +317,20 @@ class UniqueConstraintTests(TestCase): 'include': tuple(include), }) + def test_deconstruction_with_opclasses(self): + fields = ['foo', 'bar'] + name = 'unique_fields' + opclasses = ['varchar_pattern_ops', 'text_pattern_ops'] + constraint = models.UniqueConstraint(fields=fields, name=name, opclasses=opclasses) + path, args, kwargs = constraint.deconstruct() + self.assertEqual(path, 'django.db.models.UniqueConstraint') + self.assertEqual(args, ()) + self.assertEqual(kwargs, { + 'fields': tuple(fields), + 'name': name, + 'opclasses': opclasses, + }) + def test_database_constraint(self): with self.assertRaises(IntegrityError): UniqueConstraintProduct.objects.create(name=self.p1.name, color=self.p1.color) @@ -392,3 +432,24 @@ class UniqueConstraintTests(TestCase): fields=['field'], include='other', ) + + def test_invalid_opclasses_argument(self): + msg = 'UniqueConstraint.opclasses must be a list or tuple.' + with self.assertRaisesMessage(ValueError, msg): + models.UniqueConstraint( + name='uniq_opclasses', + fields=['field'], + opclasses='jsonb_path_ops', + ) + + def test_opclasses_and_fields_same_length(self): + msg = ( + 'UniqueConstraint.fields and UniqueConstraint.opclasses must have ' + 'the same number of elements.' + ) + with self.assertRaisesMessage(ValueError, msg): + models.UniqueConstraint( + name='uniq_opclasses', + fields=['field'], + opclasses=['foo', 'bar'], + ) |