Improved and added more admin test cases
parent
ff4dadb83d
commit
a950049356
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue