test_model_checks.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. from django.core import checks
  2. from django.core.checks import Error
  3. from django.db import models
  4. from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
  5. from django.test.utils import (
  6. isolate_apps, modify_settings, override_system_checks,
  7. )
  8. @isolate_apps('check_framework', attr_name='apps')
  9. @override_system_checks([checks.model_checks.check_all_models])
  10. class DuplicateDBTableTests(SimpleTestCase):
  11. def test_collision_in_same_app(self):
  12. class Model1(models.Model):
  13. class Meta:
  14. db_table = 'test_table'
  15. class Model2(models.Model):
  16. class Meta:
  17. db_table = 'test_table'
  18. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  19. Error(
  20. "db_table 'test_table' is used by multiple models: "
  21. "check_framework.Model1, check_framework.Model2.",
  22. obj='test_table',
  23. id='models.E028',
  24. )
  25. ])
  26. @modify_settings(INSTALLED_APPS={'append': 'basic'})
  27. @isolate_apps('basic', 'check_framework', kwarg_name='apps')
  28. def test_collision_across_apps(self, apps):
  29. class Model1(models.Model):
  30. class Meta:
  31. app_label = 'basic'
  32. db_table = 'test_table'
  33. class Model2(models.Model):
  34. class Meta:
  35. app_label = 'check_framework'
  36. db_table = 'test_table'
  37. self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [
  38. Error(
  39. "db_table 'test_table' is used by multiple models: "
  40. "basic.Model1, check_framework.Model2.",
  41. obj='test_table',
  42. id='models.E028',
  43. )
  44. ])
  45. def test_no_collision_for_unmanaged_models(self):
  46. class Unmanaged(models.Model):
  47. class Meta:
  48. db_table = 'test_table'
  49. managed = False
  50. class Managed(models.Model):
  51. class Meta:
  52. db_table = 'test_table'
  53. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
  54. def test_no_collision_for_proxy_models(self):
  55. class Model(models.Model):
  56. class Meta:
  57. db_table = 'test_table'
  58. class ProxyModel(Model):
  59. class Meta:
  60. proxy = True
  61. self.assertEqual(Model._meta.db_table, ProxyModel._meta.db_table)
  62. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
  63. @isolate_apps('check_framework', attr_name='apps')
  64. @override_system_checks([checks.model_checks.check_all_models])
  65. class IndexNameTests(SimpleTestCase):
  66. def test_collision_in_same_model(self):
  67. index = models.Index(fields=['id'], name='foo')
  68. class Model(models.Model):
  69. class Meta:
  70. indexes = [index, index]
  71. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  72. Error(
  73. "index name 'foo' is not unique for model check_framework.Model.",
  74. id='models.E029',
  75. ),
  76. ])
  77. def test_collision_in_different_models(self):
  78. index = models.Index(fields=['id'], name='foo')
  79. class Model1(models.Model):
  80. class Meta:
  81. indexes = [index]
  82. class Model2(models.Model):
  83. class Meta:
  84. indexes = [index]
  85. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  86. Error(
  87. "index name 'foo' is not unique amongst models: "
  88. "check_framework.Model1, check_framework.Model2.",
  89. id='models.E030',
  90. ),
  91. ])
  92. def test_collision_abstract_model(self):
  93. class AbstractModel(models.Model):
  94. class Meta:
  95. indexes = [models.Index(fields=['id'], name='foo')]
  96. abstract = True
  97. class Model1(AbstractModel):
  98. pass
  99. class Model2(AbstractModel):
  100. pass
  101. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  102. Error(
  103. "index name 'foo' is not unique amongst models: "
  104. "check_framework.Model1, check_framework.Model2.",
  105. id='models.E030',
  106. ),
  107. ])
  108. def test_no_collision_abstract_model_interpolation(self):
  109. class AbstractModel(models.Model):
  110. name = models.CharField(max_length=20)
  111. class Meta:
  112. indexes = [models.Index(fields=['name'], name='%(app_label)s_%(class)s_foo')]
  113. abstract = True
  114. class Model1(AbstractModel):
  115. pass
  116. class Model2(AbstractModel):
  117. pass
  118. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
  119. @modify_settings(INSTALLED_APPS={'append': 'basic'})
  120. @isolate_apps('basic', 'check_framework', kwarg_name='apps')
  121. def test_collision_across_apps(self, apps):
  122. index = models.Index(fields=['id'], name='foo')
  123. class Model1(models.Model):
  124. class Meta:
  125. app_label = 'basic'
  126. indexes = [index]
  127. class Model2(models.Model):
  128. class Meta:
  129. app_label = 'check_framework'
  130. indexes = [index]
  131. self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [
  132. Error(
  133. "index name 'foo' is not unique amongst models: basic.Model1, "
  134. "check_framework.Model2.",
  135. id='models.E030',
  136. ),
  137. ])
  138. @modify_settings(INSTALLED_APPS={'append': 'basic'})
  139. @isolate_apps('basic', 'check_framework', kwarg_name='apps')
  140. def test_no_collision_across_apps_interpolation(self, apps):
  141. index = models.Index(fields=['id'], name='%(app_label)s_%(class)s_foo')
  142. class Model1(models.Model):
  143. class Meta:
  144. app_label = 'basic'
  145. constraints = [index]
  146. class Model2(models.Model):
  147. class Meta:
  148. app_label = 'check_framework'
  149. constraints = [index]
  150. self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [])
  151. @isolate_apps('check_framework', attr_name='apps')
  152. @override_system_checks([checks.model_checks.check_all_models])
  153. @skipUnlessDBFeature('supports_table_check_constraints')
  154. class ConstraintNameTests(TestCase):
  155. def test_collision_in_same_model(self):
  156. class Model(models.Model):
  157. class Meta:
  158. constraints = [
  159. models.CheckConstraint(check=models.Q(id__gt=0), name='foo'),
  160. models.CheckConstraint(check=models.Q(id__lt=100), name='foo'),
  161. ]
  162. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  163. Error(
  164. "constraint name 'foo' is not unique for model "
  165. "check_framework.Model.",
  166. id='models.E031',
  167. ),
  168. ])
  169. def test_collision_in_different_models(self):
  170. constraint = models.CheckConstraint(check=models.Q(id__gt=0), name='foo')
  171. class Model1(models.Model):
  172. class Meta:
  173. constraints = [constraint]
  174. class Model2(models.Model):
  175. class Meta:
  176. constraints = [constraint]
  177. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  178. Error(
  179. "constraint name 'foo' is not unique amongst models: "
  180. "check_framework.Model1, check_framework.Model2.",
  181. id='models.E032',
  182. ),
  183. ])
  184. def test_collision_abstract_model(self):
  185. class AbstractModel(models.Model):
  186. class Meta:
  187. constraints = [models.CheckConstraint(check=models.Q(id__gt=0), name='foo')]
  188. abstract = True
  189. class Model1(AbstractModel):
  190. pass
  191. class Model2(AbstractModel):
  192. pass
  193. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
  194. Error(
  195. "constraint name 'foo' is not unique amongst models: "
  196. "check_framework.Model1, check_framework.Model2.",
  197. id='models.E032',
  198. ),
  199. ])
  200. def test_no_collision_abstract_model_interpolation(self):
  201. class AbstractModel(models.Model):
  202. class Meta:
  203. constraints = [
  204. models.CheckConstraint(check=models.Q(id__gt=0), name='%(app_label)s_%(class)s_foo'),
  205. ]
  206. abstract = True
  207. class Model1(AbstractModel):
  208. pass
  209. class Model2(AbstractModel):
  210. pass
  211. self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
  212. @modify_settings(INSTALLED_APPS={'append': 'basic'})
  213. @isolate_apps('basic', 'check_framework', kwarg_name='apps')
  214. def test_collision_across_apps(self, apps):
  215. constraint = models.CheckConstraint(check=models.Q(id__gt=0), name='foo')
  216. class Model1(models.Model):
  217. class Meta:
  218. app_label = 'basic'
  219. constraints = [constraint]
  220. class Model2(models.Model):
  221. class Meta:
  222. app_label = 'check_framework'
  223. constraints = [constraint]
  224. self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [
  225. Error(
  226. "constraint name 'foo' is not unique amongst models: "
  227. "basic.Model1, check_framework.Model2.",
  228. id='models.E032',
  229. ),
  230. ])
  231. @modify_settings(INSTALLED_APPS={'append': 'basic'})
  232. @isolate_apps('basic', 'check_framework', kwarg_name='apps')
  233. def test_no_collision_across_apps_interpolation(self, apps):
  234. constraint = models.CheckConstraint(check=models.Q(id__gt=0), name='%(app_label)s_%(class)s_foo')
  235. class Model1(models.Model):
  236. class Meta:
  237. app_label = 'basic'
  238. constraints = [constraint]
  239. class Model2(models.Model):
  240. class Meta:
  241. app_label = 'check_framework'
  242. constraints = [constraint]
  243. self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [])