summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_constraints.py
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2019-07-10 10:33:36 +0200
committerGitHub <noreply@github.com>2019-07-10 10:33:36 +0200
commit7991111af12056ec9a856f35935d273526338c1f (patch)
tree4067b5171a44f6d559c6d44cda34338c75b73ecc /tests/postgres_tests/test_constraints.py
parentee6e93ec8727d0f5ed33190a3c354867669ed72f (diff)
Fixed #30621 -- Fixed crash of __contains lookup for Date/DateTimeRangeField when the right hand side is the same type.
Thanks Tilman Koschnick for the report and initial patch. Thanks Carlton Gibson the review. Regression in 6b048b364ca1e0e56a0d3815bf2be33ac9998355.
Diffstat (limited to 'tests/postgres_tests/test_constraints.py')
-rw-r--r--tests/postgres_tests/test_constraints.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/tests/postgres_tests/test_constraints.py b/tests/postgres_tests/test_constraints.py
index 0e09a1c546..2fc6ee5322 100644
--- a/tests/postgres_tests/test_constraints.py
+++ b/tests/postgres_tests/test_constraints.py
@@ -1,5 +1,7 @@
+import datetime
+
from django.db import connection, transaction
-from django.db.models import Q
+from django.db.models import F, Q
from django.db.models.constraints import CheckConstraint
from django.db.utils import IntegrityError
@@ -33,3 +35,51 @@ class SchemaTests(PostgreSQLTestCase):
with self.assertRaises(IntegrityError), transaction.atomic():
RangesModel.objects.create(ints=(20, 50))
RangesModel.objects.create(ints=(10, 30))
+
+ def test_check_constraint_daterange_contains(self):
+ constraint_name = 'dates_contains'
+ self.assertNotIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
+ constraint = CheckConstraint(
+ check=Q(dates__contains=F('dates_inner')),
+ 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)
+ date_1 = datetime.date(2016, 1, 1)
+ date_2 = datetime.date(2016, 1, 4)
+ with self.assertRaises(IntegrityError), transaction.atomic():
+ RangesModel.objects.create(
+ dates=(date_1, date_2),
+ dates_inner=(date_1, date_2.replace(day=5)),
+ )
+ RangesModel.objects.create(
+ dates=(date_1, date_2),
+ dates_inner=(date_1, date_2),
+ )
+
+ def test_check_constraint_datetimerange_contains(self):
+ constraint_name = 'timestamps_contains'
+ self.assertNotIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
+ constraint = CheckConstraint(
+ check=Q(timestamps__contains=F('timestamps_inner')),
+ 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)
+ datetime_1 = datetime.datetime(2016, 1, 1)
+ datetime_2 = datetime.datetime(2016, 1, 2, 12)
+ with self.assertRaises(IntegrityError), transaction.atomic():
+ RangesModel.objects.create(
+ timestamps=(datetime_1, datetime_2),
+ timestamps_inner=(datetime_1, datetime_2.replace(hour=13)),
+ )
+ RangesModel.objects.create(
+ timestamps=(datetime_1, datetime_2),
+ timestamps_inner=(datetime_1, datetime_2),
+ )