From ce3a0e26dcc313b7214fadfd55405721f18491ea Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 30 Jan 2015 13:39:39 +0000 Subject: [PATCH 1/6] better-behaved initialisation of PageChooserPanel (the second parameter is the page type to filter on, not the current model) --- .../wagtailadmin/tests/test_edit_handlers.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index aee34c1f2..f3e2d7067 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -342,32 +342,37 @@ class TestFieldPanel(TestCase): class TestPageChooserPanel(TestCase): + fixtures = ['test.json'] def setUp(self): - model = PageChooserModel - self.chosen_page = Page.objects.get(pk=2) - test_instance = model.objects.create(page=self.chosen_page) - self.dotted_model = model._meta.app_label + '.' + model._meta.model_name + model = PageChooserModel # a model with a foreign key to Page which we want to render as a page chooser - self.page_chooser_panel_class = PageChooserPanel('page', model) + # a PageChooserPanel class that works on PageChooserModel's 'page' field + self.MyPageChooserPanel = PageChooserPanel('page', 'tests.EventPage') - form_class = get_form_for_model(model, widgets=self.page_chooser_panel_class.widget_overrides()) - form = form_class(instance=test_instance) - form.errors['page'] = form.error_class(['errors']) + # build a form class containing the fields that MyPageChooserPanel wants + PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel) - self.page_chooser_panel = self.page_chooser_panel_class(instance=test_instance, + # a test instance of PageChooserModel, pointing to the 'christmas' page + self.christmas_page = Page.objects.get(slug='christmas') + self.events_index_page = Page.objects.get(slug='events') + test_instance = model.objects.create(page=self.christmas_page) + + form = PageChooserForm(instance=test_instance) + form.errors['page'] = form.error_class(['errors']) # FIXME: wat + self.page_chooser_panel = self.MyPageChooserPanel(instance=test_instance, form=form) def test_render_js_init(self): result = self.page_chooser_panel.render_as_field() self.assertIn( 'createPageChooser("{id}", "{model}", {parent});'.format( - id="id_page", model=self.dotted_model, parent=self.chosen_page.get_parent().id), + id="id_page", model="tests.eventpage", parent=self.events_index_page.id), result) def test_get_chosen_item(self): result = self.page_chooser_panel.get_chosen_item() - self.assertEqual(result, self.chosen_page) + self.assertEqual(result, self.christmas_page) def test_render_as_field(self): result = self.page_chooser_panel.render_as_field() From 2480a97b24c3631b56c837b61e267dc2b8051b4c Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 30 Jan 2015 15:48:47 +0000 Subject: [PATCH 2/6] more relevant tests for PageChooserPanel --- .../wagtailadmin/tests/test_edit_handlers.py | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index f3e2d7067..8331321ff 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -351,24 +351,27 @@ class TestPageChooserPanel(TestCase): self.MyPageChooserPanel = PageChooserPanel('page', 'tests.EventPage') # build a form class containing the fields that MyPageChooserPanel wants - PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel) + self.PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel) # a test instance of PageChooserModel, pointing to the 'christmas' page self.christmas_page = Page.objects.get(slug='christmas') self.events_index_page = Page.objects.get(slug='events') - test_instance = model.objects.create(page=self.christmas_page) + self.test_instance = model.objects.create(page=self.christmas_page) - form = PageChooserForm(instance=test_instance) - form.errors['page'] = form.error_class(['errors']) # FIXME: wat - self.page_chooser_panel = self.MyPageChooserPanel(instance=test_instance, - form=form) + self.form = self.PageChooserForm(instance=self.test_instance) + # self.form.errors['page'] = self.form.error_class(['errors']) # FIXME: wat + self.page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, + form=self.form) + + def test_page_chooser_uses_correct_widget(self): + self.assertEqual(type(self.form.fields['page'].widget), AdminPageChooser) def test_render_js_init(self): result = self.page_chooser_panel.render_as_field() - self.assertIn( - 'createPageChooser("{id}", "{model}", {parent});'.format( - id="id_page", model="tests.eventpage", parent=self.events_index_page.id), - result) + expected_js = 'createPageChooser("{id}", "{model}", {parent});'.format( + id="id_page", model="tests.eventpage", parent=self.events_index_page.id) + + self.assertIn(expected_js, result) def test_get_chosen_item(self): result = self.page_chooser_panel.get_chosen_item() @@ -377,11 +380,14 @@ class TestPageChooserPanel(TestCase): def test_render_as_field(self): result = self.page_chooser_panel.render_as_field() self.assertIn('

help text

