##############################################################################
#
# 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.
#
##############################################################################
"""Radio Widget Functional Tests
$Id: $
"""
import unittest
import transaction
from persistent import Persistent
import zope.security.checker
from zope.interface import Interface, implements
from zope.schema import Bool
from zope.traversing.api import traverse
from zope.app.form.browser.ftests.support import *
from zope.app.testing.functional import BrowserTestCase
class IFoo(Interface):
bar = Bool(title=u'Bar')
class Foo(Persistent):
implements(IFoo)
def __init__(self):
self.bar = True
class Test(BrowserTestCase):
def setUp(self):
BrowserTestCase.setUp(self)
registerEditForm(IFoo, widgets={
'bar': { 'class': 'zope.app.form.browser.BooleanRadioWidget' }})
defineSecurity(Foo, IFoo)
def test_display_editform(self):
self.getRootFolder()['foo'] = Foo()
transaction.commit()
# display edit view
response = self.publish('/foo/edit.html')
self.assertEqual(response.getStatus(), 200)
# bar field should be displayed as two radio buttons
self.assert_(patternExists(
'',
response.getBody()))
self.assert_(patternExists(
'',
response.getBody()))
# a hidden element is used to note that the field is present
self.assert_(patternExists(
'',
response.getBody()))
def test_submit_editform(self):
self.getRootFolder()['foo'] = Foo()
transaction.commit()
# submit edit view
response = self.publish('/foo/edit.html', form={
'UPDATE_SUBMIT' : '',
'field.bar' : 'off'})
self.assertEqual(response.getStatus(), 200)
self.assert_(updatedMsgExists(response.getBody()))
# check new values in object
object = traverse(self.getRootFolder(), 'foo')
self.assertEqual(object.bar, False)
def test_missing_value(self):
self.getRootFolder()['foo'] = Foo()
transaction.commit()
# temporarily make bar field not required
IFoo['bar'].required = False
# submit missing value for bar
response = self.publish('/foo/edit.html', form={
'UPDATE_SUBMIT' : '',
'field.bar-empty-marker' : '' })
self.assertEqual(response.getStatus(), 200)
self.assert_(updatedMsgExists(response.getBody()))
# confirm use of missing_value as new object value
self.assert_(IFoo['bar'].missing_value is None)
object = traverse(self.getRootFolder(), 'foo')
self.assert_(object.bar is None)
# restore bar required state
IFoo['bar'].required = True
def test_required_validation(self):
self.getRootFolder()['foo'] = Foo()
transaction.commit()
self.assert_(IFoo['bar'].required)
# submit missing value for required field bar
response = self.publish('/foo/edit.html', form={
'UPDATE_SUBMIT' : '',
'field.bar-empty-marker' : '1'})
self.assertEqual(response.getStatus(), 200)
# confirm error msgs
self.assert_(missingInputErrorExists('bar', response.getBody()))
def test_invalid_allowed_value(self):
self.getRootFolder()['foo'] = Foo()
transaction.commit()
# submit a value for bar isn't allowed
response = self.publish('/foo/edit.html', form={
'UPDATE_SUBMIT' : '',
'field.bar' : 'bogus' })
self.assertEqual(response.getStatus(), 200)
self.assert_(validationErrorExists('bar', 'Invalid value',
response.getBody()))
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Test))
return suite
if __name__=='__main__':
unittest.main(defaultTest='test_suite')