summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes@5monkeys.se>2019-10-31 13:33:53 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-06-04 12:26:22 +0200
commit8c7992f658e1125f8dc20b19206e8bbbe4187372 (patch)
treeba09524a9a3d27bb33f22dc92dec4b60a80f37e1 /tests/invalid_models_tests
parentf997b5e6ae85e2df2342b1a7812fe8130206c957 (diff)
Fixed #30913 -- Added support for covering indexes on PostgreSQL 11+.
Diffstat (limited to 'tests/invalid_models_tests')
-rw-r--r--tests/invalid_models_tests/test_models.py159
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py
index 7847ee8486..374eff6028 100644
--- a/tests/invalid_models_tests/test_models.py
+++ b/tests/invalid_models_tests/test_models.py
@@ -375,6 +375,78 @@ class IndexesTests(TestCase):
self.assertEqual(Model.check(databases=self.databases), [])
+ def test_index_include_pointing_to_missing_field(self):
+ class Model(models.Model):
+ class Meta:
+ indexes = [
+ models.Index(fields=['id'], include=['missing_field'], name='name'),
+ ]
+
+ self.assertEqual(Model.check(databases=self.databases), [
+ Error(
+ "'indexes' refers to the nonexistent field 'missing_field'.",
+ obj=Model,
+ id='models.E012',
+ ),
+ ])
+
+ def test_index_include_pointing_to_m2m_field(self):
+ class Model(models.Model):
+ m2m = models.ManyToManyField('self')
+
+ class Meta:
+ indexes = [models.Index(fields=['id'], include=['m2m'], name='name')]
+
+ self.assertEqual(Model.check(databases=self.databases), [
+ Error(
+ "'indexes' refers to a ManyToManyField 'm2m', but "
+ "ManyToManyFields are not permitted in 'indexes'.",
+ obj=Model,
+ id='models.E013',
+ ),
+ ])
+
+ def test_index_include_pointing_to_non_local_field(self):
+ class Parent(models.Model):
+ field1 = models.IntegerField()
+
+ class Child(Parent):
+ field2 = models.IntegerField()
+
+ class Meta:
+ indexes = [
+ models.Index(fields=['field2'], include=['field1'], name='name'),
+ ]
+
+ self.assertEqual(Child.check(databases=self.databases), [
+ Error(
+ "'indexes' 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_index_include_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.Index(
+ fields=['id'],
+ include=['fk_1_id', 'fk_2'],
+ name='name',
+ ),
+ ]
+
+ self.assertEqual(Model.check(databases=self.databases), [])
+
@isolate_apps('invalid_models_tests')
class FieldNamesTests(TestCase):
@@ -1568,3 +1640,90 @@ class ConstraintsTests(TestCase):
]
self.assertEqual(Model.check(databases=self.databases), [])
+
+ def test_unique_constraint_include_pointing_to_missing_field(self):
+ class Model(models.Model):
+ class Meta:
+ constraints = [
+ models.UniqueConstraint(
+ fields=['id'],
+ include=['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_include_pointing_to_m2m_field(self):
+ class Model(models.Model):
+ m2m = models.ManyToManyField('self')
+
+ class Meta:
+ constraints = [
+ models.UniqueConstraint(
+ fields=['id'],
+ include=['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_include_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'],
+ include=['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_include_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=['id'],
+ include=['fk_1_id', 'fk_2'],
+ name='name',
+ ),
+ ]
+
+ self.assertEqual(Model.check(databases=self.databases), [])