diff options
| author | Jeremy Nauta <jeremypnauta@gmail.com> | 2023-07-06 20:36:48 -0600 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-09-07 06:19:08 +0200 |
| commit | f333e3513e8bdf5ffeb6eeb63021c230082e6f95 (patch) | |
| tree | 45840089369287128724be0a63e3af36f3178469 /tests/invalid_models_tests/test_ordinary_fields.py | |
| parent | cafe7266ee69f7e017ddbc0d440084ace559b04b (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.py | 112 |
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, + ) |
