From e192223ed996ed30fe83787efdfa7f2be6b1a2ee Mon Sep 17 00:00:00 2001 From: can Date: Thu, 10 Jan 2019 21:06:14 +0300 Subject: Fixed #29738 -- Allowed serializing psycopg2 range types in migrations. --- tests/postgres_tests/test_apps.py | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'tests/postgres_tests/test_apps.py') diff --git a/tests/postgres_tests/test_apps.py b/tests/postgres_tests/test_apps.py index a5740f9d15..7b56c8f716 100644 --- a/tests/postgres_tests/test_apps.py +++ b/tests/postgres_tests/test_apps.py @@ -1,8 +1,19 @@ from django.db.backends.signals import connection_created +from django.db.migrations.writer import MigrationWriter from django.test.utils import modify_settings from . import PostgreSQLTestCase +try: + from psycopg2.extras import ( + DateRange, DateTimeRange, DateTimeTZRange, NumericRange, + ) + from django.contrib.postgres.fields import ( + DateRangeField, DateTimeRangeField, IntegerRangeField, + ) +except ImportError: + pass + class PostgresConfigTests(PostgreSQLTestCase): def test_register_type_handlers_connection(self): @@ -11,3 +22,38 @@ class PostgresConfigTests(PostgreSQLTestCase): with modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'}): self.assertIn(register_type_handlers, connection_created._live_receivers(None)) self.assertNotIn(register_type_handlers, connection_created._live_receivers(None)) + + def test_register_serializer_for_migrations(self): + tests = ( + (DateRange(empty=True), DateRangeField), + (DateTimeRange(empty=True), DateRangeField), + (DateTimeTZRange(None, None, '[]'), DateTimeRangeField), + (NumericRange(1, 10), IntegerRangeField), + ) + + def assertNotSerializable(): + for default, test_field in tests: + with self.subTest(default=default): + field = test_field(default=default) + with self.assertRaisesMessage(ValueError, 'Cannot serialize: %s' % default.__class__.__name__): + MigrationWriter.serialize(field) + + assertNotSerializable() + with self.modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'}): + for default, test_field in tests: + with self.subTest(default=default): + field = test_field(default=default) + serialized_field, imports = MigrationWriter.serialize(field) + self.assertEqual(imports, { + 'import django.contrib.postgres.fields.ranges', + 'import psycopg2.extras', + }) + self.assertIn( + '%s.%s(default=psycopg2.extras.%r)' % ( + field.__module__, + field.__class__.__name__, + default, + ), + serialized_field + ) + assertNotSerializable() -- cgit v1.3