############################################################################## # # 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
  • \n
  • Two
  • ' '' %(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), ['Foo']) self.verifyResult( widget.renderSelectedItem('', 'Foo', 'foo', '', 'klass'), ['Foo']) 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), [' Foo']) self.verifyResult( widget.renderItem('bar', 'Foo', 'foo', 'bar', 'klass'), [' Foo']) def test_renderSelectedItem(self): widget = self._makeWidget() self.verifyResult( widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'), [' Foo']) self.verifyResult( widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'), [' Foo']) def test_renderItemsWithValues(self): widget = self._makeWidget() items = widget.renderItemsWithValues(['one']) values = [('token1','One'), ('token2','Two'), ('token3','Three')] for index, item in enumerate(items): self.verifyResult( item, ['