summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests/test_ordinary_fields.py
diff options
context:
space:
mode:
authorJeremy Nauta <jeremypnauta@gmail.com>2023-07-06 20:36:48 -0600
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-09-07 06:19:08 +0200
commitf333e3513e8bdf5ffeb6eeb63021c230082e6f95 (patch)
tree45840089369287128724be0a63e3af36f3178469 /tests/invalid_models_tests/test_ordinary_fields.py
parentcafe7266ee69f7e017ddbc0d440084ace559b04b (diff)
Fixed #31300 -- Added GeneratedField model field.
Thanks Adam Johnson and Paolo Melchiorre for reviews. Co-Authored-By: Lily Foote <code@lilyf.org> Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'tests/invalid_models_tests/test_ordinary_fields.py')
-rw-r--r--tests/invalid_models_tests/test_ordinary_fields.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py
index 6014448013..affe642ac7 100644
--- a/tests/invalid_models_tests/test_ordinary_fields.py
+++ b/tests/invalid_models_tests/test_ordinary_fields.py
@@ -1226,3 +1226,115 @@ class InvalidDBDefaultTests(TestCase):
msg = f"{expression} cannot be used in db_default."
expected_error = Error(msg=msg, obj=field, id="fields.E012")
self.assertEqual(errors, [expected_error])
+
+
+@isolate_apps("invalid_models_tests")
+class GeneratedFieldTests(TestCase):
+ def test_not_supported(self):
+ db_persist = connection.features.supports_stored_generated_columns
+
+ class Model(models.Model):
+ name = models.IntegerField()
+ field = models.GeneratedField(
+ expression=models.F("name"), db_persist=db_persist
+ )
+
+ expected_errors = []
+ if (
+ not connection.features.supports_stored_generated_columns
+ and not connection.features.supports_virtual_generated_columns
+ ):
+ expected_errors.append(
+ Error(
+ f"{connection.display_name} does not support GeneratedFields.",
+ obj=Model._meta.get_field("field"),
+ id="fields.E220",
+ )
+ )
+ if (
+ not db_persist
+ and not connection.features.supports_virtual_generated_columns
+ ):
+ expected_errors.append(
+ Error(
+ f"{connection.display_name} does not support non-persisted "
+ "GeneratedFields.",
+ obj=Model._meta.get_field("field"),
+ id="fields.E221",
+ hint="Set db_persist=True on the field.",
+ ),
+ )
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ expected_errors,
+ )
+
+ def test_not_supported_stored_required_db_features(self):
+ class Model(models.Model):
+ name = models.IntegerField()
+ field = models.GeneratedField(expression=models.F("name"), db_persist=True)
+
+ class Meta:
+ required_db_features = {"supports_stored_generated_columns"}
+
+ self.assertEqual(Model.check(databases=self.databases), [])
+
+ def test_not_supported_virtual_required_db_features(self):
+ class Model(models.Model):
+ name = models.IntegerField()
+ field = models.GeneratedField(expression=models.F("name"), db_persist=False)
+
+ class Meta:
+ required_db_features = {"supports_virtual_generated_columns"}
+
+ self.assertEqual(Model.check(databases=self.databases), [])
+
+ @skipUnlessDBFeature("supports_stored_generated_columns")
+ def test_not_supported_virtual(self):
+ class Model(models.Model):
+ name = models.IntegerField()
+ field = models.GeneratedField(expression=models.F("name"), db_persist=False)
+ a = models.TextField()
+
+ excepted_errors = (
+ []
+ if connection.features.supports_virtual_generated_columns
+ else [
+ Error(
+ f"{connection.display_name} does not support non-persisted "
+ "GeneratedFields.",
+ obj=Model._meta.get_field("field"),
+ id="fields.E221",
+ hint="Set db_persist=True on the field.",
+ ),
+ ]
+ )
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ excepted_errors,
+ )
+
+ @skipUnlessDBFeature("supports_virtual_generated_columns")
+ def test_not_supported_stored(self):
+ class Model(models.Model):
+ name = models.IntegerField()
+ field = models.GeneratedField(expression=models.F("name"), db_persist=True)
+ a = models.TextField()
+
+ expected_errors = (
+ []
+ if connection.features.supports_stored_generated_columns
+ else [
+ Error(
+ f"{connection.display_name} does not support persisted "
+ "GeneratedFields.",
+ obj=Model._meta.get_field("field"),
+ id="fields.E222",
+ hint="Set db_persist=False on the field.",
+ ),
+ ]
+ )
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ expected_errors,
+ )