summaryrefslogtreecommitdiff
path: root/tests/model_options/test_default_pk.py
diff options
context:
space:
mode:
authorTom Forbes <tom@tomforb.es>2020-07-12 13:59:57 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-12-15 11:25:46 +0100
commitb5e12d490af3debca8c55ab3c1698189fdedbbdb (patch)
tree5fe3005ac567f3addf78b81ae033191e2fa642f4 /tests/model_options/test_default_pk.py
parentb960e4ed722a04a9db0d35293f76e253eedf9126 (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/test_default_pk.py')
-rw-r--r--tests/model_options/test_default_pk.py101
1 files changed, 101 insertions, 0 deletions
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)