Improved and added more admin test cases

fix_request_path_info
Diederik van der Boor 2017-09-30 18:16:59 +02:00
parent ff4dadb83d
commit a950049356
4 changed files with 45 additions and 25 deletions

View File

@ -49,7 +49,7 @@ class AdminTestCase(TestCase):
# Make sure the URLs are reachable by reverse() # Make sure the URLs are reachable by reverse()
clear_url_caches() clear_url_caches()
set_urlconf(tuple([ set_urlconf(tuple([
url('^', include(self.admin_site.urls)) url('^tmp-admin/', include(self.admin_site.urls))
])) ]))
def get_admin_instance(self, model): def get_admin_instance(self, model):
@ -124,6 +124,9 @@ class AdminTestCase(TestCase):
""" """
Make a direct "add" call to the admin page, circumvening login checks. Make a direct "add" call to the admin page, circumvening login checks.
""" """
if not extra:
extra = {'data': {'post': 'yes'}}
admin_instance = self.get_admin_instance(model) admin_instance = self.get_admin_instance(model)
request = self.create_admin_request('post', self.get_delete_url(model, object_id), **extra) request = self.create_admin_request('post', self.get_delete_url(model, object_id), **extra)
response = admin_instance.delete_view(request, str(object_id)) response = admin_instance.delete_view(request, str(object_id))
@ -157,26 +160,6 @@ class AdminTestCase(TestCase):
MessageMiddleware().process_request(request) MessageMiddleware().process_request(request)
return request return request
def _get_management_form_data(self, admin_instance, request):
"""
Return the formdata that the management forms need.
"""
inline_instances = admin_instance.get_inline_instances(request)
forms = []
for inline_instance in inline_instances:
FormSet = inline_instance.get_formset(request)
formset = FormSet(instance=admin_instance.model())
forms.append(formset.management_form)
# In a primitive way, get the form fields.
# This is not exactly the same as a POST, since that runs through clean()
formdata = {}
for form in forms:
for boundfield in form:
formdata[boundfield.html_name] = boundfield.value()
return formdata
def assertFormSuccess(self, request_url, response): def assertFormSuccess(self, request_url, response):
""" """
Assert that the response was a redirect, not a form error. Assert that the response was a redirect, not a form error.

View File

@ -1048,7 +1048,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='inlinemodela', model_name='inlinemodela',
name='parent', name='parent',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tests.InlineParent'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tests.InlineParent', related_name='inline_children'),
), ),
migrations.AddField( migrations.AddField(
model_name='inlinemodela', model_name='inlinemodela',

View File

@ -421,7 +421,7 @@ class InlineParent(models.Model):
class InlineModelA(PolymorphicModel): class InlineModelA(PolymorphicModel):
parent = models.ForeignKey(InlineParent) parent = models.ForeignKey(InlineParent, related_name='inline_children')
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)

View File

@ -1,4 +1,5 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.utils.html import escape from django.utils.html import escape
from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicInlineSupportMixin, \ from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicInlineSupportMixin, \
@ -37,6 +38,21 @@ class PolymorphicAdminTests(AdminTestCase):
# See that the child object was returned # See that the child object was returned
response = self.admin_get_change(Model2A, d_obj.pk) response = self.admin_get_change(Model2A, d_obj.pk)
self.assertContains(response, 'field4') self.assertContains(response, 'field4')
self.admin_post_change(Model2A, d_obj.pk, {
'field1': 'A2',
'field2': 'B2',
'field3': 'C2',
'field4': 'D2'
})
d_obj.refresh_from_db()
self.assertEqual(d_obj.field1, 'A2')
self.assertEqual(d_obj.field2, 'B2')
self.assertEqual(d_obj.field3, 'C2')
self.assertEqual(d_obj.field4, 'D2')
self.admin_post_delete(Model2A, d_obj.pk)
self.assertRaises(Model2A.DoesNotExist, lambda: d_obj.refresh_from_db())
def test_admin_inlines(self): def test_admin_inlines(self):
""" """
@ -59,10 +75,31 @@ class PolymorphicAdminTests(AdminTestCase):
class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin): class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):
inlines = (Inline,) inlines = (Inline,)
obj = InlineParent.objects.create(title='FOO') parent = InlineParent.objects.create(title='FOO')
response = self.admin_get_change(InlineParent, obj.pk) self.assertEqual(parent.inline_children.count(), 0)
response = self.admin_get_change(InlineParent, parent.pk)
# Make sure the fieldset has the right data exposed in data-inline-formset # Make sure the fieldset has the right data exposed in data-inline-formset
self.assertContains(response, 'childTypes') self.assertContains(response, 'childTypes')
self.assertContains(response, escape('"type": "inlinemodela"')) self.assertContains(response, escape('"type": "inlinemodela"'))
self.assertContains(response, escape('"type": "inlinemodelb"')) self.assertContains(response, escape('"type": "inlinemodelb"'))
self.admin_post_change(InlineParent, parent.pk, {
'title': 'FOO2',
'inline_children-INITIAL_FORMS': 0,
'inline_children-TOTAL_FORMS': 1,
'inline_children-MIN_NUM_FORMS': 0,
'inline_children-MAX_NUM_FORMS': 1000,
'inline_children-0-parent': parent.pk,
'inline_children-0-polymorphic_ctype': ContentType.objects.get_for_model(InlineModelB).pk,
'inline_children-0-field1': 'A2',
'inline_children-0-field2': 'B2',
})
parent.refresh_from_db()
self.assertEqual(parent.title, 'FOO2')
self.assertEqual(parent.inline_children.count(), 1)
child = parent.inline_children.all()[0]
self.assertEqual(child.__class__, InlineModelB)
self.assertEqual(child.field1, 'A2')
self.assertEqual(child.field2, 'B2')