1. from django.core.exceptions import ImproperlyConfigured
    
  2. from django.db import models
    
  3. from django.test import SimpleTestCase, override_settings
    
  4. from django.test.utils import isolate_apps
    
  5. 
    
  6. 
    
  7. class MyBigAutoField(models.BigAutoField):
    
  8.     pass
    
  9. 
    
  10. 
    
  11. @isolate_apps("model_options")
    
  12. class TestDefaultPK(SimpleTestCase):
    
  13.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.NonexistentAutoField")
    
  14.     def test_default_auto_field_setting_nonexistent(self):
    
  15.         msg = (
    
  16.             "DEFAULT_AUTO_FIELD refers to the module "
    
  17.             "'django.db.models.NonexistentAutoField' that could not be "
    
  18.             "imported."
    
  19.         )
    
  20.         with self.assertRaisesMessage(ImproperlyConfigured, msg):
    
  21. 
    
  22.             class Model(models.Model):
    
  23.                 pass
    
  24. 
    
  25.     @isolate_apps("model_options.apps.ModelPKNonexistentConfig")
    
  26.     def test_app_default_auto_field_nonexistent(self):
    
  27.         msg = (
    
  28.             "model_options.apps.ModelPKNonexistentConfig.default_auto_field "
    
  29.             "refers to the module 'django.db.models.NonexistentAutoField' "
    
  30.             "that could not be imported."
    
  31.         )
    
  32.         with self.assertRaisesMessage(ImproperlyConfigured, msg):
    
  33. 
    
  34.             class Model(models.Model):
    
  35.                 pass
    
  36. 
    
  37.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.TextField")
    
  38.     def test_default_auto_field_setting_non_auto(self):
    
  39.         msg = (
    
  40.             "Primary key 'django.db.models.TextField' referred by "
    
  41.             "DEFAULT_AUTO_FIELD must subclass AutoField."
    
  42.         )
    
  43.         with self.assertRaisesMessage(ValueError, msg):
    
  44. 
    
  45.             class Model(models.Model):
    
  46.                 pass
    
  47. 
    
  48.     @isolate_apps("model_options.apps.ModelPKNonAutoConfig")
    
  49.     def test_app_default_auto_field_non_auto(self):
    
  50.         msg = (
    
  51.             "Primary key 'django.db.models.TextField' referred by "
    
  52.             "model_options.apps.ModelPKNonAutoConfig.default_auto_field must "
    
  53.             "subclass AutoField."
    
  54.         )
    
  55.         with self.assertRaisesMessage(ValueError, msg):
    
  56. 
    
  57.             class Model(models.Model):
    
  58.                 pass
    
  59. 
    
  60.     @override_settings(DEFAULT_AUTO_FIELD=None)
    
  61.     def test_default_auto_field_setting_none(self):
    
  62.         msg = "DEFAULT_AUTO_FIELD must not be empty."
    
  63.         with self.assertRaisesMessage(ImproperlyConfigured, msg):
    
  64. 
    
  65.             class Model(models.Model):
    
  66.                 pass
    
  67. 
    
  68.     @isolate_apps("model_options.apps.ModelPKNoneConfig")
    
  69.     def test_app_default_auto_field_none(self):
    
  70.         msg = (
    
  71.             "model_options.apps.ModelPKNoneConfig.default_auto_field must not "
    
  72.             "be empty."
    
  73.         )
    
  74.         with self.assertRaisesMessage(ImproperlyConfigured, msg):
    
  75. 
    
  76.             class Model(models.Model):
    
  77.                 pass
    
  78. 
    
  79.     @isolate_apps("model_options.apps.ModelDefaultPKConfig")
    
  80.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.SmallAutoField")
    
  81.     def test_default_auto_field_setting(self):
    
  82.         class Model(models.Model):
    
  83.             pass
    
  84. 
    
  85.         self.assertIsInstance(Model._meta.pk, models.SmallAutoField)
    
  86. 
    
  87.     @override_settings(
    
  88.         DEFAULT_AUTO_FIELD="model_options.test_default_pk.MyBigAutoField"
    
  89.     )
    
  90.     def test_default_auto_field_setting_bigautofield_subclass(self):
    
  91.         class Model(models.Model):
    
  92.             pass
    
  93. 
    
  94.         self.assertIsInstance(Model._meta.pk, MyBigAutoField)
    
  95. 
    
  96.     @isolate_apps("model_options.apps.ModelPKConfig")
    
  97.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.AutoField")
    
  98.     def test_app_default_auto_field(self):
    
  99.         class Model(models.Model):
    
  100.             pass
    
  101. 
    
  102.         self.assertIsInstance(Model._meta.pk, models.SmallAutoField)
    
  103. 
    
  104.     @isolate_apps("model_options.apps.ModelDefaultPKConfig")
    
  105.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.SmallAutoField")
    
  106.     def test_m2m_default_auto_field_setting(self):
    
  107.         class M2MModel(models.Model):
    
  108.             m2m = models.ManyToManyField("self")
    
  109. 
    
  110.         m2m_pk = M2MModel._meta.get_field("m2m").remote_field.through._meta.pk
    
  111.         self.assertIsInstance(m2m_pk, models.SmallAutoField)
    
  112. 
    
  113.     @isolate_apps("model_options.apps.ModelPKConfig")
    
  114.     @override_settings(DEFAULT_AUTO_FIELD="django.db.models.AutoField")
    
  115.     def test_m2m_app_default_auto_field(self):
    
  116.         class M2MModel(models.Model):
    
  117.             m2m = models.ManyToManyField("self")
    
  118. 
    
  119.         m2m_pk = M2MModel._meta.get_field("m2m").remote_field.through._meta.pk
    
  120.         self.assertIsInstance(m2m_pk, models.SmallAutoField)