瀏覽代碼

Refs #27745 -- Improved test coverage of contrib.contenttypes.

Anton Samarchyan 8 年之前
父節點
當前提交
4d6584000a
共有 2 個文件被更改,包括 39 次插入2 次删除
  1. 23 1
      tests/contenttypes_tests/test_fields.py
  2. 16 1
      tests/generic_relations/tests.py

+ 23 - 1
tests/contenttypes_tests/test_fields.py

@@ -1,8 +1,12 @@
+import json
+
 from django.contrib.contenttypes.fields import GenericForeignKey
 from django.db import models
-from django.test import SimpleTestCase
+from django.test import SimpleTestCase, TestCase
 from django.test.utils import isolate_apps
 
+from .models import Answer, Question
+
 
 @isolate_apps('contenttypes_tests')
 class GenericForeignKeyTests(SimpleTestCase):
@@ -11,3 +15,21 @@ class GenericForeignKeyTests(SimpleTestCase):
         class Model(models.Model):
             field = GenericForeignKey()
         self.assertEqual(str(Model.field), 'contenttypes_tests.Model.field')
+
+    def test_get_content_type_no_arguments(self):
+        with self.assertRaisesMessage(Exception, 'Impossible arguments to GFK.get_content_type!'):
+            Answer.question.get_content_type()
+
+    def test_incorrect_get_prefetch_queryset_arguments(self):
+        with self.assertRaisesMessage(ValueError, "Custom queryset can't be used for this lookup."):
+            Answer.question.get_prefetch_queryset(Answer.objects.all(), Answer.objects.all())
+
+
+class GenericRelationTests(TestCase):
+
+    def test_value_to_string(self):
+        question = Question.objects.create(text='test')
+        answer1 = Answer.objects.create(question=question)
+        answer2 = Answer.objects.create(question=question)
+        result = json.loads(Question.answer_set.field.value_to_string(question))
+        self.assertCountEqual(result, [answer1.pk, answer2.pk])

+ 16 - 1
tests/generic_relations/tests.py

@@ -2,9 +2,10 @@ from django import forms
 from django.contrib.contenttypes.forms import generic_inlineformset_factory
 from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import FieldError
-from django.db import IntegrityError
+from django.db import IntegrityError, models
 from django.db.models import Q
 from django.test import SimpleTestCase, TestCase
+from django.test.utils import isolate_apps
 
 from .models import (
     AllowsNullGFK, Animal, Carrot, Comparison, ConcreteRelatedModel,
@@ -272,6 +273,11 @@ class GenericRelationsTests(TestCase):
         with self.assertRaisesMessage(ValueError, msg):
             self.bacon.tags.add(t1)
 
+    def test_add_rejects_wrong_instances(self):
+        msg = "'TaggedItem' instance expected, got <Animal: Lion>"
+        with self.assertRaisesMessage(TypeError, msg):
+            self.bacon.tags.add(self.lion)
+
     def test_set(self):
         bacon = Vegetable.objects.create(name="Bacon", is_yucky=False)
         fatty = bacon.tags.create(tag="fatty")
@@ -596,6 +602,15 @@ class GenericInlineFormsetTest(TestCase):
         form = Formset().forms[0]
         self.assertIsInstance(form['tag'].field.widget, CustomWidget)
 
+    @isolate_apps('generic_relations')
+    def test_incorrect_content_type(self):
+        class BadModel(models.Model):
+            content_type = models.PositiveIntegerField()
+
+        msg = "fk_name 'generic_relations.BadModel.content_type' is not a ForeignKey to ContentType"
+        with self.assertRaisesMessage(Exception, msg):
+            generic_inlineformset_factory(BadModel, TaggedItemForm)
+
     def test_save_new_uses_form_save(self):
         """
         Regression for #16260: save_new should call form.save()