source: main/waeup.sirp/branches/ulif-fasttables/src/waeup/sirp/widgets/tests/test_objectwidget.py @ 5307

Last change on this file since 5307 was 5307, checked in by uli, 14 years ago

Replace the original ObjectWidget? implementation with our own one in
tests. This should give no errors, as both implementations should
behave identically to the outside world.

File size: 4.9 KB
Line 
1"""Tests for objectwidget.
2"""
3import unittest
4import sys
5from zope.component import testing
6from zope.interface import Interface, implements
7from zope.publisher.browser import TestRequest
8from zope.schema import Object, TextLine
9from zope.schema.interfaces import ITextLine
10import doctest
11from zope.publisher.interfaces.browser import IDefaultBrowserLayer
12from zope.component import provideAdapter
13
14from zope.formlib.interfaces import IInputWidget, MissingInputError
15from zope.formlib.widgets import TextWidget
16from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
17from zope.formlib.interfaces import IWidgetInputErrorView
18
19from waeup.sirp.widgets.objectwidget import WAeUPObjectWidget as ObjectWidget
20
21class ITestContact(Interface):
22    name = TextLine()
23    email = TextLine()
24   
25class TestContact(object):
26    implements(ITestContact)
27
28class ObjectWidgetInputErrorView(object):
29    implements(IWidgetInputErrorView)
30
31    def __init__(self, error, request):
32        self.error = error
33        self.request = request
34
35    def snippet(self):
36        return repr(self.error)
37
38class ObjectWidgetTest(BrowserWidgetTest):
39    """Documents and tests the object widget.
40
41        >>> from zope.interface.verify import verifyClass
42        >>> verifyClass(IInputWidget, ObjectWidget)
43        True
44    """
45
46    _FieldFactory = Object
47    def _WidgetFactory(self, context, request, **kw):
48        kw.update({'factory': TestContact})
49        return ObjectWidget(context, request, **kw)
50
51    def setUpContent(self, desc=u'', title=u'Foo Title'):
52        provideAdapter(TextWidget, (ITextLine, IDefaultBrowserLayer),
53                       IInputWidget)
54       
55        class ITestContent(Interface):
56            foo = self._FieldFactory(
57                    ITestContact,
58                    title=title,
59                    description=desc
60                    )
61        class TestObject(object):
62            implements(ITestContent)
63
64        self.content = TestObject()
65        self.field = ITestContent['foo']
66        self.request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
67        self.request.form['field.foo'] = u'Foo Value'
68        self._widget = self._WidgetFactory(self.field, self.request)
69
70    def setUp(self):
71        super(ObjectWidgetTest, self).setUp()
72        self.field = Object(ITestContact, __name__=u'foo')
73        provideAdapter(TextWidget,
74                       (ITextLine, IDefaultBrowserLayer),
75                       IInputWidget)
76
77    def test_applyChanges(self):
78        self.request.form['field.foo.name'] = u'Foo Name'
79        self.request.form['field.foo.email'] = u'foo@foo.test'
80        widget = self._WidgetFactory(self.field, self.request)
81
82        self.assertEqual(widget.applyChanges(self.content), True)
83        self.assertEqual(hasattr(self.content, 'foo'), True)
84        self.assertEqual(isinstance(self.content.foo, TestContact), True)
85        self.assertEqual(self.content.foo.name, u'Foo Name')
86        self.assertEqual(self.content.foo.email, u'foo@foo.test')
87
88    def test_error(self):
89        provideAdapter(
90            ObjectWidgetInputErrorView,
91            (MissingInputError, TestRequest),
92            IWidgetInputErrorView)
93
94        widget = self._WidgetFactory(self.field, self.request)
95        self.assertRaises(MissingInputError, widget.getInputValue)
96        error_html = widget.error()
97        if sys.version_info < (2, 5):
98            self.failUnless("email: <zope.formlib.interfaces.Mis"
99                             in error_html)
100            self.failUnless("name: <zope.formlib.interfaces.Miss"
101                             in error_html)
102        else:
103            self.failUnless("email: MissingInputError(u'field.foo.email', u'', None)"
104                             in error_html)
105            self.failUnless("name: MissingInputError(u'field.foo.name', u'', None)"
106                             in error_html)
107
108    def test_applyChangesNoChange(self):
109        self.content.foo = TestContact()
110        self.content.foo.name = u'Foo Name'
111        self.content.foo.email = u'foo@foo.test'
112
113        self.request.form['field.foo.name'] = u'Foo Name'
114        self.request.form['field.foo.email'] = u'foo@foo.test'
115        widget = self._WidgetFactory(self.field, self.request)
116        widget.setRenderedValue(self.content.foo)
117
118        self.assertEqual(widget.applyChanges(self.content), False)
119        self.assertEqual(hasattr(self.content, 'foo'), True)
120        self.assertEqual(isinstance(self.content.foo, TestContact), True)
121        self.assertEqual(self.content.foo.name, u'Foo Name')
122        self.assertEqual(self.content.foo.email, u'foo@foo.test')
123
124
125def test_suite():
126    return unittest.TestSuite((
127        unittest.makeSuite(ObjectWidgetTest),
128        #doctest.DocFileSuite('../objectwidget.txt',
129        #                     setUp=testing.setUp,
130        #                     tearDown=testing.tearDown),
131        doctest.DocTestSuite(),
132        ))
133
134if __name__=='__main__':
135    unittest.main(defaultTest='test_suite')
Note: See TracBrowser for help on using the repository browser.