test_migrations.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from importlib import import_module
  2. from django.apps import apps
  3. from django.contrib.auth.models import Permission, User
  4. from django.contrib.contenttypes.models import ContentType
  5. from django.test import TestCase
  6. from .models import Proxy, UserProxy
  7. update_proxy_permissions = import_module('django.contrib.auth.migrations.0011_update_proxy_permissions')
  8. class ProxyModelWithDifferentAppLabelTests(TestCase):
  9. available_apps = [
  10. 'auth_tests',
  11. 'django.contrib.auth',
  12. 'django.contrib.contenttypes',
  13. ]
  14. def setUp(self):
  15. """
  16. Create proxy permissions with content_type to the concrete model
  17. rather than the proxy model (as they were before Django 2.2 and
  18. migration 11).
  19. """
  20. Permission.objects.all().delete()
  21. self.concrete_content_type = ContentType.objects.get_for_model(UserProxy)
  22. self.default_permission = Permission.objects.create(
  23. content_type=self.concrete_content_type,
  24. codename='add_userproxy',
  25. name='Can add userproxy',
  26. )
  27. self.custom_permission = Permission.objects.create(
  28. content_type=self.concrete_content_type,
  29. codename='use_different_app_label',
  30. name='May use a different app label',
  31. )
  32. def test_proxy_model_permissions_contenttype(self):
  33. proxy_model_content_type = ContentType.objects.get_for_model(UserProxy, for_concrete_model=False)
  34. self.assertEqual(self.default_permission.content_type, self.concrete_content_type)
  35. self.assertEqual(self.custom_permission.content_type, self.concrete_content_type)
  36. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  37. self.default_permission.refresh_from_db()
  38. self.assertEqual(self.default_permission.content_type, proxy_model_content_type)
  39. self.custom_permission.refresh_from_db()
  40. self.assertEqual(self.custom_permission.content_type, proxy_model_content_type)
  41. def test_user_has_now_proxy_model_permissions(self):
  42. user = User.objects.create()
  43. user.user_permissions.add(self.default_permission)
  44. user.user_permissions.add(self.custom_permission)
  45. for permission in [self.default_permission, self.custom_permission]:
  46. self.assertTrue(user.has_perm('auth.' + permission.codename))
  47. self.assertFalse(user.has_perm('auth_tests.' + permission.codename))
  48. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  49. # Reload user to purge the _perm_cache.
  50. user = User._default_manager.get(pk=user.pk)
  51. for permission in [self.default_permission, self.custom_permission]:
  52. self.assertFalse(user.has_perm('auth.' + permission.codename))
  53. self.assertTrue(user.has_perm('auth_tests.' + permission.codename))
  54. def test_migrate_backwards(self):
  55. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  56. update_proxy_permissions.revert_proxy_model_permissions(apps, None)
  57. self.default_permission.refresh_from_db()
  58. self.assertEqual(self.default_permission.content_type, self.concrete_content_type)
  59. self.custom_permission.refresh_from_db()
  60. self.assertEqual(self.custom_permission.content_type, self.concrete_content_type)
  61. def test_user_keeps_same_permissions_after_migrating_backward(self):
  62. user = User.objects.create()
  63. user.user_permissions.add(self.default_permission)
  64. user.user_permissions.add(self.custom_permission)
  65. for permission in [self.default_permission, self.custom_permission]:
  66. self.assertTrue(user.has_perm('auth.' + permission.codename))
  67. self.assertFalse(user.has_perm('auth_tests.' + permission.codename))
  68. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  69. update_proxy_permissions.revert_proxy_model_permissions(apps, None)
  70. # Reload user to purge the _perm_cache.
  71. user = User._default_manager.get(pk=user.pk)
  72. for permission in [self.default_permission, self.custom_permission]:
  73. self.assertTrue(user.has_perm('auth.' + permission.codename))
  74. self.assertFalse(user.has_perm('auth_tests.' + permission.codename))
  75. class ProxyModelWithSameAppLabelTests(TestCase):
  76. available_apps = [
  77. 'auth_tests',
  78. 'django.contrib.auth',
  79. 'django.contrib.contenttypes',
  80. ]
  81. def setUp(self):
  82. """
  83. Create proxy permissions with content_type to the concrete model
  84. rather than the proxy model (as they were before Django 2.2 and
  85. migration 11).
  86. """
  87. Permission.objects.all().delete()
  88. self.concrete_content_type = ContentType.objects.get_for_model(Proxy)
  89. self.default_permission = Permission.objects.create(
  90. content_type=self.concrete_content_type,
  91. codename='add_proxy',
  92. name='Can add proxy',
  93. )
  94. self.custom_permission = Permission.objects.create(
  95. content_type=self.concrete_content_type,
  96. codename='display_proxys',
  97. name='May display proxys information',
  98. )
  99. def test_proxy_model_permissions_contenttype(self):
  100. proxy_model_content_type = ContentType.objects.get_for_model(Proxy, for_concrete_model=False)
  101. self.assertEqual(self.default_permission.content_type, self.concrete_content_type)
  102. self.assertEqual(self.custom_permission.content_type, self.concrete_content_type)
  103. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  104. self.default_permission.refresh_from_db()
  105. self.custom_permission.refresh_from_db()
  106. self.assertEqual(self.default_permission.content_type, proxy_model_content_type)
  107. self.assertEqual(self.custom_permission.content_type, proxy_model_content_type)
  108. def test_user_still_has_proxy_model_permissions(self):
  109. user = User.objects.create()
  110. user.user_permissions.add(self.default_permission)
  111. user.user_permissions.add(self.custom_permission)
  112. for permission in [self.default_permission, self.custom_permission]:
  113. self.assertTrue(user.has_perm('auth_tests.' + permission.codename))
  114. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  115. # Reload user to purge the _perm_cache.
  116. user = User._default_manager.get(pk=user.pk)
  117. for permission in [self.default_permission, self.custom_permission]:
  118. self.assertTrue(user.has_perm('auth_tests.' + permission.codename))
  119. def test_migrate_backwards(self):
  120. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  121. update_proxy_permissions.revert_proxy_model_permissions(apps, None)
  122. self.default_permission.refresh_from_db()
  123. self.assertEqual(self.default_permission.content_type, self.concrete_content_type)
  124. self.custom_permission.refresh_from_db()
  125. self.assertEqual(self.custom_permission.content_type, self.concrete_content_type)
  126. def test_user_keeps_same_permissions_after_migrating_backward(self):
  127. user = User.objects.create()
  128. user.user_permissions.add(self.default_permission)
  129. user.user_permissions.add(self.custom_permission)
  130. for permission in [self.default_permission, self.custom_permission]:
  131. self.assertTrue(user.has_perm('auth_tests.' + permission.codename))
  132. update_proxy_permissions.update_proxy_model_permissions(apps, None)
  133. update_proxy_permissions.revert_proxy_model_permissions(apps, None)
  134. # Reload user to purge the _perm_cache.
  135. user = User._default_manager.get(pk=user.pk)
  136. for permission in [self.default_permission, self.custom_permission]:
  137. self.assertTrue(user.has_perm('auth_tests.' + permission.codename))