From a950049356f7dd80c4062e5810a4c6d1b462b4be Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Sat, 30 Sep 2017 18:16:59 +0200 Subject: [PATCH] Improved and added more admin test cases --- polymorphic/tests/admintestcase.py | 25 ++---------- polymorphic/tests/migrations/0001_initial.py | 2 +- polymorphic/tests/models.py | 2 +- polymorphic/tests/test_admin.py | 41 +++++++++++++++++++- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/polymorphic/tests/admintestcase.py b/polymorphic/tests/admintestcase.py index 7bc7e97..78d7a0d 100644 --- a/polymorphic/tests/admintestcase.py +++ b/polymorphic/tests/admintestcase.py @@ -49,7 +49,7 @@ class AdminTestCase(TestCase): # Make sure the URLs are reachable by reverse() clear_url_caches() set_urlconf(tuple([ - url('^', include(self.admin_site.urls)) + url('^tmp-admin/', include(self.admin_site.urls)) ])) 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. """ + if not extra: + extra = {'data': {'post': 'yes'}} + admin_instance = self.get_admin_instance(model) request = self.create_admin_request('post', self.get_delete_url(model, object_id), **extra) response = admin_instance.delete_view(request, str(object_id)) @@ -157,26 +160,6 @@ class AdminTestCase(TestCase): MessageMiddleware().process_request(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): """ Assert that the response was a redirect, not a form error. diff --git a/polymorphic/tests/migrations/0001_initial.py b/polymorphic/tests/migrations/0001_initial.py index 2ce76ac..b4cd2a2 100644 --- a/polymorphic/tests/migrations/0001_initial.py +++ b/polymorphic/tests/migrations/0001_initial.py @@ -1048,7 +1048,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='inlinemodela', 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( model_name='inlinemodela', diff --git a/polymorphic/tests/models.py b/polymorphic/tests/models.py index 47683eb..ff5e0e1 100644 --- a/polymorphic/tests/models.py +++ b/polymorphic/tests/models.py @@ -421,7 +421,7 @@ class InlineParent(models.Model): class InlineModelA(PolymorphicModel): - parent = models.ForeignKey(InlineParent) + parent = models.ForeignKey(InlineParent, related_name='inline_children') field1 = models.CharField(max_length=10) diff --git a/polymorphic/tests/test_admin.py b/polymorphic/tests/test_admin.py index 72fc2a8..b71d90d 100644 --- a/polymorphic/tests/test_admin.py +++ b/polymorphic/tests/test_admin.py @@ -1,4 +1,5 @@ from django.contrib import admin +from django.contrib.contenttypes.models import ContentType from django.utils.html import escape from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicInlineSupportMixin, \ @@ -37,6 +38,21 @@ class PolymorphicAdminTests(AdminTestCase): # See that the child object was returned response = self.admin_get_change(Model2A, d_obj.pk) 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): """ @@ -59,10 +75,31 @@ class PolymorphicAdminTests(AdminTestCase): class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin): inlines = (Inline,) - obj = InlineParent.objects.create(title='FOO') - response = self.admin_get_change(InlineParent, obj.pk) + parent = InlineParent.objects.create(title='FOO') + 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 self.assertContains(response, 'childTypes') self.assertContains(response, escape('"type": "inlinemodela"')) 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')