summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests/test_relative_fields.py
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2025-11-20 20:18:09 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2025-11-23 11:53:24 +0100
commit57c50d8c1996733cef45204ea069a2c01b2860cc (patch)
treeef25923bfc179acb84d09c934fe50ff565a6a929 /tests/invalid_models_tests/test_relative_fields.py
parentec60df6d1ea8939a316d9b180faa0b4ef2e83606 (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/test_relative_fields.py')
-rw-r--r--tests/invalid_models_tests/test_relative_fields.py73
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