[Zope3-checkins] SVN: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_ Move over more widget tests from zope.app.form.
Martijn Faassen
faassen at startifact.com
Wed Dec 30 16:41:42 EST 2009
Log message for revision 107394:
Move over more widget tests from zope.app.form.
Changed:
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py
A zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py
-=-
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_checkboxwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_checkboxwidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,180 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Checkbox Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import CheckBoxWidget
+from zope.publisher.browser import TestRequest
+from zope.schema import Bool
+from zope.interface.verify import verifyClass
+
+from zope.formlib.interfaces import MissingInputError
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+
+
+class CheckBoxWidgetTest(SimpleInputWidgetTest):
+ """Documents and tests thec checkbox widget.
+
+ >>> verifyClass(IInputWidget, CheckBoxWidget)
+ True
+
+ The checkbox widget works with Bool fields:
+
+ >>> field = Bool(__name__='foo', title=u'on')
+ >>> request = TestRequest()
+ >>> widget = CheckBoxWidget(field, request)
+
+ hasInput returns True when the request contains the field.<name>.used
+ value:
+
+ >>> 'field.foo.used' in request.form
+ False
+ >>> widget.hasInput()
+ False
+ >>> request.form['field.foo.used'] = ''
+ >>> widget.hasInput()
+ True
+
+ getInputValue returns True when field.<name> equals (and only equals) 'on':
+
+ >>> 'field.foo' in request.form
+ False
+ >>> widget.getInputValue()
+ False
+ >>> request.form['field.foo'] = 'true'
+ >>> widget.getInputValue()
+ False
+ >>> request.form['field.foo'] = 'on'
+ >>> widget.getInputValue()
+ True
+
+ Below is HTML output of rendered checkbox widgets. We will first define
+ a helper method condense the HTML output for display in this test:
+
+ >>> def normalize(s):
+ ... return '\\n '.join(s.split())
+
+ Default widget rendering:
+
+ >>> print normalize( widget() )
+ <input
+ class="hiddenType"
+ id="field.foo.used"
+ name="field.foo.used"
+ type="hidden"
+ value=""
+ />
+ <input
+ class="checkboxType"
+ checked="checked"
+ id="field.foo"
+ name="field.foo"
+ type="checkbox"
+ value="on"
+ />
+
+ Hidden rendering:
+
+ >>> print normalize( widget.hidden() )
+ <input
+ class="hiddenType"
+ id="field.foo"
+ name="field.foo"
+ type="hidden"
+ value="on"
+ />
+
+ Calling setRenderedValue will change what gets output:
+
+ >>> widget.setRenderedValue(False)
+ >>> print normalize( widget() )
+ <input
+ class="hiddenType"
+ id="field.foo.used"
+ name="field.foo.used"
+ type="hidden"
+ value=""
+ />
+ <input
+ class="checkboxType"
+ id="field.foo"
+ name="field.foo"
+ type="checkbox"
+ value="on"
+ />
+
+ The checkbox widget does not support None values, so a Bool required
+ constraint will always be met with checkbox input:
+
+ >>> field.required = True
+ >>> widget.getInputValue()
+ True
+ """
+
+ _FieldFactory = Bool
+ _WidgetFactory = CheckBoxWidget
+
+ def testProperties(self):
+ self.assertEqual(self._widget.tag, 'input')
+ self.assertEqual(self._widget.type, 'checkbox')
+ self.assertEqual(self._widget.cssClass, '')
+ self.assertEqual(self._widget.extra, '')
+ self.assertEqual(self._widget.default, 0)
+
+ def testRender(self):
+ value = 1
+ self._widget.setRenderedValue(value)
+ check_list = ('type="checkbox"', 'id="field.foo"',
+ 'name="field.foo"', 'checked="checked"')
+ self.verifyResult(self._widget(), check_list)
+ value = 0
+ self._widget.setRenderedValue(value)
+ check_list = check_list[:-1]
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('type="hidden"',) + check_list[1:-1]
+ self.verifyResult(self._widget.hidden(), check_list)
+ check_list = ('style="color: red"',) + check_list
+ self._widget.extra = 'style="color: red"'
+ self.verifyResult(self._widget.hidden(), check_list)
+
+ def test_getInputValue(self):
+ self._widget.request.form['field.foo'] = 'on'
+ self.assertEqual(self._widget.getInputValue(), True)
+ self._widget.request.form['field.foo'] = 'positive'
+ self.assertEqual(self._widget.getInputValue(), False)
+ del self._widget.request.form['field.foo']
+ self._widget.request.form['field.foo.used'] = ''
+ self.assertEquals(self._widget.getInputValue(), False)
+ del self._widget.request.form['field.foo.used']
+ self.assertRaises(MissingInputError, self._widget.getInputValue)
+
+ def test_required(self):
+ # checkbox widgets are never required, since there's no way to
+ # set it to "no value"
+ self.failIf(self._widget.required)
+ self.assert_(self._widget.context.required)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(CheckBoxWidgetTest),
+ doctest.DocTestSuite(),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_filewidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_filewidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,83 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""File Widget tests
+
+$Id$
+"""
+import unittest
+
+from zope.testing import doctest
+from StringIO import StringIO
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import FileWidget
+
+from zope.formlib.tests.test_browserwidget import (
+ SimpleInputWidgetTest)
+
+from zope.interface.verify import verifyClass
+
+
+class FileWidgetTest(SimpleInputWidgetTest):
+ """Documents and tests the file widget.
+
+ >>> verifyClass(IInputWidget, FileWidget)
+ True
+ """
+
+ _WidgetFactory = FileWidget
+
+ def setUp(self):
+ super(FileWidgetTest, self).setUp()
+ file = StringIO('Foo Value')
+ file.filename = 'test.txt'
+ self._widget.request.form['field.foo'] = file
+
+ def testProperties(self):
+ self.assertEqual(self._widget.tag, 'input')
+ self.assertEqual(self._widget.type, 'file')
+ self.assertEqual(self._widget.cssClass, '')
+ self.assertEqual(self._widget.extra, '')
+ self.assertEqual(self._widget.default, '')
+ self.assertEqual(self._widget.displayWidth, 20)
+ self.assertEqual(self._widget.displayMaxWidth, '')
+
+ def test_hasInput(self): # override the usual one
+ del self._widget.request.form['field.foo']
+ self._widget.request.form['field.foo.used'] = ''
+ self.failUnless(self._widget.hasInput())
+ del self._widget.request.form['field.foo.used']
+ self.failIf(self._widget.hasInput())
+
+ def testRender(self):
+ value = 'Foo Value'
+ self._widget.setRenderedValue(value)
+ check_list = ('type="file"', 'id="field.foo"', 'name="field.foo"',
+ 'size="20"')
+
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('type="hidden"',) + check_list[1:-1]
+ self.verifyResult(self._widget.hidden(), check_list)
+ check_list = ('style="color: red"',) + check_list
+ self._widget.extra = 'style="color: red"'
+ self.verifyResult(self._widget.hidden(), check_list)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(FileWidgetTest),
+ doctest.DocTestSuite(),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_floatwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_floatwidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,64 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Float Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import FloatWidget
+from zope.formlib.interfaces import ConversionError, WidgetInputError
+from zope.interface.verify import verifyClass
+
+from zope.schema import Float
+
+
+class FloatWidgetTest(SimpleInputWidgetTest):
+ """Documents and tests the float widget.
+
+ >>> verifyClass(IInputWidget, FloatWidget)
+ True
+ """
+
+ _FieldFactory = Float
+ _WidgetFactory = FloatWidget
+
+ def test_hasInput(self):
+ del self._widget.request.form['field.foo']
+ self.failIf(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())
+ self._widget.request.form['field.foo'] = u'123'
+ self.failUnless(self._widget.hasInput())
+
+ def test_getInputValue(self):
+ self._widget.request.form['field.foo'] = u''
+ self.assertRaises(WidgetInputError, self._widget.getInputValue)
+ self._widget.request.form['field.foo'] = u'123.45'
+ self.assertEquals(self._widget.getInputValue(), 123.45)
+ self._widget.request.form['field.foo'] = u'abc'
+ self.assertRaises(ConversionError, self._widget.getInputValue)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(FloatWidgetTest),
+ doctest.DocTestSuite(),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py (from rev 107362, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_selectwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_selectwidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,79 @@
+##############################################################################
+#
+# Copyright (c) 2004 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.
+#
+##############################################################################
+"""Select Widget Tests
+
+$Id$
+"""
+import unittest
+
+from zope.schema import Choice, List
+from zope.formlib.widgets import SelectWidget
+from zope.publisher.browser import TestRequest
+
+choice = Choice(
+ title=u"Number",
+ description=u"The Number",
+ values=[1, 2, 3])
+
+sequence = List(
+ title=u"Numbers",
+ description=u"The Numbers",
+ value_type=choice)
+
+
+class SelectWidgetTest(unittest.TestCase):
+
+ def _makeWidget(self, form):
+ request = TestRequest(form=form)
+ return SelectWidget(sequence, choice.vocabulary, request)
+
+
+select_html = '''<div>
+<div class="value">
+<select id="field.terms" name="field.terms" size="5" >
+<option value="< foo">< foo</option>
+<option value="bar/>">bar/></option>
+<option value="&blah&">&blah&</option>
+</select>
+</div>
+<input name="field.terms-empty-marker" type="hidden" value="1" />
+</div>'''
+
+class SelectWidgetHTMLEncodingTest(unittest.TestCase):
+
+ def testOptionEncoding(self):
+ choice = Choice(
+ title=u"Number",
+ description=u"The Number",
+ values=['< foo', 'bar/>', '&blah&'])
+
+ sequence = List(
+ __name__="terms",
+ title=u"Numbers",
+ description=u"The Numbers",
+ value_type=choice)
+
+ request = TestRequest()
+ sequence = sequence.bind(object())
+ widget = SelectWidget(sequence, choice.vocabulary, request)
+ self.assertEqual(widget(), select_html)
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(SelectWidgetTest),
+ unittest.makeSuite(SelectWidgetHTMLEncodingTest)
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest="test_suite")
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_sequencewidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_sequencewidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,443 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Sequence Field Widget tests.
+
+$Id$
+"""
+import unittest
+from zope.interface import Interface, implements
+from zope.schema import Tuple, List, TextLine
+from zope.schema.interfaces import ITextLine
+from zope.component import provideAdapter
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.testing import doctest
+
+from zope.formlib.widgets import TextWidget, ObjectWidget, DisplayWidget
+from zope.formlib.widgets import TupleSequenceWidget, ListSequenceWidget
+from zope.formlib.widgets import SequenceDisplayWidget
+from zope.formlib.widgets import SequenceWidget
+from zope.formlib.interfaces import IDisplayWidget
+from zope.formlib.interfaces import IInputWidget, MissingInputError
+from zope.formlib.interfaces import IWidgetInputError, WidgetInputError
+from zope.formlib.interfaces import IWidgetInputErrorView
+from zope.formlib.widget import CustomWidgetFactory
+from zope.formlib.exception import WidgetInputErrorView
+
+from zope.formlib.tests.support import VerifyResults
+from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
+
+from zope.traversing.testing import setUp as traversingSetUp
+from zope.testing.cleanup import tearDown as traversingTearDown
+
+class SequenceWidgetTestHelper(object):
+
+ def setUpContent(self, desc=u'', title=u'Foo Title'):
+ class ITestContent(Interface):
+ foo = self._FieldFactory(
+ title=title,
+ description=desc,
+ )
+ class TestObject(object):
+ implements(ITestContent)
+
+ self.content = TestObject()
+ self.field = ITestContent['foo'].bind(self.content)
+ self.request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
+ self.request.form['field.foo'] = u'Foo Value'
+ self._widget = self._WidgetFactory(
+ self.field, self.field.value_type, self.request)
+
+ def setUp(self):
+ traversingSetUp()
+ self.setUpContent()
+
+ def tearDown(self):
+ traversingTearDown()
+
+ def _FieldFactory(self, **kw):
+ kw.update({
+ '__name__': u'foo',
+ 'value_type': TextLine(__name__=u'bar')})
+ return Tuple(**kw)
+
+
+class SequenceWidgetTest(SequenceWidgetTestHelper, BrowserWidgetTest):
+ """Documents and tests the tuple and list (sequence) widgets.
+
+ >>> from zope.interface.verify import verifyClass
+ >>> verifyClass(IInputWidget, TupleSequenceWidget)
+ True
+ >>> verifyClass(IInputWidget, ListSequenceWidget)
+ True
+ """
+
+ _WidgetFactory = TupleSequenceWidget
+
+ def testRender(self):
+ pass
+
+ def setUp(self):
+ super(SequenceWidgetTest, self).setUp()
+ provideAdapter(TextWidget,
+ (ITextLine, IDefaultBrowserLayer),
+ IInputWidget, '')
+ provideAdapter(WidgetInputErrorView,
+ (IWidgetInputError, IDefaultBrowserLayer),
+ IWidgetInputErrorView, '')
+
+ def test_haveNoData(self):
+ self.failIf(self._widget.hasInput())
+
+ def test_hasInput(self):
+ self._widget.request.form['field.foo.count'] = u'0'
+ self.failUnless(self._widget.hasInput())
+
+ def test_customWidgetFactory(self):
+ """Verify that the widget can be constructed via the CustomWidgetFactory
+ (Issue #293)
+ """
+
+ value_type = TextLine(__name__=u'bar')
+ self.field = List( __name__=u'foo', value_type=value_type )
+ request = TestRequest()
+
+ # set up the custom widget factory and verify that it works
+ sw = CustomWidgetFactory(ListSequenceWidget)
+ widget = sw(self.field, request)
+ assert widget.subwidget is None
+ assert widget.context.value_type is value_type
+
+ # set up a variant that specifies the subwidget to use and verify it
+ class PollOption(object) : pass
+ ow = CustomWidgetFactory(ObjectWidget, PollOption)
+ sw = CustomWidgetFactory(ListSequenceWidget, subwidget=ow)
+ widget = sw(self.field, request)
+ assert widget.subwidget is ow
+ assert widget.context.value_type is value_type
+
+ def test_subwidget(self):
+ """This test verifies that the specified subwidget is not ignored.
+ (Issue #293)
+ """
+ self.field = List(__name__=u'foo',
+ value_type=TextLine(__name__=u'bar'))
+ request = TestRequest()
+
+ class PollOption(object) : pass
+ ow = CustomWidgetFactory(ObjectWidget, PollOption)
+ widget = SequenceWidget(
+ self.field, self.field.value_type, request, subwidget=ow)
+ assert widget.subwidget is ow
+
+ def test_list(self):
+ self.field = List(
+ __name__=u'foo',
+ value_type=TextLine(__name__=u'bar'))
+ request = TestRequest()
+ widget = ListSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.failIf(widget.hasInput())
+ self.assertRaises(MissingInputError, widget.getInputValue)
+
+ request = TestRequest(form={'field.foo.add': u'Add bar',
+ 'field.foo.count': u'0'})
+ widget = ListSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.assert_(widget.hasInput())
+ self.assertRaises(WidgetInputError, widget.getInputValue)
+
+ request = TestRequest(form={'field.foo.0.bar': u'Hello world!',
+ 'field.foo.count': u'1'})
+ widget = ListSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.assert_(widget.hasInput())
+ self.assertEquals(widget.getInputValue(), [u'Hello world!'])
+
+ def test_new(self):
+ request = TestRequest()
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.failIf(widget.hasInput())
+ self.assertRaises(MissingInputError, widget.getInputValue)
+ check_list = ('input', 'name="field.foo.add"')
+ self.verifyResult(widget(), check_list)
+
+ def test_add(self):
+ request = TestRequest(form={'field.foo.add': u'Add bar',
+ 'field.foo.count': u'0'})
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.assert_(widget.hasInput())
+ self.assertRaises(WidgetInputError, widget.getInputValue)
+ check_list = (
+ 'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+ 'submit', 'submit', 'field.foo.add'
+ )
+ self.verifyResult(widget(), check_list, inorder=True)
+
+ def test_request(self):
+ request = TestRequest(form={'field.foo.0.bar': u'Hello world!',
+ 'field.foo.count': u'1'})
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ self.assert_(widget.hasInput())
+ self.assertEquals(widget.getInputValue(), (u'Hello world!',))
+
+ def test_existing(self):
+ request = TestRequest()
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ widget.setRenderedValue((u'existing',))
+ self.failIf(widget.hasInput())
+ self.assertRaises(MissingInputError, widget.getInputValue)
+ check_list = (
+ 'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+ 'existing',
+ 'submit', 'submit', 'field.foo.add',
+ 'field.foo.count" value="1"',
+ )
+ self.verifyResult(widget(), check_list, inorder=True)
+ widget.setRenderedValue((u'existing', u'second'))
+ self.failIf(widget.hasInput())
+ self.assertRaises(MissingInputError, widget.getInputValue)
+ check_list = (
+ 'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+ 'existing',
+ 'checkbox', 'field.foo.remove_1', 'input', 'field.foo.1.bar',
+ 'second',
+ 'submit', 'submit', 'field.foo.add',
+ 'field.foo.count" value="2"',
+ )
+ self.verifyResult(widget(), check_list, inorder=True)
+
+ def test_remove(self):
+ request = TestRequest(form={
+ 'field.foo.remove_0': u'1',
+ 'field.foo.0.bar': u'existing', 'field.foo.1.bar': u'second',
+ 'field.foo.remove': u'Remove selected items',
+ 'field.foo.count': u'2'})
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ widget.setRenderedValue((u'existing', u'second'))
+ self.assertEquals(widget.getInputValue(), (u'second',))
+ check_list = (
+ 'checkbox', 'field.foo.remove_0', 'input', 'field.foo.0.bar',
+ 'existing',
+ 'checkbox', 'field.foo.remove_1', 'input', 'field.foo.1.bar',
+ 'second',
+ 'submit', 'submit', 'field.foo.add',
+ 'field.foo.count" value="2"',
+ )
+ self.verifyResult(widget(), check_list, inorder=True)
+
+ def test_min(self):
+ request = TestRequest()
+ self.field.min_length = 2
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ widget.setRenderedValue((u'existing',))
+ self.assertRaises(MissingInputError, widget.getInputValue)
+ check_list = (
+ 'input', 'field.foo.0.bar', 'existing',
+ 'input', 'field.foo.1.bar', 'value=""',
+ 'submit', 'field.foo.add'
+ )
+ s = widget()
+ self.verifyResult(s, check_list, inorder=True)
+ self.assertEquals(s.find('checkbox'), -1)
+
+ def test_max(self):
+ request = TestRequest()
+ self.field.max_length = 1
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ widget.setRenderedValue((u'existing',))
+ self.assertRaises(MissingInputError, widget.getInputValue)
+ s = widget()
+ self.assertEquals(s.find('field.foo.add'), -1)
+
+ def test_anonymousfield(self):
+ self.field = Tuple(__name__=u'foo', value_type=TextLine())
+ request = TestRequest()
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ widget.setRenderedValue((u'existing',))
+ s = widget()
+ check_list = (
+ 'input', '"field.foo.0."', 'existing',
+ 'submit', 'submit', 'field.foo.add'
+ )
+ s = widget()
+ self.verifyResult(s, check_list, inorder=True)
+
+ def test_usererror(self):
+ self.field = Tuple(__name__=u'foo',
+ value_type=TextLine(__name__='bar'))
+ request = TestRequest(form={
+ 'field.foo.0.bar': u'', 'field.foo.1.bar': u'nonempty',
+ 'field.foo.count': u'2'})
+ widget = TupleSequenceWidget(
+ self.field, self.field.value_type, request)
+ s = widget()
+ # Rendering a widget should not raise errors!
+ result = widget()
+
+ data = widget._generateSequence()
+ self.assertEquals(data, [None, u'nonempty'])
+
+ def doctest_widgeterrors(self):
+ """Test that errors on subwidgets appear
+
+ >>> field = Tuple(__name__=u'foo',
+ ... value_type=TextLine(__name__='bar'))
+ >>> request = TestRequest(form={
+ ... 'field.foo.0.bar': u'',
+ ... 'field.foo.1.bar': u'nonempty',
+ ... 'field.foo.count': u'2'})
+ >>> widget = TupleSequenceWidget(field, field.value_type, request)
+
+ If we render the widget, we see no errors:
+
+ >>> print widget()
+ <BLANKLINE>
+ ...
+ <tr>
+ <td>
+ <input class="editcheck" type="checkbox"
+ name="field.foo.remove_0" />
+ </td>
+ <td>
+ <input class="textType" id="field.foo.0.bar"
+ name="field.foo.0.bar"
+ size="20" type="text" value="" />
+ </td>
+ </tr>
+ ...
+
+ However, if we call getInputValue or hasValidInput, the
+ errors on the widgets are preserved and displayed:
+
+ >>> widget.hasValidInput()
+ False
+
+ >>> print widget()
+ <BLANKLINE>
+ ...
+ <tr>
+ <td>
+ <input class="editcheck" type="checkbox"
+ name="field.foo.remove_0" />
+ </td>
+ <td>
+ <span class="error">Required input is missing.</span>
+ <input class="textType" id="field.foo.0.bar"
+ name="field.foo.0.bar"
+ size="20" type="text" value="" />
+ </td>
+ </tr>
+ ...
+ """
+
+
+class SequenceDisplayWidgetTest(
+ VerifyResults, SequenceWidgetTestHelper, unittest.TestCase):
+
+ def _WidgetFactory(self, *args, **kw):
+ w = SequenceDisplayWidget(*args, **kw)
+ w.cssClass = "testwidget"
+ return w
+
+ def setUp(self):
+ self.setUpContent()
+ self.request = TestRequest()
+ self.widget = self._WidgetFactory(
+ self.field, self.field.value_type, self.request)
+ provideAdapter(DisplayWidget, (ITextLine, IDefaultBrowserLayer),
+ IDisplayWidget)
+
+ def test_render_empty(self):
+ self.content.foo = ()
+ self.assertEquals(self.widget(), '(no values)')
+
+ def test_render_missing(self):
+ self.content.foo = self.field.missing_value
+ self.assertEquals(self.widget(), '(no value available)')
+
+ def test_render_single(self):
+ self.content.foo = (u'one value',)
+ check_list = ['<ol', 'class=', 'testwidget',
+ '<li', 'one value', '</li', '</ol']
+ self.verifyResult(self.widget(), check_list, inorder=True)
+
+ def test_render_multiple(self):
+ self.content.foo = (u'one', u'two', u'three', u'four')
+ check_list = ['<ol', 'class=', 'testwidget',
+ '<li', 'one', '</li',
+ '<li', 'two', '</li',
+ '<li', 'three', '</li',
+ '<li', 'four', '</li',
+ '</ol']
+ self.verifyResult(self.widget(), check_list, inorder=True)
+
+ def test_render_alternate_cssClass(self):
+ self.content.foo = (u'one value',)
+ check_list = ['<ol', 'class=', 'altclass',
+ '<li', 'one value', '</li', '</ol']
+ self.widget.cssClass = 'altclass'
+ self.verifyResult(self.widget(), check_list, inorder=True)
+
+ def test_honors_subwidget(self):
+ self.widget = self._WidgetFactory(
+ self.field, self.field.value_type, self.request,
+ subwidget=UppercaseDisplayWidget)
+ self.content.foo = (u'first value', u'second value')
+ check_list = ['<ol', 'class=', 'testwidget',
+ '<li', 'FIRST VALUE', '</li',
+ '<li', 'SECOND VALUE', '</li',
+ '</ol']
+ self.verifyResult(self.widget(), check_list, inorder=True)
+
+
+class UppercaseDisplayWidget(DisplayWidget):
+
+ def __call__(self):
+ return super(UppercaseDisplayWidget, self).__call__().upper()
+
+
+def setUp(test):
+ traversingSetUp()
+ provideAdapter(TextWidget,
+ (ITextLine, IDefaultBrowserLayer),
+ IInputWidget)
+ provideAdapter(WidgetInputErrorView,
+ (IWidgetInputError, IDefaultBrowserLayer),
+ IWidgetInputErrorView)
+
+def tearDown(test):
+ traversingTearDown()
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(SequenceWidgetTest),
+ doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.ELLIPSIS
+ |doctest.NORMALIZE_WHITESPACE
+ |doctest.REPORT_NDIFF),
+ unittest.makeSuite(SequenceDisplayWidgetTest),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_textareawidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textareawidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,63 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Textarea Widget tests
+
+$Id$
+"""
+import unittest
+from zope.testing import doctest
+from zope.formlib.interfaces import IInputWidget
+from zope.formlib.widgets import TextAreaWidget
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+from zope.interface.verify import verifyClass
+
+class TextAreaWidgetTest(SimpleInputWidgetTest):
+ """Documents and tests the text area widget.
+
+ >>> verifyClass(IInputWidget, TextAreaWidget)
+ True
+ """
+
+ _WidgetFactory = TextAreaWidget
+
+ 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, '')
+ self.assertEqual(self._widget.width, 60)
+ self.assertEqual(self._widget.height, 15)
+
+ def testRender(self):
+ value = "Foo Value"
+ self._widget.setRenderedValue(value)
+ check_list = ('rows="15"', 'cols="60"', 'id="field.foo"',
+ 'name="field.foo"', 'textarea')
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('style="color: red"',) + check_list
+ self._widget.extra = 'style="color: red"'
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('type="hidden"', 'id="field.foo"', 'name="field.foo"',
+ 'value="Foo Value"')
+ self.verifyResult(self._widget.hidden(), check_list)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(TextAreaWidgetTest),
+ doctest.DocTestSuite(),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
Copied: zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py (from rev 107392, zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_textwidget.py)
===================================================================
--- zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py (rev 0)
+++ zope.formlib/branches/faassen-zaf/src/zope/formlib/tests/test_textwidget.py 2009-12-30 21:41:42 UTC (rev 107394)
@@ -0,0 +1,476 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002, 2004, 2005 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.
+#
+##############################################################################
+"""Text Widget tests
+
+$Id$
+"""
+import datetime
+import unittest
+from zope.testing import doctest
+from zope.component.testing import setUp, tearDown
+from zope.interface.verify import verifyClass
+from zope.schema import TextLine
+from zope.publisher.browser import TestRequest
+
+from zope.schema import Password
+from zope.formlib.interfaces import IInputWidget
+
+from zope.formlib.widgets import TextWidget
+
+from zope.formlib.widgets import TextAreaWidget
+from zope.formlib.widgets import BytesAreaWidget
+from zope.formlib.widgets import PasswordWidget
+from zope.formlib.widgets import FileWidget
+from zope.formlib.widgets import IntWidget
+from zope.formlib.widgets import FloatWidget
+from zope.formlib.widgets import BytesWidget
+from zope.formlib.widgets import ASCIIWidget
+
+from zope.formlib.widgets import DateDisplayWidget
+from zope.formlib.widgets import DatetimeDisplayWidget
+from zope.formlib.widgets import URIDisplayWidget
+
+from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
+from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
+
+class TextWidgetTest(SimpleInputWidgetTest):
+ """Documents and tests the text widget.
+ >>> setUp()
+
+ >>> verifyClass(IInputWidget, TextWidget)
+ True
+
+ Converting Missing Values
+ -------------------------
+ String fields (TextLine, Text, etc.) values can be classified as one of the
+ following:
+
+ - Non-empty string
+ - Empty string
+ - None
+
+ Text browser widgets only support the first two types: non-empty strings
+ and empty strings. There's no facility to explicitly set a None value in a
+ text browser widget.
+
+ However, it is possible to interpret an empty string as None for some
+ applications. For example, when inputing a User Name, an empty string means
+ 'the user hasn't provided a value'. In another application, an empty string
+ may mean 'the user has provided a value, specifically <empty string>'.
+
+ To support both modes, the text widget provides a 'convert_missing_value'
+ flag. When True, empty strings will be converted by the widget to the
+ field's 'missing_value' (None by default). This mode accommodates the
+ 'user hasn't provided a value' scenario.
+
+ To illustrate this mode, we'll use an optional field, where missing_value
+ is None:
+
+ >>> field = TextLine(
+ ... __name__='foo',
+ ... missing_value=None,
+ ... required=False)
+
+ The HTTP form submission contains an empty string for the field value:
+
+ >>> request = TestRequest(form={'field.foo':u''})
+
+ A text widget configured for the field, where convert_missing_value is True
+ (the default value)...
+
+ >>> widget = TextWidget(field, request)
+ >>> widget.convert_missing_value
+ True
+
+ will convert the form's empty string into the field's missing_value, which
+ is None:
+
+ >>> widget.getInputValue() is None
+ True
+
+ When 'convert_missing_value' is False, the text widget will not convert
+ an empty string to the field's missing_value. This supports the 'user has
+ provided a value, specifically <empty string>' mode:
+
+ >>> widget.convert_missing_value = False
+ >>> widget.getInputValue()
+ u''
+
+ >>> tearDown()
+ """
+
+ _WidgetFactory = TextWidget
+
+ 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, '')
+ self.assertEqual(self._widget.default, '')
+ self.assertEqual(self._widget.displayWidth, 20)
+ self.assertEqual(self._widget.displayMaxWidth, '')
+
+ def testRender(self):
+ value = 'Foo Value'
+ self._widget.setRenderedValue(value)
+ check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+ 'value="Foo Value"', 'size="20"')
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('type="hidden"',) + check_list[1:-1]
+ self.verifyResult(self._widget.hidden(), check_list)
+ check_list = ('style="color: red"',) + check_list
+ self._widget.extra = 'style="color: red"'
+ self.verifyResult(self._widget.hidden(), check_list)
+
+class URIDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = URIDisplayWidget
+
+ def testProperties(self):
+ # check the default linkTarget
+ self.failIf(self._widget.linkTarget)
+
+ def testRender(self):
+ value = "uri:fake"
+ self._widget.setRenderedValue(value)
+ self.verifyResult(self._widget(), ["<a", 'href="uri:fake"'])
+ self._widget.linkTarget = "there"
+ self.verifyResult(self._widget(), ["<a", 'href="uri:fake"',
+ 'target="there"'])
+
+ def testEmptyRenderReturnsEmptyString(self):
+ self._widget.setRenderedValue(None)
+ self.assertEquals(self._widget(), "")
+ self._widget.setRenderedValue('')
+ self.assertEquals(self._widget(), "")
+
+
+class DateDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = DateDisplayWidget
+
+ expected_class = "date"
+
+ def setUp(self):
+ super(DateDisplayWidgetTest, self).setUp()
+ self._value = datetime.date(2004, 12, 01)
+
+ def testDefaultDisplayStyle(self):
+ self.failIf(self._widget.displayStyle)
+
+ def testRenderDefault(self):
+ self._widget.setRenderedValue(self._value)
+ self.verifyResult(self._widget(),
+ ["<span",
+ 'class="%s"' % self.expected_class,
+ "01.12.2004",
+ "</span"])
+
+ def testRenderShort(self):
+ self._widget.setRenderedValue(self._value)
+ self._widget.displayStyle = "short"
+ self.verifyResult(self._widget(),
+ ["<span",
+ 'class="%s"' % self.expected_class,
+ u"01.12.04",
+ "</span"])
+
+ def testRenderMedium(self):
+ self._widget.setRenderedValue(self._value)
+ self._widget.displayStyle = "medium"
+ self.verifyResult(self._widget(),
+ ["<span",
+ 'class="%s"' % self.expected_class,
+ u"01.12.2004",
+ "</span"])
+
+ def testRenderLong(self):
+ self._widget.setRenderedValue(self._value)
+ self._widget.displayStyle = "long"
+ self.verifyResult(self._widget(),
+ ["<span",
+ 'class="%s"' % self.expected_class,
+ u"1 \u0434\u0435\u043a\u0430\u0431\u0440\u044f"
+ u" 2004 \u0433.",
+ "</span"])
+
+ def testRenderFull(self):
+ self._widget.setRenderedValue(self._value)
+ self._widget.displayStyle = "full"
+ self.verifyResult(self._widget(),
+ ["<span",
+ 'class="%s"' % self.expected_class,
+ u"1 \u0434\u0435\u043a\u0430\u0431\u0440\u044f"
+ u" 2004 \u0433.",
+ "</span"])
+
+
+class DatetimeDisplayWidgetTest(DateDisplayWidgetTest):
+
+ _WidgetFactory = DatetimeDisplayWidget
+
+ expected_class = "dateTime"
+
+ def setUp(self):
+ super(DatetimeDisplayWidgetTest, self).setUp()
+ self._value = datetime.datetime(2004, 12, 01, 14, 39, 01)
+
+ def testRenderDefault(self):
+ super(DatetimeDisplayWidgetTest, self).testRenderDefault()
+ self.verifyResult(self._widget(), ["14:39:01"])
+
+ def testRenderShort(self):
+ super(DatetimeDisplayWidgetTest, self).testRenderShort()
+ self.verifyResult(self._widget(), ["14:39"])
+
+ def testRenderMedium(self):
+ super(DatetimeDisplayWidgetTest, self).testRenderMedium()
+ self.verifyResult(self._widget(), ["14:39:01"])
+
+ def testRenderLong(self):
+ super(DatetimeDisplayWidgetTest, self).testRenderLong()
+ self.verifyResult(self._widget(), ["14:39:01 +000"])
+
+ def testRenderFull(self):
+ super(DatetimeDisplayWidgetTest, self).testRenderFull()
+ self.verifyResult(self._widget(), ["14:39:01 +000"])
+
+class TextAreaDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = TextAreaWidget
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = u"""
+ texttexttexttexttexttextexttexttext\xE9\xE9\xE9\xE9\xE9\xE9\xE9\xE9\xE9
+ texttexttexttexttextte\xE9\xE9\xE9\xE9\xE9xttexttexttexttexttexttexttex
+ texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+ """
+ self._widget.setRenderedValue(value)
+ self.assert_(value, self._widget._toFieldValue(value))
+ self.verifyResult(self._widget(), ["<textarea",
+ self._widget._toFormValue(value)])
+ check_list = (
+ ('id', 'field.foo'),
+ ('name', 'field.foo'),
+ #('value', ), tested above
+ ('cols', '60'),
+ ('rows', '15'),
+ )
+ for a, v in check_list:
+ self.verifyResult(self._widget(), [a, v])
+
+class BytesAreaDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = BytesAreaWidget
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = """
+ texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+ texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+ texttexttexttexttexttexttexttexttexttexttexttexttexttexttext
+ """
+ self._widget.setRenderedValue(value)
+ self.assert_(value, self._widget._toFieldValue(value))
+ self.verifyResult(self._widget(), ["<textarea",
+ self._widget._toFormValue(value)])
+ check_list = (
+ ('id', 'field.foo'),
+ ('name', 'field.foo'),
+ #('value', ), tested above
+ ('cols', '60'),
+ ('rows', '15'),
+ )
+ for a, v in check_list:
+ self.verifyResult(self._widget(), [a, v])
+
+class BytesDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = BytesWidget
+
+ # It uses the BytesDisplayWidget
+ def testRender(self):
+ value = "Food Value"
+ self._widget.setRenderedValue(value)
+ check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+ 'value="%s"'%value, 'size="20"')
+ self.verifyResult(self._widget(), check_list)
+
+class ASCIIDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = ASCIIWidget
+
+ # It uses the default BytesDisplayWidget
+ def testRender(self):
+ value = "Food Value"
+ self._widget.setRenderedValue(value)
+ check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+ 'value="%s"'%value, 'size="20"')
+ self.verifyResult(self._widget(), check_list)
+
+class PasswordDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = PasswordWidget
+ _FieldFactory = Password
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = 'Foo Value'
+ self._widget.setRenderedValue(value)
+ check_list = ('type="password"', 'id="field.foo"', 'name="field.foo"',
+ 'value=""', 'size="20"')
+ self.verifyResult(self._widget(), check_list)
+
+ def testUnchangedPassword(self):
+ # The password hasn't been set yet, so an empty string
+ # is regarded as an empty field.
+ self.assertEquals(None, self._widget._toFieldValue(''))
+ # Now the password has been filled in, so the empty string
+ # is regarded as the special value for UNCHANGED_PASSWORD.
+ self._widget.context.context.foo = u'existing password'
+ self.assertEquals(self._widget.context.UNCHANGED_PASSWORD,
+ self._widget._toFieldValue(''))
+
+class FileDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = FileWidget
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = 'Foo Value'
+ self._widget.setRenderedValue(value)
+ check_list = ('type="file"', 'id="field.foo"', 'name="field.foo"',
+ 'size="20"')
+ self.verifyResult(self._widget(), check_list)
+ check_list = ('type="hidden"',) + check_list[1:-1]
+ self.verifyResult(self._widget.hidden(), check_list)
+ check_list = ('style="color: red"',) + check_list
+ self._widget.extra = 'style="color: red"'
+ self.verifyResult(self._widget.hidden(), check_list)
+
+class IntDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = IntWidget
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = 1
+ self._widget.setRenderedValue(value)
+ check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+ 'size="10"', 'value="%s"'%str(value))
+ self.verifyResult(self._widget(), check_list)
+
+class FloatDisplayWidgetTest(BrowserWidgetTest):
+
+ _WidgetFactory = FloatWidget
+
+ # It uses the default DisplayWidget
+ def testRender(self):
+ value = 1.2
+ self._widget.setRenderedValue(value)
+ check_list = ('type="text"', 'id="field.foo"', 'name="field.foo"',
+ 'size="10"', 'value="%s"'%str(value))
+ self.verifyResult(self._widget(), check_list)
+
+def test_w_nonrequired_and_missing_value_and_no_inout():
+ """
+ There was a bug that caused the value attribute to be set to
+ 'value' under these circumstances.
+
+ >>> from zope.schema import TextLine
+ >>> field = TextLine(__name__='foo', title=u'on',
+ ... required=False, missing_value=u'')
+ >>> request = TestRequest()
+ >>> widget = TextWidget(field, request)
+
+ >>> def normalize(s):
+ ... return '\\n '.join(filter(None, s.split(' ')))
+
+ >>> print normalize( widget() )
+ <input
+ class="textType"
+ id="field.foo"
+ name="field.foo"
+ size="20"
+ type="text"
+ value=""
+ />
+
+ """
+
+def test_no_error_on_render_only():
+ """This is really a test of a bug fix to SimpleInputWidget.
+
+ _error shouldn't be set due to an *internal* call to getInputValue
+ when rendering.
+
+ >>> from zope.schema import TextLine
+ >>> field = TextLine(__name__='foo')
+ >>> request = TestRequest(form={'field.foo': ''})
+ >>> widget = TextWidget(field, request)
+ >>> ignored = widget()
+ >>> unicode(widget.error())
+ u''
+
+
+ """
+
+def test_text_area_works_with_missing_value():
+ """
+ >>> from zope.schema import Text
+ >>> field = Text(__name__='foo', title=u'on',
+ ... required=False, missing_value=u'')
+ >>> request = TestRequest()
+ >>> widget = TextAreaWidget(field, request)
+ >>> def normalize(s):
+ ... return '\\n '.join(filter(None, s.split(' ')))
+
+ >>> print normalize( widget() )
+ <textarea
+ cols="60"
+ id="field.foo"
+ name="field.foo"
+ rows="15"
+ ></textarea>
+
+ >>> print normalize( widget.hidden() )
+ <input
+ class="hiddenType"
+ id="field.foo"
+ name="field.foo"
+ type="hidden"
+ value=""
+ />
+ """
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(TextWidgetTest),
+ unittest.makeSuite(URIDisplayWidgetTest),
+ unittest.makeSuite(DateDisplayWidgetTest),
+ unittest.makeSuite(DatetimeDisplayWidgetTest),
+ unittest.makeSuite(TextAreaDisplayWidgetTest),
+ unittest.makeSuite(BytesAreaDisplayWidgetTest),
+ unittest.makeSuite(PasswordDisplayWidgetTest),
+ unittest.makeSuite(FileDisplayWidgetTest),
+ unittest.makeSuite(IntDisplayWidgetTest),
+ unittest.makeSuite(FloatDisplayWidgetTest),
+ unittest.makeSuite(BytesDisplayWidgetTest),
+ unittest.makeSuite(ASCIIDisplayWidgetTest),
+ doctest.DocTestSuite(),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
More information about the Zope3-Checkins
mailing list