diff options
| author | Tim Graham <timograham@gmail.com> | 2025-11-20 20:18:09 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2025-11-23 11:53:24 +0100 |
| commit | 57c50d8c1996733cef45204ea069a2c01b2860cc (patch) | |
| tree | ef25923bfc179acb84d09c934fe50ff565a6a929 /tests/invalid_models_tests | |
| parent | ec60df6d1ea8939a316d9b180faa0b4ef2e83606 (diff) | |
Refs #21961 -- Added DatabaseFeatures.supports_on_delete_db_(cascade/null) feature flags.
Needed on MongoDB.
Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'tests/invalid_models_tests')
| -rw-r--r-- | tests/invalid_models_tests/test_relative_fields.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/invalid_models_tests/test_relative_fields.py b/tests/invalid_models_tests/test_relative_fields.py index e73f22ab41..51b1de1494 100644 --- a/tests/invalid_models_tests/test_relative_fields.py +++ b/tests/invalid_models_tests/test_relative_fields.py @@ -2288,6 +2288,41 @@ class M2mThroughFieldsTests(SimpleTestCase): @isolate_apps("invalid_models_tests") class DatabaseLevelOnDeleteTests(TestCase): + def test_db_cascade_support(self): + class Parent(models.Model): + pass + + class Child(models.Model): + parent = models.ForeignKey(Parent, models.DB_CASCADE) + + field = Child._meta.get_field("parent") + expected = ( + [] + if connection.features.supports_on_delete_db_cascade + else [ + Error( + f"{connection.display_name} does not support a DB_CASCADE.", + hint="Change the on_delete rule to CASCADE.", + obj=field, + id="fields.E324", + ) + ] + ) + self.assertEqual(field.check(databases=self.databases), expected) + + def test_db_cascade_required_db_features(self): + class Parent(models.Model): + pass + + class Child(models.Model): + parent = models.ForeignKey(Parent, models.DB_CASCADE) + + class Meta: + required_db_features = {"supports_on_delete_db_cascade"} + + field = Child._meta.get_field("parent") + self.assertEqual(field.check(databases=self.databases), []) + def test_db_set_default_support(self): class Parent(models.Model): pass @@ -2349,6 +2384,41 @@ class DatabaseLevelOnDeleteTests(TestCase): ], ) + def test_db_set_null_support(self): + class Parent(models.Model): + pass + + class Child(models.Model): + parent = models.ForeignKey(Parent, models.DB_SET_NULL, null=True) + + field = Child._meta.get_field("parent") + expected = ( + [] + if connection.features.supports_on_delete_db_null + else [ + Error( + f"{connection.display_name} does not support a DB_SET_NULL.", + hint="Change the on_delete rule to SET_NULL.", + obj=field, + id="fields.E324", + ) + ] + ) + self.assertEqual(field.check(databases=self.databases), expected) + + def test_db_set_null_required_db_features(self): + class Parent(models.Model): + pass + + class Child(models.Model): + parent = models.ForeignKey(Parent, models.DB_SET_NULL, null=True) + + class Meta: + required_db_features = {"supports_on_delete_db_null"} + + field = Child._meta.get_field("parent") + self.assertEqual(field.check(databases=self.databases), []) + def test_python_db_chain(self): class GrandParent(models.Model): pass @@ -2376,6 +2446,7 @@ class DatabaseLevelOnDeleteTests(TestCase): ], ) + @skipUnlessDBFeature("supports_on_delete_db_null") def test_db_python_chain(self): class GrandParent(models.Model): pass @@ -2403,6 +2474,7 @@ class DatabaseLevelOnDeleteTests(TestCase): ], ) + @skipUnlessDBFeature("supports_on_delete_db_cascade") def test_db_python_chain_auto_created(self): class GrandParent(models.Model): pass @@ -2430,6 +2502,7 @@ class DatabaseLevelOnDeleteTests(TestCase): ], ) + @skipUnlessDBFeature("supports_on_delete_db_null") def test_db_do_nothing_chain(self): class GrandParent(models.Model): pass |