', result) - self.assertIn('errors', result) - def test_widget_overrides(self): - result = self.page_chooser_panel.widget_overrides() - self.assertIsInstance(result['page'], AdminPageChooser) + def test_render_error(self): + form = self.PageChooserForm({'page': ''}, instance=self.test_instance) + self.assertFalse(form.is_valid()) + + page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, + form=form) + self.assertIn('This field is required.', page_chooser_panel.render_as_field()) def test_target_content_type(self): result = PageChooserPanel( From 331250e5c6a80ff3c2ebec76a42cf64fd5cb1a07 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 30 Jan 2015 16:59:59 +0000 Subject: [PATCH 3/6] use real models for render tests on InlinePanel --- .../wagtailadmin/tests/test_edit_handlers.py | 92 ++++++++++--------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index 8331321ff..2d4fa1e56 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -12,17 +12,14 @@ from wagtail.wagtailadmin.edit_handlers import ( BaseFieldPanel, FieldPanel, BaseRichTextFieldPanel, - WagtailAdminModelForm, - BaseTabbedInterface, TabbedInterface, - BaseObjectList, ObjectList, PageChooserPanel, InlinePanel, ) from wagtail.wagtailadmin.widgets import AdminPageChooser, AdminDateInput -from wagtail.wagtailimages.edit_handlers import BaseImageChooserPanel +from wagtail.wagtailimages.edit_handlers import BaseImageChooserPanel, ImageChooserPanel from wagtail.wagtailcore.models import Page, Site from wagtail.tests.models import PageChooserModel, EventPage, EventPageSpeaker @@ -414,6 +411,8 @@ class TestPageChooserPanel(TestCase): class TestInlinePanel(TestCase): + fixtures = ['test.json'] + class FakeField(object): class FakeFormset(object): class FakeForm(object): @@ -479,45 +478,54 @@ class TestInlinePanel(TestCase): self.mock_model = MagicMock() self.mock_model.formset.related.model.panels = [self.mock_panel] - def test_get_panel_definitions_no_panels(self): - """ - Check that get_panel_definitions returns the panels set on the model - when no panels are set on the InlinePanel - """ - inline_panel = InlinePanel(self.mock_model, 'formset')( - instance=self.fake_instance, - form=self.fake_field) - result = inline_panel.get_panel_definitions() - self.assertEqual(result[0].name, 'mock panel') - - def test_get_panel_definitions(self): - """ - Check that get_panel_definitions returns the panels set on - InlinePanel - """ - other_mock_panel = MagicMock() - other_mock_panel.name = 'other mock panel' - inline_panel = InlinePanel(self.mock_model, - 'formset', - panels=[other_mock_panel])( - instance=self.fake_instance, - form=self.fake_field) - result = inline_panel.get_panel_definitions() - self.assertEqual(result[0].name, 'other mock panel') - - def test_required_formsets(self): - inline_panel = InlinePanel(self.mock_model, 'formset')( - instance=self.fake_instance, - form=self.fake_field) - self.assertEqual(inline_panel.required_formsets(), ['formset']) - def test_render(self): - inline_panel = InlinePanel(self.mock_model, - 'formset', - label='foo')( - instance=self.fake_instance, - form=self.fake_field) - self.assertIn('Add foo', inline_panel.render()) + """ + Check that the inline panel renders the panels set on the model + when no 'panels' parameter is passed in the InlinePanel definition + """ + SpeakerInlinePanel = InlinePanel(EventPage, 'speakers', label="Speakers") + EventPageForm = SpeakerInlinePanel.get_form_class(EventPage) + + # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset + self.assertEqual(['speakers'], EventPageForm.formsets.keys()) + + event_page = EventPage.objects.get(slug='christmas') + + form = EventPageForm(instance=event_page) + panel = SpeakerInlinePanel(instance=event_page, form=form) + + result = panel.render_as_field() + + self.assertIn('', result) + self.assertIn('', result) + self.assertIn('', result) + self.assertIn('value="Choose an image"', result) + + def test_render_with_panel_overrides(self): + """ + Check that inline panel renders the panels listed in the InlinePanel definition + where one is specified + """ + SpeakerInlinePanel = InlinePanel(EventPage, 'speakers', label="Speakers", panels=[ + FieldPanel('first_name'), + ImageChooserPanel('image'), + ]) + EventPageForm = SpeakerInlinePanel.get_form_class(EventPage) + + # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset + self.assertEqual(['speakers'], EventPageForm.formsets.keys()) + + event_page = EventPage.objects.get(slug='christmas') + + form = EventPageForm(instance=event_page) + panel = SpeakerInlinePanel(instance=event_page, form=form) + + result = panel.render_as_field() + + self.assertIn('', result) + self.assertNotIn('', result) + self.assertIn('', result) + self.assertIn('value="Choose an image"', result) def test_render_js_init(self): inline_panel = InlinePanel(self.mock_model, From 9adb66f052a7b6a301c8c5572c453361bead6edc Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 30 Jan 2015 17:14:29 +0000 Subject: [PATCH 4/6] move InlinePanel.render_js_init tests into main render tests; add a test for #338; remove all remaining mock stuff from test_edit_handlers --- .../wagtailadmin/tests/test_edit_handlers.py | 82 ++----------------- 1 file changed, 8 insertions(+), 74 deletions(-) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index 2d4fa1e56..1e1e28f30 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -1,5 +1,3 @@ -from mock import MagicMock - from datetime import date from django.core.exceptions import ImproperlyConfigured @@ -413,71 +411,6 @@ class TestPageChooserPanel(TestCase): class TestInlinePanel(TestCase): fixtures = ['test.json'] - class FakeField(object): - class FakeFormset(object): - class FakeForm(object): - class FakeInstance(object): - def __repr__(self): - return 'fake instance' - fields = {'DELETE': MagicMock(), - 'ORDER': MagicMock()} - instance = FakeInstance() - - cleaned_data = { - 'ORDER': 0, - } - - def __repr__(self): - return 'fake form' - - forms = [FakeForm()] - empty_form = FakeForm() - can_order = True - - def is_valid(self): - return True - - label = 'label' - help_text = 'help text' - errors = ['errors'] - id_for_label = 'id for label' - formsets = {'formset': FakeFormset()} - - class FakeInstance(object): - class FakePage(object): - class FakeParent(object): - id = 1 - - name = 'fake page' - - def get_parent(self): - return self.FakeParent() - - def __init__(self): - fake_page = self.FakePage() - self.barbecue = fake_page - - class FakePanel(object): - name = 'mock panel' - - class FakeChild(object): - def rendered_fields(self): - return ["rendered fields"] - - def init(*args, **kwargs): - pass - - def __call__(self, *args, **kwargs): - fake_child = self.FakeChild() - return fake_child - - def setUp(self): - self.fake_field = self.FakeField() - self.fake_instance = self.FakeInstance() - self.mock_panel = self.FakePanel() - self.mock_model = MagicMock() - self.mock_model.formset.related.model.panels = [self.mock_panel] - def test_render(self): """ Check that the inline panel renders the panels set on the model @@ -501,6 +434,8 @@ class TestInlinePanel(TestCase): self.assertIn('', result) self.assertIn('value="Choose an image"', result) + self.assertIn('var panel = InlinePanel({', panel.render_js_init()) + def test_render_with_panel_overrides(self): """ Check that inline panel renders the panels listed in the InlinePanel definition @@ -524,13 +459,12 @@ class TestInlinePanel(TestCase): self.assertIn('', result) self.assertNotIn('', result) + + # surname field is still rendered as a 'stray' label-less field: see #338. + # (Temporarily adding a test for this, so that we can verify that it fails when #338 is fixed...) + self.assertIn('Image:', result) self.assertIn('value="Choose an image"', result) - def test_render_js_init(self): - inline_panel = InlinePanel(self.mock_model, - 'formset')( - instance=self.fake_instance, - form=self.fake_field) - self.assertIn('var panel = InlinePanel({', - inline_panel.render_js_init()) + self.assertIn('var panel = InlinePanel({', panel.render_js_init()) From b2dfc84b6139ed8e356fbba0074f50ab9939022b Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 30 Jan 2015 19:35:37 +0000 Subject: [PATCH 5/6] test that InlinePanel renders the necessary hidden fields --- .../wagtailadmin/tests/test_edit_handlers.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index 1e1e28f30..ab3773497 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -434,6 +434,15 @@ class TestInlinePanel(TestCase): self.assertIn('', result) self.assertIn('value="Choose an image"', result) + # rendered panel must also contain hidden fields for id, DELETE and ORDER + self.assertIn('Image:', result) self.assertIn('value="Choose an image"', result) + # rendered panel must also contain hidden fields for id, DELETE and ORDER + self.assertIn(' Date: Fri, 30 Jan 2015 19:59:25 +0000 Subject: [PATCH 6/6] python3 fix --- wagtail/wagtailadmin/tests/test_edit_handlers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index ab3773497..1b01065a5 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -420,7 +420,7 @@ class TestInlinePanel(TestCase): EventPageForm = SpeakerInlinePanel.get_form_class(EventPage) # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset - self.assertEqual(['speakers'], EventPageForm.formsets.keys()) + self.assertEqual(['speakers'], list(EventPageForm.formsets.keys())) event_page = EventPage.objects.get(slug='christmas') @@ -457,7 +457,7 @@ class TestInlinePanel(TestCase): EventPageForm = SpeakerInlinePanel.get_form_class(EventPage) # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset - self.assertEqual(['speakers'], EventPageForm.formsets.keys()) + self.assertEqual(['speakers'], list(EventPageForm.formsets.keys())) event_page = EventPage.objects.get(slug='christmas')