1. from django.apps.registry import apps
    
  2. from django.conf import settings
    
  3. from django.contrib.contenttypes import management as contenttypes_management
    
  4. from django.contrib.contenttypes.models import ContentType
    
  5. from django.core.management import call_command
    
  6. from django.db import migrations, models
    
  7. from django.test import TransactionTestCase, override_settings
    
  8. 
    
  9. 
    
  10. @override_settings(
    
  11.     MIGRATION_MODULES=dict(
    
  12.         settings.MIGRATION_MODULES,
    
  13.         contenttypes_tests="contenttypes_tests.operations_migrations",
    
  14.     ),
    
  15. )
    
  16. class ContentTypeOperationsTests(TransactionTestCase):
    
  17.     databases = {"default", "other"}
    
  18.     available_apps = [
    
  19.         "contenttypes_tests",
    
  20.         "django.contrib.contenttypes",
    
  21.     ]
    
  22. 
    
  23.     class TestRouter:
    
  24.         def db_for_write(self, model, **hints):
    
  25.             return "default"
    
  26. 
    
  27.     def setUp(self):
    
  28.         app_config = apps.get_app_config("contenttypes_tests")
    
  29.         models.signals.post_migrate.connect(
    
  30.             self.assertOperationsInjected, sender=app_config
    
  31.         )
    
  32. 
    
  33.     def tearDown(self):
    
  34.         app_config = apps.get_app_config("contenttypes_tests")
    
  35.         models.signals.post_migrate.disconnect(
    
  36.             self.assertOperationsInjected, sender=app_config
    
  37.         )
    
  38. 
    
  39.     def assertOperationsInjected(self, plan, **kwargs):
    
  40.         for migration, _backward in plan:
    
  41.             operations = iter(migration.operations)
    
  42.             for operation in operations:
    
  43.                 if isinstance(operation, migrations.RenameModel):
    
  44.                     next_operation = next(operations)
    
  45.                     self.assertIsInstance(
    
  46.                         next_operation, contenttypes_management.RenameContentType
    
  47.                     )
    
  48.                     self.assertEqual(next_operation.app_label, migration.app_label)
    
  49.                     self.assertEqual(next_operation.old_model, operation.old_name_lower)
    
  50.                     self.assertEqual(next_operation.new_model, operation.new_name_lower)
    
  51. 
    
  52.     def test_existing_content_type_rename(self):
    
  53.         ContentType.objects.create(app_label="contenttypes_tests", model="foo")
    
  54.         call_command(
    
  55.             "migrate",
    
  56.             "contenttypes_tests",
    
  57.             database="default",
    
  58.             interactive=False,
    
  59.             verbosity=0,
    
  60.         )
    
  61.         self.assertFalse(
    
  62.             ContentType.objects.filter(
    
  63.                 app_label="contenttypes_tests", model="foo"
    
  64.             ).exists()
    
  65.         )
    
  66.         self.assertTrue(
    
  67.             ContentType.objects.filter(
    
  68.                 app_label="contenttypes_tests", model="renamedfoo"
    
  69.             ).exists()
    
  70.         )
    
  71.         call_command(
    
  72.             "migrate",
    
  73.             "contenttypes_tests",
    
  74.             "zero",
    
  75.             database="default",
    
  76.             interactive=False,
    
  77.             verbosity=0,
    
  78.         )
    
  79.         self.assertTrue(
    
  80.             ContentType.objects.filter(
    
  81.                 app_label="contenttypes_tests", model="foo"
    
  82.             ).exists()
    
  83.         )
    
  84.         self.assertFalse(
    
  85.             ContentType.objects.filter(
    
  86.                 app_label="contenttypes_tests", model="renamedfoo"
    
  87.             ).exists()
    
  88.         )
    
  89. 
    
  90.     @override_settings(DATABASE_ROUTERS=[TestRouter()])
    
  91.     def test_existing_content_type_rename_other_database(self):
    
  92.         ContentType.objects.using("other").create(
    
  93.             app_label="contenttypes_tests", model="foo"
    
  94.         )
    
  95.         other_content_types = ContentType.objects.using("other").filter(
    
  96.             app_label="contenttypes_tests"
    
  97.         )
    
  98.         call_command(
    
  99.             "migrate",
    
  100.             "contenttypes_tests",
    
  101.             database="other",
    
  102.             interactive=False,
    
  103.             verbosity=0,
    
  104.         )
    
  105.         self.assertFalse(other_content_types.filter(model="foo").exists())
    
  106.         self.assertTrue(other_content_types.filter(model="renamedfoo").exists())
    
  107.         call_command(
    
  108.             "migrate",
    
  109.             "contenttypes_tests",
    
  110.             "zero",
    
  111.             database="other",
    
  112.             interactive=False,
    
  113.             verbosity=0,
    
  114.         )
    
  115.         self.assertTrue(other_content_types.filter(model="foo").exists())
    
  116.         self.assertFalse(other_content_types.filter(model="renamedfoo").exists())
    
  117. 
    
  118.     def test_missing_content_type_rename_ignore(self):
    
  119.         call_command(
    
  120.             "migrate",
    
  121.             "contenttypes_tests",
    
  122.             database="default",
    
  123.             interactive=False,
    
  124.             verbosity=0,
    
  125.         )
    
  126.         self.assertFalse(
    
  127.             ContentType.objects.filter(
    
  128.                 app_label="contenttypes_tests", model="foo"
    
  129.             ).exists()
    
  130.         )
    
  131.         self.assertTrue(
    
  132.             ContentType.objects.filter(
    
  133.                 app_label="contenttypes_tests", model="renamedfoo"
    
  134.             ).exists()
    
  135.         )
    
  136.         call_command(
    
  137.             "migrate",
    
  138.             "contenttypes_tests",
    
  139.             "zero",
    
  140.             database="default",
    
  141.             interactive=False,
    
  142.             verbosity=0,
    
  143.         )
    
  144.         self.assertTrue(
    
  145.             ContentType.objects.filter(
    
  146.                 app_label="contenttypes_tests", model="foo"
    
  147.             ).exists()
    
  148.         )
    
  149.         self.assertFalse(
    
  150.             ContentType.objects.filter(
    
  151.                 app_label="contenttypes_tests", model="renamedfoo"
    
  152.             ).exists()
    
  153.         )
    
  154. 
    
  155.     def test_content_type_rename_conflict(self):
    
  156.         ContentType.objects.create(app_label="contenttypes_tests", model="foo")
    
  157.         ContentType.objects.create(app_label="contenttypes_tests", model="renamedfoo")
    
  158.         call_command(
    
  159.             "migrate",
    
  160.             "contenttypes_tests",
    
  161.             database="default",
    
  162.             interactive=False,
    
  163.             verbosity=0,
    
  164.         )
    
  165.         self.assertTrue(
    
  166.             ContentType.objects.filter(
    
  167.                 app_label="contenttypes_tests", model="foo"
    
  168.             ).exists()
    
  169.         )
    
  170.         self.assertTrue(
    
  171.             ContentType.objects.filter(
    
  172.                 app_label="contenttypes_tests", model="renamedfoo"
    
  173.             ).exists()
    
  174.         )
    
  175.         call_command(
    
  176.             "migrate",
    
  177.             "contenttypes_tests",
    
  178.             "zero",
    
  179.             database="default",
    
  180.             interactive=False,
    
  181.             verbosity=0,
    
  182.         )
    
  183.         self.assertTrue(
    
  184.             ContentType.objects.filter(
    
  185.                 app_label="contenttypes_tests", model="foo"
    
  186.             ).exists()
    
  187.         )
    
  188.         self.assertTrue(
    
  189.             ContentType.objects.filter(
    
  190.                 app_label="contenttypes_tests", model="renamedfoo"
    
  191.             ).exists()
    
  192.         )