diff options
author | Hasan Ramezani <hasan.r67@gmail.com> | 2020-05-04 23:27:13 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-05-20 10:56:55 +0200 |
commit | 3c7bf39e23fe9168f31132d929c9877c5835859b (patch) | |
tree | a308e51268b8b9ee885d28044b769fcbac50785a /tests/invalid_models_tests | |
parent | 8328811f048fed0dd22573224def8c65410c9f2e (diff) | |
download | django-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.py | 67 |
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), []) |