diff options
| author | Tom Forbes <tom@tomforb.es> | 2020-07-12 13:59:57 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-12-15 11:25:46 +0100 |
| commit | b5e12d490af3debca8c55ab3c1698189fdedbbdb (patch) | |
| tree | 5fe3005ac567f3addf78b81ae033191e2fa642f4 /tests/model_options | |
| parent | b960e4ed722a04a9db0d35293f76e253eedf9126 (diff) | |
Fixed #31007 -- Allowed specifying type of auto-created primary keys.
This also changes the default type of auto-created primary keys
for new apps and projects to BigAutoField.
Diffstat (limited to 'tests/model_options')
| -rw-r--r-- | tests/model_options/apps.py | 25 | ||||
| -rw-r--r-- | tests/model_options/test_default_pk.py | 101 |
2 files changed, 126 insertions, 0 deletions
diff --git a/tests/model_options/apps.py b/tests/model_options/apps.py new file mode 100644 index 0000000000..be2250fe7a --- /dev/null +++ b/tests/model_options/apps.py @@ -0,0 +1,25 @@ +from django.apps import AppConfig + + +class ModelDefaultPKConfig(AppConfig): + name = 'model_options' + + +class ModelPKConfig(AppConfig): + name = 'model_options' + default_auto_field = 'django.db.models.SmallAutoField' + + +class ModelPKNonAutoConfig(AppConfig): + name = 'model_options' + default_auto_field = 'django.db.models.TextField' + + +class ModelPKNoneConfig(AppConfig): + name = 'model_options' + default_auto_field = None + + +class ModelPKNonexistentConfig(AppConfig): + name = 'model_options' + default_auto_field = 'django.db.models.NonexistentAutoField' diff --git a/tests/model_options/test_default_pk.py b/tests/model_options/test_default_pk.py new file mode 100644 index 0000000000..b678848916 --- /dev/null +++ b/tests/model_options/test_default_pk.py @@ -0,0 +1,101 @@ +from django.core.exceptions import ImproperlyConfigured +from django.db import models +from django.test import SimpleTestCase, override_settings +from django.test.utils import isolate_apps + + +@isolate_apps('model_options') +class TestDefaultPK(SimpleTestCase): + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.NonexistentAutoField') + def test_default_auto_field_setting_nonexistent(self): + msg = ( + "DEFAULT_AUTO_FIELD refers to the module " + "'django.db.models.NonexistentAutoField' that could not be " + "imported." + ) + with self.assertRaisesMessage(ImproperlyConfigured, msg): + class Model(models.Model): + pass + + @isolate_apps('model_options.apps.ModelPKNonexistentConfig') + def test_app_default_auto_field_nonexistent(self): + msg = ( + "model_options.apps.ModelPKNonexistentConfig.default_auto_field " + "refers to the module 'django.db.models.NonexistentAutoField' " + "that could not be imported." + ) + with self.assertRaisesMessage(ImproperlyConfigured, msg): + class Model(models.Model): + pass + + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.TextField') + def test_default_auto_field_setting_non_auto(self): + msg = ( + "Primary key 'django.db.models.TextField' referred by " + "DEFAULT_AUTO_FIELD must subclass AutoField." + ) + with self.assertRaisesMessage(ValueError, msg): + class Model(models.Model): + pass + + @isolate_apps('model_options.apps.ModelPKNonAutoConfig') + def test_app_default_auto_field_non_auto(self): + msg = ( + "Primary key 'django.db.models.TextField' referred by " + "model_options.apps.ModelPKNonAutoConfig.default_auto_field must " + "subclass AutoField." + ) + with self.assertRaisesMessage(ValueError, msg): + class Model(models.Model): + pass + + @override_settings(DEFAULT_AUTO_FIELD=None) + def test_default_auto_field_setting_none(self): + msg = 'DEFAULT_AUTO_FIELD must not be empty.' + with self.assertRaisesMessage(ImproperlyConfigured, msg): + class Model(models.Model): + pass + + @isolate_apps('model_options.apps.ModelPKNoneConfig') + def test_app_default_auto_field_none(self): + msg = ( + 'model_options.apps.ModelPKNoneConfig.default_auto_field must not ' + 'be empty.' + ) + with self.assertRaisesMessage(ImproperlyConfigured, msg): + class Model(models.Model): + pass + + @isolate_apps('model_options.apps.ModelDefaultPKConfig') + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.SmallAutoField') + def test_default_auto_field_setting(self): + class Model(models.Model): + pass + + self.assertIsInstance(Model._meta.pk, models.SmallAutoField) + + @isolate_apps('model_options.apps.ModelPKConfig') + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField') + def test_app_default_auto_field(self): + class Model(models.Model): + pass + + self.assertIsInstance(Model._meta.pk, models.SmallAutoField) + + @isolate_apps('model_options.apps.ModelDefaultPKConfig') + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.SmallAutoField') + def test_m2m_default_auto_field_setting(self): + class M2MModel(models.Model): + m2m = models.ManyToManyField('self') + + m2m_pk = M2MModel._meta.get_field('m2m').remote_field.through._meta.pk + self.assertIsInstance(m2m_pk, models.SmallAutoField) + + @isolate_apps('model_options.apps.ModelPKConfig') + @override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField') + def test_m2m_app_default_auto_field(self): + class M2MModel(models.Model): + m2m = models.ManyToManyField('self') + + m2m_pk = M2MModel._meta.get_field('m2m').remote_field.through._meta.pk + self.assertIsInstance(m2m_pk, models.SmallAutoField) |
