summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2020-11-22 22:27:57 +0000
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-05-12 19:11:40 +0200
commit7414704e88d73dafbcfbb85f9bc54cb6111439d3 (patch)
treef51136b16e457d7f46e01ff3cc06308faf0923db /tests/invalid_models_tests
parent599f3e2cda50ab084915ffd08edb5ad6cad61415 (diff)
Fixed #470 -- Added support for database defaults on fields.
Special thanks to Hannes Ljungberg for finding multiple implementation gaps. Thanks also to Simon Charette, Adam Johnson, and Mariusz Felisiak for reviews.
Diffstat (limited to 'tests/invalid_models_tests')
-rw-r--r--tests/invalid_models_tests/test_ordinary_fields.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py
index 4e37c48286..e9e8a702e0 100644
--- a/tests/invalid_models_tests/test_ordinary_fields.py
+++ b/tests/invalid_models_tests/test_ordinary_fields.py
@@ -4,6 +4,7 @@ import uuid
from django.core.checks import Error
from django.core.checks import Warning as DjangoWarning
from django.db import connection, models
+from django.db.models.functions import Coalesce, Pi
from django.test import SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.test.utils import isolate_apps, override_settings
from django.utils.functional import lazy
@@ -1057,3 +1058,109 @@ class DbCommentTests(TestCase):
errors = Model._meta.get_field("field").check(databases=self.databases)
self.assertEqual(errors, [])
+
+
+@isolate_apps("invalid_models_tests")
+class InvalidDBDefaultTests(TestCase):
+ def test_db_default(self):
+ class Model(models.Model):
+ field = models.FloatField(db_default=Pi())
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+
+ if connection.features.supports_expression_defaults:
+ expected_errors = []
+ else:
+ msg = (
+ f"{connection.display_name} does not support default database values "
+ "with expressions (db_default)."
+ )
+ expected_errors = [Error(msg=msg, obj=field, id="fields.E011")]
+ self.assertEqual(errors, expected_errors)
+
+ def test_db_default_literal(self):
+ class Model(models.Model):
+ field = models.IntegerField(db_default=1)
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+ self.assertEqual(errors, [])
+
+ def test_db_default_required_db_features(self):
+ class Model(models.Model):
+ field = models.FloatField(db_default=Pi())
+
+ class Meta:
+ required_db_features = {"supports_expression_defaults"}
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+ self.assertEqual(errors, [])
+
+ def test_db_default_expression_invalid(self):
+ expression = models.F("field_name")
+
+ class Model(models.Model):
+ field = models.FloatField(db_default=expression)
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+
+ if connection.features.supports_expression_defaults:
+ msg = f"{expression} cannot be used in db_default."
+ expected_errors = [Error(msg=msg, obj=field, id="fields.E012")]
+ else:
+ msg = (
+ f"{connection.display_name} does not support default database values "
+ "with expressions (db_default)."
+ )
+ expected_errors = [Error(msg=msg, obj=field, id="fields.E011")]
+ self.assertEqual(errors, expected_errors)
+
+ def test_db_default_expression_required_db_features(self):
+ expression = models.F("field_name")
+
+ class Model(models.Model):
+ field = models.FloatField(db_default=expression)
+
+ class Meta:
+ required_db_features = {"supports_expression_defaults"}
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+
+ if connection.features.supports_expression_defaults:
+ msg = f"{expression} cannot be used in db_default."
+ expected_errors = [Error(msg=msg, obj=field, id="fields.E012")]
+ else:
+ expected_errors = []
+ self.assertEqual(errors, expected_errors)
+
+ @skipUnlessDBFeature("supports_expression_defaults")
+ def test_db_default_combined_invalid(self):
+ expression = models.Value(4.5) + models.F("field_name")
+
+ class Model(models.Model):
+ field = models.FloatField(db_default=expression)
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+
+ msg = f"{expression} cannot be used in db_default."
+ expected_error = Error(msg=msg, obj=field, id="fields.E012")
+ self.assertEqual(errors, [expected_error])
+
+ @skipUnlessDBFeature("supports_expression_defaults")
+ def test_db_default_function_arguments_invalid(self):
+ expression = Coalesce(models.Value(4.5), models.F("field_name"))
+
+ class Model(models.Model):
+ field = models.FloatField(db_default=expression)
+
+ field = Model._meta.get_field("field")
+ errors = field.check(databases=self.databases)
+
+ msg = f"{expression} cannot be used in db_default."
+ expected_error = Error(msg=msg, obj=field, id="fields.E012")
+ self.assertEqual(errors, [expected_error])