Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix up zope.app for new location of zope.traversing.
(also sneaked in some minor cosmetics regarding zapi/ztapi)
- Loading branch information
Showing
10 changed files
with
1,534 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
############################################################################## | ||
# | ||
# 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( | ||
'<input .*checked="checked".*name="field.bar".*type="radio".*' | ||
'value="on".* />', | ||
response.getBody())) | ||
self.assert_(patternExists( | ||
'<input .*name="field.bar".*type="radio".*value="off".* />', | ||
response.getBody())) | ||
|
||
# a hidden element is used to note that the field is present | ||
self.assert_(patternExists( | ||
'<input name="field.bar-empty-marker" type="hidden" value="1".* />', | ||
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') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
############################################################################## | ||
# | ||
# 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 | ||
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 import CheckBoxWidget | ||
from zope.app.form.browser.ftests.support import * | ||
from zope.app.testing.functional import BrowserTestCase | ||
|
||
class IBoolTest(Interface): | ||
|
||
b1 = Bool( | ||
required=True) | ||
|
||
b2 = Bool( | ||
required=False) | ||
|
||
class BoolTest(Persistent): | ||
|
||
implements(IBoolTest) | ||
|
||
def __init__(self): | ||
self.b1 = True | ||
self.b2 = False | ||
|
||
class Test(BrowserTestCase): | ||
|
||
|
||
def setUp(self): | ||
BrowserTestCase.setUp(self) | ||
registerEditForm(IBoolTest) | ||
defineSecurity(BoolTest, IBoolTest) | ||
|
||
def test_display_editform(self): | ||
self.getRootFolder()['test'] = BoolTest() | ||
transaction.commit() | ||
|
||
# display edit view | ||
response = self.publish('/test/edit.html') | ||
self.assertEqual(response.getStatus(), 200) | ||
|
||
# b1 and b2 should be displayed in checkbox input fields | ||
self.assert_(patternExists( | ||
'<input .* checked="checked".* name="field.b1".* ' \ | ||
'type="checkbox".* />', | ||
response.getBody())) | ||
self.assert_(patternExists( | ||
'<input .* name="field.b2".* type="checkbox".* />', | ||
response.getBody())) | ||
# confirm that b2 is *not* checked | ||
self.assert_(not patternExists( | ||
'<input .* checked="checked".* name="field.b2".* ' \ | ||
'type="checkbox".* />', | ||
response.getBody())) | ||
|
||
|
||
def test_submit_editform(self): | ||
self.getRootFolder()['test'] = BoolTest() | ||
transaction.commit() | ||
|
||
# submit edit view | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.b1' : '', | ||
'field.b2' : 'on' }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# check new values in object | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assertEqual(object.b1, False) | ||
self.assertEqual(object.b2, True) | ||
|
||
|
||
def test_unexpected_value(self): | ||
object = BoolTest() | ||
object.b1 = True | ||
object.b2 = True | ||
self.getRootFolder()['test'] = object | ||
transaction.commit() | ||
|
||
# submit invalud type for text line | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.b1' : 'true', | ||
'field.b2' : 'foo' }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# values other than 'on' should be treated as False | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assertEqual(object.b1, False) | ||
self.assertEqual(object.b2, False) | ||
|
||
|
||
def test_missing_value(self): | ||
# Note: checkbox widget doesn't support a missing value. This | ||
# test confirms that one cannot set a Bool field to None. | ||
|
||
self.getRootFolder()['test'] = BoolTest() | ||
transaction.commit() | ||
|
||
# confirm default value of b1 is True | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assertEqual(object.b1, True) | ||
|
||
# submit missing for b1 | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.b1' : CheckBoxWidget._missing }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# confirm b1 is not missing | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assert_(object.b1 != Bool.missing_value) | ||
|
||
|
||
def test_suite(): | ||
suite = unittest.TestSuite() | ||
suite.addTest(unittest.makeSuite(Test)) | ||
return suite | ||
|
||
if __name__=='__main__': | ||
unittest.main(defaultTest='test_suite') | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.