kopia lustrzana https://github.com/wagtail/wagtail
Revert "Merge pull request #335 from mope/edit-handlers-unit-tests"
This reverts commitpull/362/head^27ad6be82f3
, reversing changes made to4c77a4b18a
.
rodzic
7ad6be82f3
commit
b41a6d730f
|
@ -1,6 +1,5 @@
|
|||
*.pyc
|
||||
.DS_Store
|
||||
/.ropeproject/
|
||||
/.coverage
|
||||
/dist/
|
||||
/MANIFEST
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import copy
|
||||
import re
|
||||
import datetime
|
||||
|
||||
from taggit.forms import TagWidget
|
||||
from modelcluster.forms import ClusterForm, ClusterFormMetaclass
|
||||
|
@ -7,13 +9,13 @@ from django.template.loader import render_to_string
|
|||
from django.template.defaultfilters import addslashes
|
||||
from django.utils.safestring import mark_safe
|
||||
from django import forms
|
||||
from django.db import models
|
||||
from django.forms.models import fields_for_model
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.core.exceptions import (
|
||||
ObjectDoesNotExist,
|
||||
ImproperlyConfigured,
|
||||
)
|
||||
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured, ValidationError
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from wagtail.wagtailcore.models import Page
|
||||
|
@ -36,8 +38,7 @@ WIDGET_JS = {
|
|||
}
|
||||
|
||||
|
||||
# Callback to allow us to override the default form fields provided
|
||||
# for each model field.
|
||||
# Callback to allow us to override the default form fields provided for each model field.
|
||||
def formfield_for_dbfield(db_field, **kwargs):
|
||||
# snarfed from django/contrib/admin/options.py
|
||||
|
||||
|
@ -55,13 +56,13 @@ def formfield_for_dbfield(db_field, **kwargs):
|
|||
class WagtailAdminModelFormMetaclass(ClusterFormMetaclass):
|
||||
# Override the behaviour of the regular ModelForm metaclass -
|
||||
# which handles the translation of model fields to form fields -
|
||||
# to use our own formfield_for_dbfield function to do that
|
||||
# translation. This is done by sneaking a formfield_callback
|
||||
# property into the class being defined (unless the class already
|
||||
# provides a formfield_callback of its own).
|
||||
# to use our own formfield_for_dbfield function to do that translation.
|
||||
# This is done by sneaking a formfield_callback property into the class
|
||||
# being defined (unless the class already provides a formfield_callback
|
||||
# of its own).
|
||||
|
||||
# while we're at it, we'll also set extra_form_count to 0, as
|
||||
# we're creating extra forms in JS
|
||||
# while we're at it, we'll also set extra_form_count to 0, as we're creating
|
||||
# extra forms in JS
|
||||
extra_form_count = 0
|
||||
|
||||
def __new__(cls, name, bases, attrs):
|
||||
|
@ -78,8 +79,8 @@ WagtailAdminModelForm = WagtailAdminModelFormMetaclass('WagtailAdminModelForm',
|
|||
|
||||
|
||||
def get_form_for_model(
|
||||
model, fields=None, exclude=None, formsets=None,
|
||||
exclude_formsets=None, widgets=None
|
||||
model,
|
||||
fields=None, exclude=None, formsets=None, exclude_formsets=None, widgets=None
|
||||
):
|
||||
|
||||
# django's modelform_factory with a bit of custom behaviour
|
||||
|
@ -93,8 +94,7 @@ def get_form_for_model(
|
|||
if exclude is not None:
|
||||
attrs['exclude'] = exclude
|
||||
if issubclass(model, Page):
|
||||
attrs['exclude'] = attrs.get('exclude', []) + ['content_type', 'path',
|
||||
'depth', 'numchild']
|
||||
attrs['exclude'] = attrs.get('exclude', []) + ['content_type', 'path', 'depth', 'numchild']
|
||||
|
||||
if widgets is not None:
|
||||
attrs['widgets'] = widgets
|
||||
|
@ -111,9 +111,7 @@ def get_form_for_model(
|
|||
'Meta': type('Meta', (object,), attrs)
|
||||
}
|
||||
|
||||
return WagtailAdminModelFormMetaclass(class_name,
|
||||
(WagtailAdminModelForm,),
|
||||
form_class_attrs)
|
||||
return WagtailAdminModelFormMetaclass(class_name, (WagtailAdminModelForm,), form_class_attrs)
|
||||
|
||||
|
||||
def extract_panel_definitions_from_model_class(model, exclude=None):
|
||||
|
@ -128,8 +126,7 @@ def extract_panel_definitions_from_model_class(model, exclude=None):
|
|||
if issubclass(model, Page):
|
||||
_exclude = ['content_type', 'path', 'depth', 'numchild']
|
||||
|
||||
fields = fields_for_model(model, exclude=_exclude,
|
||||
formfield_callback=formfield_for_dbfield)
|
||||
fields = fields_for_model(model, exclude=_exclude, formfield_callback=formfield_for_dbfield)
|
||||
|
||||
for field_name, field in fields.items():
|
||||
try:
|
||||
|
|
|
@ -1,481 +0,0 @@
|
|||
from mock import MagicMock
|
||||
|
||||
from django.test import TestCase
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.forms.widgets import HiddenInput
|
||||
|
||||
from wagtail.wagtailadmin.edit_handlers import (
|
||||
get_form_for_model,
|
||||
extract_panel_definitions_from_model_class,
|
||||
BaseFieldPanel,
|
||||
FieldPanel,
|
||||
RichTextFieldPanel,
|
||||
EditHandler,
|
||||
WagtailAdminModelForm,
|
||||
BaseTabbedInterface,
|
||||
TabbedInterface,
|
||||
BaseObjectList,
|
||||
ObjectList,
|
||||
PageChooserPanel,
|
||||
InlinePanel
|
||||
)
|
||||
from wagtail.wagtailcore.models import Page, Site
|
||||
|
||||
|
||||
class TestGetFormForModel(TestCase):
|
||||
class FakeClass(object):
|
||||
_meta = MagicMock()
|
||||
|
||||
def setUp(self):
|
||||
self.mock_exclude = MagicMock()
|
||||
|
||||
def test_get_form_for_model(self):
|
||||
form = get_form_for_model(self.FakeClass,
|
||||
fields=[],
|
||||
exclude=[self.mock_exclude],
|
||||
formsets=['baz'],
|
||||
exclude_formsets=['quux'],
|
||||
widgets=['bacon'])
|
||||
self.assertEqual(form.Meta.exclude, [self.mock_exclude])
|
||||
self.assertEqual(form.Meta.formsets, ['baz'])
|
||||
self.assertEqual(form.Meta.exclude_formsets, ['quux'])
|
||||
self.assertEqual(form.Meta.widgets, ['bacon'])
|
||||
|
||||
|
||||
class TestExtractPanelDefinitionsFromModelClass(TestCase):
|
||||
class FakePage(Page):
|
||||
pass
|
||||
|
||||
def test_can_extract_panels(self):
|
||||
mock = MagicMock()
|
||||
mock.panels = 'foo'
|
||||
result = extract_panel_definitions_from_model_class(mock)
|
||||
self.assertEqual(result, 'foo')
|
||||
|
||||
def test_exclude(self):
|
||||
panels = extract_panel_definitions_from_model_class(Site, exclude=['hostname'])
|
||||
for panel in panels:
|
||||
self.assertNotEqual(panel.field_name, 'hostname')
|
||||
|
||||
def test_extracted_objects_are_panels(self):
|
||||
panels = extract_panel_definitions_from_model_class(self.FakePage)
|
||||
for panel in panels:
|
||||
self.assertTrue(issubclass(panel, BaseFieldPanel))
|
||||
|
||||
|
||||
class TestEditHandler(TestCase):
|
||||
class FakeForm(dict):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.fields = self.fields_iterator()
|
||||
|
||||
def fields_iterator(self):
|
||||
for i in self:
|
||||
yield i
|
||||
|
||||
def setUp(self):
|
||||
self.edit_handler = EditHandler(form=True, instance=True)
|
||||
self.edit_handler.render = lambda: "foo"
|
||||
|
||||
def test_widget_overrides(self):
|
||||
result = EditHandler.widget_overrides()
|
||||
self.assertEqual(result, {})
|
||||
|
||||
def test_required_formsets(self):
|
||||
result = EditHandler.required_formsets()
|
||||
self.assertEqual(result, [])
|
||||
|
||||
def test_get_form_class(self):
|
||||
result = EditHandler.get_form_class(Page)
|
||||
self.assertTrue(issubclass(result, WagtailAdminModelForm))
|
||||
|
||||
def test_edit_handler_init_no_instance(self):
|
||||
self.assertRaises(ValueError, EditHandler, form=True)
|
||||
|
||||
def test_edit_handler_init_no_form(self):
|
||||
self.assertRaises(ValueError, EditHandler, instance=True)
|
||||
|
||||
def test_object_classnames(self):
|
||||
result = self.edit_handler.object_classnames()
|
||||
self.assertEqual(result, "")
|
||||
|
||||
def test_field_classnames(self):
|
||||
result = self.edit_handler.field_classnames()
|
||||
self.assertEqual(result, "")
|
||||
|
||||
def test_field_type(self):
|
||||
result = self.edit_handler.field_type()
|
||||
self.assertEqual(result, "")
|
||||
|
||||
def test_render_as_object(self):
|
||||
result = self.edit_handler.render_as_object()
|
||||
self.assertEqual(result, "foo")
|
||||
|
||||
def test_render_as_field(self):
|
||||
result = self.edit_handler.render_as_field()
|
||||
self.assertEqual(result, "foo")
|
||||
|
||||
def test_render_js(self):
|
||||
result = self.edit_handler.render_js()
|
||||
self.assertEqual(result, "")
|
||||
|
||||
def test_rendered_fields(self):
|
||||
result = self.edit_handler.rendered_fields()
|
||||
self.assertEqual(result, [])
|
||||
|
||||
def test_render_missing_fields(self):
|
||||
fake_form = self.FakeForm()
|
||||
fake_form["foo"] = "bar"
|
||||
self.edit_handler.form = fake_form
|
||||
self.assertEqual(self.edit_handler.render_missing_fields(), "bar")
|
||||
|
||||
def test_render_form_content(self):
|
||||
fake_form = self.FakeForm()
|
||||
fake_form["foo"] = "bar"
|
||||
self.edit_handler.form = fake_form
|
||||
self.assertEqual(self.edit_handler.render_form_content(), "foobar")
|
||||
|
||||
|
||||
class TestTabbedInterface(TestCase):
|
||||
class FakeChild(object):
|
||||
class FakeGrandchild(object):
|
||||
def render_js(self):
|
||||
return "rendered js"
|
||||
|
||||
def rendered_fields(self):
|
||||
return ["rendered fields"]
|
||||
|
||||
def widget_overrides(self):
|
||||
return {'foo': 'bar'}
|
||||
|
||||
def required_formsets(self):
|
||||
return {'baz': 'quux'}
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
fake_grandchild = self.FakeGrandchild()
|
||||
return fake_grandchild
|
||||
|
||||
def setUp(self):
|
||||
fake_child = self.FakeChild()
|
||||
self.TabbedInterfaceClass = TabbedInterface([fake_child])
|
||||
self.tabbed_interface = self.TabbedInterfaceClass(instance=True,
|
||||
form=True)
|
||||
|
||||
def test_tabbed_interface(self):
|
||||
self.assertTrue(issubclass(self.TabbedInterfaceClass,
|
||||
BaseTabbedInterface))
|
||||
|
||||
def test_object_classnames_no_classname(self):
|
||||
result = self.tabbed_interface.object_classnames()
|
||||
self.assertEqual(result, 'multi-field')
|
||||
|
||||
def test_object_classnames(self):
|
||||
self.tabbed_interface.classname = 'foo'
|
||||
result = self.tabbed_interface.object_classnames()
|
||||
self.assertEqual(result, 'multi-field foo')
|
||||
|
||||
def test_widget_overrides(self):
|
||||
result = self.tabbed_interface.widget_overrides()
|
||||
self.assertEqual(result, {'foo': 'bar'})
|
||||
|
||||
def test_required_formsets(self):
|
||||
result = self.tabbed_interface.required_formsets()
|
||||
self.assertEqual(result, ['baz'])
|
||||
|
||||
def test_render(self):
|
||||
result = self.tabbed_interface.render()
|
||||
self.assertIn('<div class="tab-content">', result)
|
||||
|
||||
def test_render_js(self):
|
||||
result = self.tabbed_interface.render_js()
|
||||
self.assertEqual(result, 'rendered js')
|
||||
|
||||
def test_rendered_fields(self):
|
||||
result = self.tabbed_interface.rendered_fields()
|
||||
self.assertEqual(result, ["rendered fields"])
|
||||
|
||||
|
||||
class TestObjectList(TestCase):
|
||||
def test_object_list(self):
|
||||
object_list = ObjectList(['foo'])
|
||||
self.assertTrue(issubclass(object_list, BaseObjectList))
|
||||
|
||||
|
||||
class TestBaseFieldPanel(TestCase):
|
||||
class FakeClass(object):
|
||||
required = False
|
||||
|
||||
class FakeField(object):
|
||||
label = 'label'
|
||||
help_text = 'help text'
|
||||
|
||||
def setUp(self):
|
||||
fake_field = self.FakeField()
|
||||
BaseFieldPanel.field_name = 'barbecue'
|
||||
self.base_field_panel = BaseFieldPanel(
|
||||
instance=True,
|
||||
form={'barbecue': fake_field})
|
||||
|
||||
def test_object_classnames_no_classname(self):
|
||||
result = self.base_field_panel.object_classnames()
|
||||
self.assertEqual(result, "single-field")
|
||||
|
||||
def test_object_classnames(self):
|
||||
self.base_field_panel.classname = "bar"
|
||||
result = self.base_field_panel.object_classnames()
|
||||
self.assertEqual(result, "single-field bar")
|
||||
|
||||
def test_field_type(self):
|
||||
fake_object = self.FakeClass()
|
||||
another_fake_object = self.FakeClass()
|
||||
fake_object.field = another_fake_object
|
||||
self.base_field_panel.bound_field = fake_object
|
||||
self.assertEqual(self.base_field_panel.field_type(), 'fake_class')
|
||||
|
||||
def test_field_classnames(self):
|
||||
fake_object = self.FakeClass()
|
||||
another_fake_object = self.FakeClass()
|
||||
another_fake_object.required = True
|
||||
fake_object.errors = True
|
||||
fake_object.field = another_fake_object
|
||||
self.base_field_panel.bound_field = fake_object
|
||||
self.assertEqual(self.base_field_panel.field_classnames(),
|
||||
'fake_class required error')
|
||||
|
||||
|
||||
class TestFieldPanel(TestCase):
|
||||
class FakeClass(object):
|
||||
required = False
|
||||
|
||||
class FakeField(object):
|
||||
label = 'label'
|
||||
help_text = 'help text'
|
||||
errors = ['errors']
|
||||
id_for_label = 'id for label'
|
||||
|
||||
def setUp(self):
|
||||
fake_field = self.FakeField()
|
||||
fake_field.field = self.FakeClass()
|
||||
self.field_panel = FieldPanel('barbecue', 'snowman')(
|
||||
instance=True,
|
||||
form={'barbecue': fake_field})
|
||||
|
||||
def test_render_as_object(self):
|
||||
result = self.field_panel.render_as_object()
|
||||
self.assertIn('<legend>label</legend>',
|
||||
result)
|
||||
self.assertIn('<li class="fake_class error">',
|
||||
result)
|
||||
self.assertIn('<p class="error-message">',
|
||||
result)
|
||||
|
||||
def test_render_js_unknown_widget(self):
|
||||
field = self.FakeField()
|
||||
bound_field = self.FakeField()
|
||||
widget = self.FakeField()
|
||||
field.widget = widget
|
||||
bound_field.field = field
|
||||
self.field_panel.bound_field = bound_field
|
||||
result = self.field_panel.render_js()
|
||||
self.assertEqual(result,
|
||||
'')
|
||||
|
||||
def test_render_as_field(self):
|
||||
field = self.FakeField()
|
||||
bound_field = self.FakeField()
|
||||
bound_field.field = field
|
||||
self.field_panel.bound_field = bound_field
|
||||
result = self.field_panel.render_as_field()
|
||||
self.assertIn('<p class="help">help text</p>',
|
||||
result)
|
||||
self.assertIn('<span>errors</span>',
|
||||
result)
|
||||
|
||||
def test_rendered_fields(self):
|
||||
result = self.field_panel.rendered_fields()
|
||||
self.assertEqual(result, ['barbecue'])
|
||||
|
||||
|
||||
class TestRichTextFieldPanel(TestCase):
|
||||
class FakeField(object):
|
||||
label = 'label'
|
||||
help_text = 'help text'
|
||||
errors = ['errors']
|
||||
id_for_label = 'id for label'
|
||||
|
||||
def test_render_js(self):
|
||||
fake_field = self.FakeField()
|
||||
rich_text_field_panel = RichTextFieldPanel('barbecue')(
|
||||
instance=True,
|
||||
form={'barbecue': fake_field})
|
||||
result = rich_text_field_panel.render_js()
|
||||
self.assertEqual(result,
|
||||
"makeRichTextEditable(fixPrefix('id for label'));")
|
||||
|
||||
|
||||
class TestPageChooserPanel(TestCase):
|
||||
class FakeField(object):
|
||||
label = 'label'
|
||||
help_text = 'help text'
|
||||
errors = ['errors']
|
||||
id_for_label = 'id for label'
|
||||
|
||||
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
|
||||
|
||||
def setUp(self):
|
||||
fake_field = self.FakeField()
|
||||
fake_instance = self.FakeInstance()
|
||||
self.page_chooser_panel = PageChooserPanel('barbecue')(
|
||||
instance=fake_instance,
|
||||
form={'barbecue': fake_field})
|
||||
|
||||
def test_render_js(self):
|
||||
result = self.page_chooser_panel.render_js()
|
||||
self.assertEqual(result,
|
||||
"createPageChooser(fixPrefix('id for label'), 'wagtailcore.page', 1);")
|
||||
|
||||
def test_get_chosen_item(self):
|
||||
result = self.page_chooser_panel.get_chosen_item()
|
||||
self.assertEqual(result.name, 'fake page')
|
||||
|
||||
def test_render_as_field(self):
|
||||
result = self.page_chooser_panel.render_as_field()
|
||||
self.assertIn('<p class="help">help text</p>', result)
|
||||
self.assertIn('<span>errors</span>', result)
|
||||
|
||||
def test_widget_overrides(self):
|
||||
result = self.page_chooser_panel.widget_overrides()
|
||||
self.assertEqual(result, {'barbecue': HiddenInput})
|
||||
|
||||
def test_target_content_type(self):
|
||||
result = PageChooserPanel(
|
||||
'barbecue',
|
||||
'wagtailcore.site'
|
||||
).target_content_type()
|
||||
self.assertEqual(result.name, 'site')
|
||||
|
||||
def test_target_content_type_malformed_type(self):
|
||||
result = PageChooserPanel(
|
||||
'barbecue',
|
||||
'snowman'
|
||||
)
|
||||
self.assertRaises(ImproperlyConfigured,
|
||||
result.target_content_type)
|
||||
|
||||
def test_target_content_type_nonexistent_type(self):
|
||||
result = PageChooserPanel(
|
||||
'barbecue',
|
||||
'snowman.lorry'
|
||||
)
|
||||
self.assertRaises(ImproperlyConfigured,
|
||||
result.target_content_type)
|
||||
|
||||
|
||||
class TestInlinePanel(TestCase):
|
||||
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()
|
||||
|
||||
def __repr__(self):
|
||||
return 'fake form'
|
||||
|
||||
forms = [FakeForm()]
|
||||
empty_form = FakeForm()
|
||||
can_order = 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
|
||||
|
||||
def setUp(self):
|
||||
self.fake_field = self.FakeField()
|
||||
self.fake_instance = self.FakeInstance()
|
||||
self.mock_panel = MagicMock()
|
||||
self.mock_panel.name = 'mock panel'
|
||||
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')
|
||||
expected_calls = '[call(instance=fake instance, form=fake form),\n call(instance=fake instance, form=fake form)]'
|
||||
self.assertEqual(str(self.mock_panel.mock_calls), expected_calls)
|
||||
|
||||
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')
|
||||
expected_calls = '[call(instance=fake instance, form=fake form),\n call(instance=fake instance, form=fake form)]'
|
||||
self.assertEqual(str(other_mock_panel.mock_calls), expected_calls)
|
||||
|
||||
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())
|
||||
|
||||
def test_render_js(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())
|
Ładowanie…
Reference in New Issue