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

This commit is contained in:
Anton Samarchyan 2017-01-27 13:29:56 -05:00 committed by Tim Graham
parent aa14528910
commit 4d6584000a
2 changed files with 39 additions and 2 deletions

View File

@ -1,8 +1,12 @@
import json
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models from django.db import models
from django.test import SimpleTestCase from django.test import SimpleTestCase, TestCase
from django.test.utils import isolate_apps from django.test.utils import isolate_apps
from .models import Answer, Question
@isolate_apps('contenttypes_tests') @isolate_apps('contenttypes_tests')
class GenericForeignKeyTests(SimpleTestCase): class GenericForeignKeyTests(SimpleTestCase):
@ -11,3 +15,21 @@ class GenericForeignKeyTests(SimpleTestCase):
class Model(models.Model): class Model(models.Model):
field = GenericForeignKey() field = GenericForeignKey()
self.assertEqual(str(Model.field), 'contenttypes_tests.Model.field') 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])

View File

@ -2,9 +2,10 @@ from django import forms
from django.contrib.contenttypes.forms import generic_inlineformset_factory from django.contrib.contenttypes.forms import generic_inlineformset_factory
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import FieldError 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.db.models import Q
from django.test import SimpleTestCase, TestCase from django.test import SimpleTestCase, TestCase
from django.test.utils import isolate_apps
from .models import ( from .models import (
AllowsNullGFK, Animal, Carrot, Comparison, ConcreteRelatedModel, AllowsNullGFK, Animal, Carrot, Comparison, ConcreteRelatedModel,
@ -272,6 +273,11 @@ class GenericRelationsTests(TestCase):
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
self.bacon.tags.add(t1) 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): def test_set(self):
bacon = Vegetable.objects.create(name="Bacon", is_yucky=False) bacon = Vegetable.objects.create(name="Bacon", is_yucky=False)
fatty = bacon.tags.create(tag="fatty") fatty = bacon.tags.create(tag="fatty")
@ -596,6 +602,15 @@ class GenericInlineFormsetTest(TestCase):
form = Formset().forms[0] form = Formset().forms[0]
self.assertIsInstance(form['tag'].field.widget, CustomWidget) 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): def test_save_new_uses_form_save(self):
""" """
Regression for #16260: save_new should call form.save() Regression for #16260: save_new should call form.save()