##############################################################################
#
# 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: test_itemswidget.py 71639 2006-12-20 23:55:22Z jacobholm $
"""
import sets
import unittest
from zope.interface import Interface, implements
from zope.schema import Choice, List, Set, TextLine
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from zope.publisher.browser import TestRequest
from zope.app.form.interfaces import ConversionError
from zope.app.form.browser.itemswidgets import ItemsWidgetBase
from zope.app.form.browser.itemswidgets import ItemDisplayWidget
from zope.app.form.browser.itemswidgets import ItemsMultiDisplayWidget
from zope.app.form.browser.itemswidgets import ListDisplayWidget
from zope.app.form.browser.itemswidgets import SetDisplayWidget
from zope.app.form.browser.itemswidgets import ItemsEditWidgetBase
from zope.app.form.browser.itemswidgets import SelectWidget, DropdownWidget
from zope.app.form.browser.itemswidgets import RadioWidget
from zope.app.form.browser.itemswidgets import ItemsMultiEditWidgetBase
from zope.app.form.browser.itemswidgets import MultiSelectWidget
from zope.app.form.browser.itemswidgets import OrderedMultiSelectWidget
from zope.app.form.browser.itemswidgets import MultiCheckBoxWidget
from zope.app.form.browser.tests.support import VerifyResults
from zope.app.testing.placelesssetup import PlacelessSetup
vocab = SimpleVocabulary(
[SimpleTerm(value, token, title) for value, token, title in (
('one', 'token1', 'One'),
('two', 'token2', 'Two'),
('three', 'token3', 'Three'))])
class ICollector(Interface):
choice = Choice(
title=u"Number",
description=u"The Number",
# we want to be able to distinguish between tokens and values
vocabulary=vocab,
required=True)
numbers = List(
title=u"Numbers",
description=u"The Numbers",
value_type=choice,
required=False)
letters = Set(
title=u"Letters",
description=u"The Letters",
value_type=choice,
required=False)
class Collector(object):
implements(ICollector)
def __init__(self, numbers=None):
self.numbers = numbers or []
class ItemsWidgetBaseTest(VerifyResults, PlacelessSetup, unittest.TestCase):
_widget = ItemsWidgetBase
_field = ICollector.get('choice')
_vocabulary = _field.vocabulary
def _makeWidget(self, form=None, nums=None):
request = TestRequest(form=form or {})
collector = Collector(nums)
bound = self._field.bind(collector)
return self._widget(bound, self._vocabulary, request)
def test_setPrefix(self):
widget = self._makeWidget()
name = self._field.getName()
# Default prefix
self.assertEqual(widget._prefix, 'field.')
self.assertEqual(widget.name, 'field.%s' %name)
self.assertEqual(widget.empty_marker_name,
'field.%s-empty-marker' %name)
# Declaring custom prefix
widget.setPrefix('foo')
self.assertEqual(widget._prefix, 'foo.')
self.assertEqual(widget.name, 'foo.%s' %name)
self.assertEqual(widget.empty_marker_name,
'foo.%s-empty-marker' %name)
# Declaring empty prefix
widget.setPrefix('')
self.assertEqual(widget._prefix, '')
self.assertEqual(widget.name, name)
self.assertEqual(widget.empty_marker_name,
'%s-empty-marker' %name)
def test_convertTokensToValues(self):
widget = self._makeWidget()
self.assertEqual(widget.convertTokensToValues(['token1', 'token2']),
['one', 'two'])
class ItemDisplayWidgetTest(ItemsWidgetBaseTest):
_widget = ItemDisplayWidget
def test_setVocabulary(self):
widget = self._makeWidget()
self.assert_(widget.vocabulary is not None)
self.assertEqual(widget.vocabulary, self._field.vocabulary)
def test__call__(self):
widget = self._makeWidget()
self.assertEqual(widget(), '')
widget = self._makeWidget(form={'field.choice': 'token1'})
self.assertEqual(widget(), 'One')
def test_not_required(self):
self.failIf(self._makeWidget().required)
class ItemsMultiDisplayWidgetTest(ItemsWidgetBaseTest):
_widget = ItemsMultiDisplayWidget
_field = ICollector.get('numbers')
_vocabulary = _field.value_type.vocabulary
_tag = 'ol'
def test__call__(self):
widget = self._makeWidget()
self.assertEqual(widget(), '')
widget = self._makeWidget(form={'field.numbers': ['token1', 'token2']})
self.assertEqual(
widget(),
'<%s id="field.numbers" >'
'
One\nTwo'
'%s>' %(self._tag, self._tag))
def test_renderItems(self):
widget = self._makeWidget()
self.assertEqual(
widget.renderItems(['one', 'two']),
[u'One', u'Two'])
self.assertRaises(LookupError, widget.renderItems, 'one')
self.assertRaises(TypeError, widget.renderItems, 1)
def test_not_required(self):
numbers = List(value_type=ICollector['choice']).bind(Collector(None))
request = TestRequest()
widget = self._widget(numbers, self._vocabulary, request)
self.failIf(widget.required)
class ListDisplayWidgetTest(ItemsMultiDisplayWidgetTest):
_widget = ListDisplayWidget
_tag = 'ol'
class SetDisplayWidgetTest(ItemsMultiDisplayWidgetTest):
_widget = SetDisplayWidget
_tag = 'ul'
class ItemsEditWidgetBaseTest(ItemsWidgetBaseTest):
_widget = ItemsEditWidgetBase
def test_div(self):
widget = self._makeWidget()
self.assertEqual(widget._div('', ''), '')
self.assertEqual(widget._div('foo', ''), '')
self.assertEqual(widget._div('', 'bar'), '\nbar\n
')
self.assertEqual(widget._div('foo', 'bar'),
'\nbar\n
')
self.assertEqual(widget._div('foo', 'bar', style='blah'),
'\nbar\n
')
def test_renderItem(self):
widget = self._makeWidget()
self.assertEqual(widget.renderItem('', 'Foo', 'foo', '', None),
'')
self.assertEqual(widget.renderItem('', 'Foo', 'foo', '', 'klass'),
'')
def test_renderSelectedItem(self):
widget = self._makeWidget()
self.verifyResult(
widget.renderSelectedItem('', 'Foo', 'foo', '', None),
[''])
self.verifyResult(
widget.renderSelectedItem('', 'Foo', 'foo', '', 'klass'),
[''])
def test_renderItemsWithValues(self):
widget = self._makeWidget()
self.assertEqual(
widget.renderItemsWithValues(['one', 'two']),
[u'',
u'',
u''])
self.assertEqual(
widget.renderItemsWithValues([]),
[u'',
u'',
u''])
# This test is disabled because it tests for the presense of a missfeature,
# which has been removed. Did someone actually *want* this?
## def test_error(self):
## widget = self._makeWidget(form={'field.choice': 'ten'})
## widget.setPrefix('field.')
## widget._getFormValue()
## self.assert_(isinstance(widget._error, ConversionError))
def test_hidden(self):
widget = self._makeWidget(form={'field.choice': 'token2'})
widget.setPrefix('field.')
widget.context.required = False
self.verifyResult(
widget.hidden(),
['\n'
'\n'
'\n
\n'
'\n' %self._size)
def test_renderValue(self):
widget = self._makeWidget()
widget.setPrefix('field.')
self.assertEqual(
widget.renderValue('one'),
'' %self._size)
def test_renderItems(self):
widget = self._makeWidget()
widget.setPrefix('field.')
self.assertEqual(
widget.renderItems('one'),
[u'',
u'',
u''])
self.assertEqual(
widget.renderItems('two'),
[u'',
u'',
u''])
self.assertEqual(
widget.renderItems(None),
[u'',
u'',
u''])
def test_renderItems_notRequired(self):
widget = self._makeWidget()
widget.setPrefix('field.')
widget.context.required = False
self.assertEqual(
widget.renderItems([]),
[u'',
u'',
u'',
u''])
def test_renderItems_firstItem(self):
widget = self._makeWidget()
widget.setPrefix('field.')
widget.firstItem = True
self.assertEqual(
widget.renderItems(widget._toFormValue(widget.context.missing_value)),
[u'',
u'',
u''])
class DropdownWidgetTest(SelectWidgetTest):
_widget = DropdownWidget
_size = 1
class RadioWidgetTest(ItemsEditWidgetBaseTest):
_widget = RadioWidget
def test_renderItem(self):
widget = self._makeWidget()
self.verifyResult(
widget.renderItem('', 'Foo', 'foo', 'bar', None),
['