diff options
| author | can <cansarigol@derinbilgi.com.tr> | 2019-01-10 21:06:14 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-01-11 19:32:26 -0500 |
| commit | e192223ed996ed30fe83787efdfa7f2be6b1a2ee (patch) | |
| tree | 9df52b1c13822530479ada809c93033da150e4a1 /tests/postgres_tests | |
| parent | 7d3b3897c1d7b1ae4dfea6ae0d4f431d3e3dec1c (diff) | |
Fixed #29738 -- Allowed serializing psycopg2 range types in migrations.
Diffstat (limited to 'tests/postgres_tests')
| -rw-r--r-- | tests/postgres_tests/test_apps.py | 46 |
1 files changed, 46 insertions, 0 deletions
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() |
