summaryrefslogtreecommitdiff
path: root/tests/constraints
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes@5monkeys.se>2020-06-11 21:37:12 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-06-16 07:19:00 +0200
commit7edc6e53a746af995e3b89d53d37938dd8fc46aa (patch)
tree9cf8c4745a2051d87606f121080ee1098e7b2092 /tests/constraints
parent69e0d9c553bb55dde8d7d1d479a78bfa7093f406 (diff)
downloaddjango-7edc6e53a746af995e3b89d53d37938dd8fc46aa.tar.gz
Fixed #31702 -- Added support for PostgreSQL opclasses in UniqueConstraint.
Diffstat (limited to 'tests/constraints')
-rw-r--r--tests/constraints/tests.py61
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'],
+ )