[Checkins] SVN: zope.formlib/branches/faassen-zaf/src/zope/formlib/ Move browserwidget test from zope.app.form.

Martijn Faassen faassen at startifact.com
Wed Dec 30 16:07:07 EST 2009


Log message for revision 107391:
  Move browserwidget test from zope.app.form.
  

Changed:
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/support.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_browserwidget.py
  A   zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_exception.py
  U   zope.formlib/branches/faassen-zaf/src/zope/formlib/widget.py

-=-
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/support.py (from rev 107362, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/support.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/support.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/support.py	2009-12-30 21:07:06 UTC (rev 107391)
@@ -0,0 +1,34 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""General test support.
+
+$Id$
+"""
+
+class VerifyResults(object):
+    """Mix-in for test classes with helpers for checking string data."""
+
+    def verifyResult(self, result, check_list, inorder=False):
+        start = 0
+        for check in check_list:
+            pos = result.find(check, start)
+            self.assert_(pos >= 0,
+                         "%r not found in %r" % (check, result[start:]))
+            if inorder:
+                start = pos + len(check)
+
+    def verifyResultMissing(self, result, check_list):
+        for check in check_list:
+            self.assert_(result.find(check) < 0,
+                         "%r unexpectedly found in %r" % (check, result))

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_browserwidget.py (from rev 107373, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_browserwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_browserwidget.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_browserwidget.py	2009-12-30 21:07:06 UTC (rev 107391)
@@ -0,0 +1,214 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Test Browser Widget
+
+$Id$
+"""
+import unittest
+from zope.component.testing import PlacelessSetup
+from zope.interface import Interface, implements
+from zope.publisher.browser import TestRequest
+from zope.schema import Text, Int
+from zope.testing.doctest import DocTestSuite
+
+from zope.formlib.widget import SimpleInputWidget
+from zope.formlib.interfaces import ConversionError
+from zope.formlib.interfaces import WidgetInputError, MissingInputError
+
+from zope.formlib.tests import support
+
+class BrowserWidgetTest(PlacelessSetup,
+                        support.VerifyResults,
+                        unittest.TestCase):
+
+    _FieldFactory = Text
+    _WidgetFactory = None
+
+    def setUpContent(self, desc=u'', title=u'Foo Title'):
+        field = self._FieldFactory(
+            __name__='foo', title=title, description=desc)
+        class ITestContent(Interface):
+            foo = field
+        class TestObject:
+            implements(ITestContent)
+        self.content = TestObject()
+        field = ITestContent['foo']
+        field = field.bind(self.content)
+        request = TestRequest(HTTP_ACCEPT_LANGUAGE='ru')
+        request.form['field.foo'] = u'Foo Value'
+        self._widget = self._WidgetFactory(field, request)
+
+    def setUp(self):
+        super(BrowserWidgetTest, self).setUp()
+        self.setUpContent()
+
+
+class SimpleInputWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = SimpleInputWidget
+
+    def test_required(self):
+        # widget required defaults to its context required
+        self.assert_(self._widget.required)
+        self.assert_(self._widget.context.required)
+        # changing widget context required has no effect on widget required
+        self._widget.context.required = False
+        self.assert_(self._widget.required)
+        self.assert_(not self._widget.context.required)
+
+    def test_hasInput(self):
+        self.failUnless(self._widget.hasInput())
+        del self._widget.request.form['field.foo']
+        self.failIf(self._widget.hasInput())
+
+    def testProperties(self):
+        self.assertEqual(self._widget.tag, 'input')
+        self.assertEqual(self._widget.type, 'text')
+        self.assertEqual(self._widget.cssClass, '')
+        self.assertEqual(self._widget.extra, '')
+
+    def testRender(self, value=None, check_list=None):
+        if value is None:
+            value = 'Foo Value'
+        if check_list is None:
+            check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+                          'value="Foo Value"')
+        self._widget.setRenderedValue(value)
+        self.verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:]
+        self.verifyResult(self._widget.hidden(), check_list)
+        check_list = ('type="hidden"', 'style="color: red"') + check_list[1:]
+        self._widget.extra = 'style="color: red"'
+        self.verifyResult(self._widget.hidden(), check_list)
+
+    def testLabel(self):
+        self.setUpContent(title=u'Foo:')
+        self.assertEqual(self._widget.label, u'Foo:')
+
+    def testHint(self):
+        self.setUpContent(desc=u'Foo Description')
+        self.assertEqual(self._widget.hint, u'Foo Description')
+
+
+class TestWidget(SimpleInputWidget):
+
+    def _toFieldValue(self, v):
+        if v == u'barf!':
+            raise ConversionError('ralph')
+        return v or None
+
+class Test(BrowserWidgetTest):
+
+    _WidgetFactory = TestWidget
+
+    def test_getFormValue(self):
+
+        class W(SimpleInputWidget):
+            def _toFieldValue(self, v):
+                return u'X' + (v or '')
+
+            def _toFormValue(self, v):
+                return v and v[1:] or ''
+
+        field = Text(__name__ = 'foo', title = u"Foo Title")
+        request = TestRequest()
+
+        w = W(field, request)
+        self.assertEqual(w._getFormValue(), '')
+        request.form['field.foo'] = 'val'
+        self.assertEqual(w._getFormValue(), 'val')
+
+        w.setRenderedValue('Xfoo')
+        self.assertEqual(w._getFormValue(), 'foo')
+
+    def test_hasValidInput(self):
+        self.assertEqual(self._widget.getInputValue(), u'Foo Value')
+
+        self._widget.request.form['field.foo'] = (1, 2)
+        self.failIf(self._widget.hasValidInput())
+
+        self._widget.request.form['field.foo'] = u'barf!'
+        self.failIf(self._widget.hasValidInput())
+
+        del self._widget.request.form['field.foo']
+        self._widget.context.required = True
+        self.failIf(self._widget.hasValidInput())
+
+        self._widget.context.required = False
+        self._widget.request.form['field.foo'] = u''
+        self.failUnless(self._widget.hasValidInput())
+
+    def test_getInputValue(self):
+        self.assertEqual(self._widget.getInputValue(), u'Foo Value')
+
+        self._widget.request.form['field.foo'] = (1, 2)
+        self.assertRaises(WidgetInputError, self._widget.getInputValue)
+
+        self._widget.request.form['field.foo'] = u'barf!'
+        self.assertRaises(ConversionError, self._widget.getInputValue)
+
+        del self._widget.request.form['field.foo']
+        self._widget.context.required = True
+        self.assertRaises(MissingInputError, self._widget.getInputValue)
+
+        self._widget.context.required = False
+        self._widget.request.form['field.foo'] = u''
+        self.assertEqual(self._widget.getInputValue(), None)
+
+    def test_applyChanges(self):
+        self.assertEqual(self._widget.applyChanges(self.content), True)
+
+    def test_hasInput(self):
+        self.failUnless(self._widget.hasInput())
+        del self._widget.request.form['field.foo']
+        self.failIf(self._widget.hasInput())
+        self._widget.request.form['field.foo'] = u'foo'
+        self.failUnless(self._widget.hasInput())
+        # widget has input, even if input is an empty string
+        self._widget.request.form['field.foo'] = u''
+        self.failUnless(self._widget.hasInput())
+
+    def test_getFormValue_w_default(self):
+        field = Text(__name__ = 'foo', title = u"Foo Title", default=u"def")
+        request = TestRequest()
+        widget = self._WidgetFactory(field, request)
+        self.assertEqual(widget._getFormValue(), u'def')
+
+    def test_getFormValue_preserves_errors(self):
+        field = Int(__name__ = 'foo', title = u"Foo Title", default=42)
+        request = TestRequest()
+        widget = self._WidgetFactory(field, request)
+
+        # Sometimes you want to set a custom error on a widget.
+        widget._error = 'my error'
+
+        # _getFormValue shouldn't replace it.
+        request.form['field.foo'] = u'barf!'
+        widget._getFormValue()
+        self.assertEquals(widget._error, 'my error')
+
+        # _getFormValue shouldn't clear it either
+        request.form['field.foo'] = 33
+        widget._getFormValue()
+        self.assertEquals(widget._error, 'my error')
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Test))
+    suite.addTest(DocTestSuite("zope.formlib.widget"))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_exception.py (from rev 107362, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_exception.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_exception.py	                        (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_exception.py	2009-12-30 21:07:06 UTC (rev 107391)
@@ -0,0 +1,27 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Exception Views tests
+
+$Id$
+"""
+import unittest
+from zope.testing.doctest import DocTestSuite
+
+def test_suite():
+    return unittest.TestSuite((
+        DocTestSuite('zope.formlib.exception'),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Modified: zope.formlib/branches/faassen-zaf/src/zope/formlib/widget.py
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/widget.py	2009-12-30 20:47:46 UTC (rev 107390)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/widget.py	2009-12-30 21:07:06 UTC (rev 107391)
@@ -19,10 +19,11 @@
 
 from xml.sax.saxutils import quoteattr, escape
 
-from zope.component import getMultiAdapter
+from zope.component import getMultiAdapter, provideAdapter
 from zope.interface import implements
 from zope.schema.interfaces import ValidationError
 from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
 from zope.formlib.interfaces import ConversionError
 from zope.formlib.interfaces import WidgetInputError, MissingInputError
@@ -174,10 +175,10 @@
         ...         self.context = context
         ...     def snippet(self):
         ...         return "The error: " + str(self.context.errors)
-        >>> from zope.app.testing import ztapi
-        >>> ztapi.browserViewProviding(IWidgetInputError, SnippetErrorView,
-        ...                            IWidgetInputErrorView)
-
+        >>> provideAdapter(SnippetErrorView,
+        ...                (IWidgetInputError, IDefaultBrowserLayer),
+        ...                IWidgetInputErrorView, '')
+        
     Whever an error occurs, widgets should set _error:
 
         >>> widget._error = WidgetInputError('foo', 'Foo', ('Err1', 'Err2'))



More information about the checkins mailing list