summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2023-11-12 20:33:06 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-11-14 20:22:07 +0100
commitc705625ebff0141ed2b95dd3c8174bda8270a47f (patch)
tree95d7af823fdf984e00a45abdc2ba16bb40d31d32 /tests/invalid_models_tests
parent5875f03ce61b85dfd9ad34f7b871c231c358d432 (diff)
Refs #34944 -- Propagated system checks for GeneratedField.output_field.
Diffstat (limited to 'tests/invalid_models_tests')
-rw-r--r--tests/invalid_models_tests/test_ordinary_fields.py78
1 files changed, 77 insertions, 1 deletions
diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py
index 82b4318906..e30d411138 100644
--- a/tests/invalid_models_tests/test_ordinary_fields.py
+++ b/tests/invalid_models_tests/test_ordinary_fields.py
@@ -4,7 +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.db.models.functions import Coalesce, LPad, Pi
from django.test import SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.test.utils import isolate_apps, override_settings
from django.utils.functional import lazy
@@ -1336,3 +1336,79 @@ class GeneratedFieldTests(TestCase):
Model._meta.get_field("field").check(databases={"default"}),
expected_errors,
)
+
+ @skipUnlessDBFeature("supports_stored_generated_columns")
+ def test_output_field_check_error(self):
+ class Model(models.Model):
+ value = models.DecimalField(max_digits=5, decimal_places=2)
+ field = models.GeneratedField(
+ expression=models.F("value") * 2,
+ output_field=models.DecimalField(max_digits=-1, decimal_places=-1),
+ db_persist=True,
+ )
+
+ expected_errors = [
+ Error(
+ "GeneratedField.output_field has errors:"
+ "\n 'decimal_places' must be a non-negative integer. (fields.E131)"
+ "\n 'max_digits' must be a positive integer. (fields.E133)",
+ obj=Model._meta.get_field("field"),
+ id="fields.E223",
+ ),
+ ]
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ expected_errors,
+ )
+
+ @skipUnlessDBFeature("supports_stored_generated_columns")
+ def test_output_field_charfield_unlimited_error(self):
+ class Model(models.Model):
+ name = models.CharField(max_length=255)
+ field = models.GeneratedField(
+ expression=LPad("name", 7, models.Value("xy")),
+ output_field=models.CharField(),
+ db_persist=True,
+ )
+
+ expected_errors = (
+ []
+ if connection.features.supports_unlimited_charfield
+ else [
+ Error(
+ "GeneratedField.output_field has errors:"
+ "\n CharFields must define a 'max_length' attribute. "
+ "(fields.E120)",
+ obj=Model._meta.get_field("field"),
+ id="fields.E223",
+ ),
+ ]
+ )
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ expected_errors,
+ )
+
+ @skipUnlessDBFeature("supports_stored_generated_columns")
+ def test_output_field_check_warning(self):
+ class Model(models.Model):
+ value = models.IntegerField()
+ field = models.GeneratedField(
+ expression=models.F("value") * 2,
+ output_field=models.IntegerField(max_length=40),
+ db_persist=True,
+ )
+
+ expected_warnings = [
+ DjangoWarning(
+ "GeneratedField.output_field has warnings:"
+ "\n 'max_length' is ignored when used with IntegerField. "
+ "(fields.W122)",
+ obj=Model._meta.get_field("field"),
+ id="fields.W224",
+ ),
+ ]
+ self.assertEqual(
+ Model._meta.get_field("field").check(databases={"default"}),
+ expected_warnings,
+ )