summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2020-05-04 23:27:13 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-05-20 10:56:55 +0200
commit3c7bf39e23fe9168f31132d929c9877c5835859b (patch)
treea308e51268b8b9ee885d28044b769fcbac50785a /tests/invalid_models_tests
parent8328811f048fed0dd22573224def8c65410c9f2e (diff)
downloaddjango-3c7bf39e23fe9168f31132d929c9877c5835859b.tar.gz
Fixed #31410 -- Added system checks for invalid model field names in UniqueConstraint.
Diffstat (limited to 'tests/invalid_models_tests')
-rw-r--r--tests/invalid_models_tests/test_models.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py
index 6c062b2990..7847ee8486 100644
--- a/tests/invalid_models_tests/test_models.py
+++ b/tests/invalid_models_tests/test_models.py
@@ -1501,3 +1501,70 @@ class ConstraintsTests(TestCase):
]
self.assertEqual(Model.check(databases=self.databases), [])
+
+ def test_unique_constraint_pointing_to_missing_field(self):
+ class Model(models.Model):
+ class Meta:
+ constraints = [models.UniqueConstraint(fields=['missing_field'], name='name')]
+
+ self.assertEqual(Model.check(databases=self.databases), [
+ Error(
+ "'constraints' refers to the nonexistent field "
+ "'missing_field'.",
+ obj=Model,
+ id='models.E012',
+ ),
+ ])
+
+ def test_unique_constraint_pointing_to_m2m_field(self):
+ class Model(models.Model):
+ m2m = models.ManyToManyField('self')
+
+ class Meta:
+ constraints = [models.UniqueConstraint(fields=['m2m'], name='name')]
+
+ self.assertEqual(Model.check(databases=self.databases), [
+ Error(
+ "'constraints' refers to a ManyToManyField 'm2m', but "
+ "ManyToManyFields are not permitted in 'constraints'.",
+ obj=Model,
+ id='models.E013',
+ ),
+ ])
+
+ def test_unique_constraint_pointing_to_non_local_field(self):
+ class Parent(models.Model):
+ field1 = models.IntegerField()
+
+ class Child(Parent):
+ field2 = models.IntegerField()
+
+ class Meta:
+ constraints = [
+ models.UniqueConstraint(fields=['field2', 'field1'], name='name'),
+ ]
+
+ self.assertEqual(Child.check(databases=self.databases), [
+ Error(
+ "'constraints' refers to field 'field1' which is not local to "
+ "model 'Child'.",
+ hint='This issue may be caused by multi-table inheritance.',
+ obj=Child,
+ id='models.E016',
+ ),
+ ])
+
+ def test_unique_constraint_pointing_to_fk(self):
+ class Target(models.Model):
+ pass
+
+ class Model(models.Model):
+ fk_1 = models.ForeignKey(Target, models.CASCADE, related_name='target_1')
+ fk_2 = models.ForeignKey(Target, models.CASCADE, related_name='target_2')
+
+ class Meta:
+ constraints = [
+ models.UniqueConstraint(fields=['fk_1_id', 'fk_2'], name='name'),
+ ]
+
+ self.assertEqual(Model.check(databases=self.databases), [])