test_apps.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from django.db.backends.signals import connection_created
  2. from django.db.migrations.writer import MigrationWriter
  3. from django.test.utils import modify_settings
  4. from . import PostgreSQLTestCase
  5. try:
  6. from psycopg2.extras import (
  7. DateRange, DateTimeRange, DateTimeTZRange, NumericRange,
  8. )
  9. from django.contrib.postgres.fields import (
  10. DateRangeField, DateTimeRangeField, IntegerRangeField,
  11. )
  12. except ImportError:
  13. pass
  14. class PostgresConfigTests(PostgreSQLTestCase):
  15. def test_register_type_handlers_connection(self):
  16. from django.contrib.postgres.signals import register_type_handlers
  17. self.assertNotIn(register_type_handlers, connection_created._live_receivers(None))
  18. with modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'}):
  19. self.assertIn(register_type_handlers, connection_created._live_receivers(None))
  20. self.assertNotIn(register_type_handlers, connection_created._live_receivers(None))
  21. def test_register_serializer_for_migrations(self):
  22. tests = (
  23. (DateRange(empty=True), DateRangeField),
  24. (DateTimeRange(empty=True), DateRangeField),
  25. (DateTimeTZRange(None, None, '[]'), DateTimeRangeField),
  26. (NumericRange(1, 10), IntegerRangeField),
  27. )
  28. def assertNotSerializable():
  29. for default, test_field in tests:
  30. with self.subTest(default=default):
  31. field = test_field(default=default)
  32. with self.assertRaisesMessage(ValueError, 'Cannot serialize: %s' % default.__class__.__name__):
  33. MigrationWriter.serialize(field)
  34. assertNotSerializable()
  35. with self.modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'}):
  36. for default, test_field in tests:
  37. with self.subTest(default=default):
  38. field = test_field(default=default)
  39. serialized_field, imports = MigrationWriter.serialize(field)
  40. self.assertEqual(imports, {
  41. 'import django.contrib.postgres.fields.ranges',
  42. 'import psycopg2.extras',
  43. })
  44. self.assertIn(
  45. '%s.%s(default=psycopg2.extras.%r)' % (
  46. field.__module__,
  47. field.__class__.__name__,
  48. default,
  49. ),
  50. serialized_field
  51. )
  52. assertNotSerializable()