1. from decimal import Decimal
    
  2. 
    
  3. from django.db.backends.signals import connection_created
    
  4. from django.db.migrations.writer import MigrationWriter
    
  5. from django.test.utils import modify_settings
    
  6. 
    
  7. from . import PostgreSQLTestCase
    
  8. 
    
  9. try:
    
  10.     from psycopg2.extras import DateRange, DateTimeRange, DateTimeTZRange, NumericRange
    
  11. 
    
  12.     from django.contrib.postgres.fields import (
    
  13.         DateRangeField,
    
  14.         DateTimeRangeField,
    
  15.         DecimalRangeField,
    
  16.         IntegerRangeField,
    
  17.     )
    
  18. except ImportError:
    
  19.     pass
    
  20. 
    
  21. 
    
  22. class PostgresConfigTests(PostgreSQLTestCase):
    
  23.     def test_register_type_handlers_connection(self):
    
  24.         from django.contrib.postgres.signals import register_type_handlers
    
  25. 
    
  26.         self.assertNotIn(
    
  27.             register_type_handlers, connection_created._live_receivers(None)
    
  28.         )
    
  29.         with modify_settings(INSTALLED_APPS={"append": "django.contrib.postgres"}):
    
  30.             self.assertIn(
    
  31.                 register_type_handlers, connection_created._live_receivers(None)
    
  32.             )
    
  33.         self.assertNotIn(
    
  34.             register_type_handlers, connection_created._live_receivers(None)
    
  35.         )
    
  36. 
    
  37.     def test_register_serializer_for_migrations(self):
    
  38.         tests = (
    
  39.             (DateRange(empty=True), DateRangeField),
    
  40.             (DateTimeRange(empty=True), DateRangeField),
    
  41.             (DateTimeTZRange(None, None, "[]"), DateTimeRangeField),
    
  42.             (NumericRange(Decimal("1.0"), Decimal("5.0"), "()"), DecimalRangeField),
    
  43.             (NumericRange(1, 10), IntegerRangeField),
    
  44.         )
    
  45. 
    
  46.         def assertNotSerializable():
    
  47.             for default, test_field in tests:
    
  48.                 with self.subTest(default=default):
    
  49.                     field = test_field(default=default)
    
  50.                     with self.assertRaisesMessage(
    
  51.                         ValueError, "Cannot serialize: %s" % default.__class__.__name__
    
  52.                     ):
    
  53.                         MigrationWriter.serialize(field)
    
  54. 
    
  55.         assertNotSerializable()
    
  56.         with self.modify_settings(INSTALLED_APPS={"append": "django.contrib.postgres"}):
    
  57.             for default, test_field in tests:
    
  58.                 with self.subTest(default=default):
    
  59.                     field = test_field(default=default)
    
  60.                     serialized_field, imports = MigrationWriter.serialize(field)
    
  61.                     self.assertEqual(
    
  62.                         imports,
    
  63.                         {
    
  64.                             "import django.contrib.postgres.fields.ranges",
    
  65.                             "import psycopg2.extras",
    
  66.                         },
    
  67.                     )
    
  68.                     self.assertIn(
    
  69.                         "%s.%s(default=psycopg2.extras.%r)"
    
  70.                         % (
    
  71.                             field.__module__,
    
  72.                             field.__class__.__name__,
    
  73.                             default,
    
  74.                         ),
    
  75.                         serialized_field,
    
  76.                     )
    
  77.         assertNotSerializable()