django/tests/postgres_tests/test_constraints.py
Simon Charette 883d87074d [2.2.x] Fixed #30258 -- Adjusted postgres schema value quoting of ranges.
Thanks Tilman Koschnick for the report and patch.

Backport of 386d89ab55e620440d30590a8a104fe6d5eef830 from master
2019-03-18 09:32:09 +01:00

36 lines
1.4 KiB
Python

from django.db import connection, transaction
from django.db.models import Q
from django.db.models.constraints import CheckConstraint
from django.db.utils import IntegrityError
from . import PostgreSQLTestCase
from .models import RangesModel
try:
from psycopg2.extras import NumericRange
except ImportError:
pass
class SchemaTests(PostgreSQLTestCase):
def get_constraints(self, table):
"""Get the constraints on the table using a new cursor."""
with connection.cursor() as cursor:
return connection.introspection.get_constraints(cursor, table)
def test_check_constraint_range_value(self):
constraint_name = 'ints_between'
self.assertNotIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
constraint = CheckConstraint(
check=Q(ints__contained_by=NumericRange(10, 30)),
name=constraint_name,
)
with connection.schema_editor() as editor:
editor.add_constraint(RangesModel, constraint)
with connection.cursor() as cursor:
constraints = connection.introspection.get_constraints(cursor, RangesModel._meta.db_table)
self.assertIn(constraint_name, constraints)
with self.assertRaises(IntegrityError), transaction.atomic():
RangesModel.objects.create(ints=(20, 50))
RangesModel.objects.create(ints=(10, 30))