Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
892 additions
and
30 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,153 @@ | ||
############################################################################## | ||
# | ||
# 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 persistent import Persistent | ||
from transaction import get_transaction | ||
|
||
from zope.interface import Interface | ||
from zope.interface import implements | ||
|
||
from zope.schema import Bool | ||
from zope.app.form.browser import CheckBoxWidget | ||
|
||
from support import * | ||
from zope.app.traversing.api import traverse | ||
|
||
from zope.app.tests.functional import BrowserTestCase | ||
|
||
|
||
class IBoolTest(Interface): | ||
|
||
b1 = Bool( | ||
required=True) | ||
|
||
b2 = Bool( | ||
required=False) | ||
|
||
|
||
registerEditForm(IBoolTest) | ||
|
||
|
||
class BoolTest(Persistent): | ||
|
||
implements(IBoolTest) | ||
|
||
def __init__(self): | ||
self.b1 = True | ||
self.b2 = False | ||
|
||
defineSecurity(BoolTest, IBoolTest) | ||
|
||
|
||
class Test(BrowserTestCase): | ||
|
||
|
||
def test_display_editform(self): | ||
self.getRootFolder()['test'] = BoolTest() | ||
get_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() | ||
get_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 | ||
get_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() | ||
get_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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
############################################################################## | ||
# | ||
# 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. | ||
# | ||
############################################################################## | ||
"""DateTime Widget Functional Tests | ||
$Id$ | ||
""" | ||
import unittest | ||
import re | ||
from persistent import Persistent | ||
from transaction import get_transaction | ||
from datetime import datetime | ||
from zope.app.datetimeutils import parseDatetimetz, tzinfo | ||
|
||
from zope.interface import Interface | ||
from zope.interface import implements | ||
|
||
from zope.schema import Datetime, Choice | ||
|
||
from support import * | ||
from zope.app.traversing.api import traverse | ||
|
||
from zope.app.tests.functional import BrowserTestCase | ||
|
||
|
||
class IDatetimeTest(Interface): | ||
|
||
d1 = Datetime( | ||
required=True, | ||
min=datetime(2003, 1, 1, tzinfo=tzinfo(0)), | ||
max=datetime(2020, 12, 31, tzinfo=tzinfo(0))) | ||
|
||
d2 = Datetime( | ||
required=False) | ||
|
||
d3 = Choice( | ||
required=False, | ||
values=( | ||
datetime(2003, 9, 15, tzinfo=tzinfo(0)), | ||
datetime(2003, 10, 15, tzinfo=tzinfo(0))), | ||
missing_value=datetime(2000, 1, 1, tzinfo=tzinfo(0))) | ||
|
||
registerEditForm(IDatetimeTest) | ||
|
||
|
||
class DatetimeTest(Persistent): | ||
|
||
implements(IDatetimeTest) | ||
|
||
def __init__(self): | ||
self.d1 = datetime(2003, 4, 6, tzinfo=tzinfo(0)) | ||
self.d2 = datetime(2003, 8, 6, tzinfo=tzinfo(0)) | ||
self.d3 = None | ||
|
||
defineSecurity(DatetimeTest, IDatetimeTest) | ||
|
||
|
||
def getDateForField(field, source): | ||
"""Returns a datetime object for the specified field in source. | ||
Returns None if the field value cannot be converted to date. | ||
""" | ||
|
||
# look in input element first | ||
pattern = '<input .* name="field.%s".* value="(.*)".*>' % field | ||
m = re.search(pattern, source) | ||
if m is None: | ||
# look in a select element | ||
pattern = '<select .* name="field.%s".*>.*' \ | ||
'<option value="(.*)" selected>*.</select>' % field | ||
m = re.search(pattern, source, re.DOTALL) | ||
if m is None: | ||
return None | ||
|
||
try: | ||
return parseDatetimetz(m.group(1)) | ||
except: | ||
# ignore specifics | ||
return None | ||
|
||
|
||
class Test(BrowserTestCase): | ||
|
||
|
||
def test_display_editform(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
object = traverse(self.getRootFolder(), 'test') | ||
|
||
# display edit view | ||
response = self.publish('/test/edit.html') | ||
self.assertEqual(response.getStatus(), 200) | ||
|
||
# confirm date values in form with actual values | ||
self.assertEqual(getDateForField('d1', response.getBody()), object.d1) | ||
self.assertEqual(getDateForField('d2', response.getBody()), object.d2) | ||
self.assert_(getDateForField('d3', response.getBody()) is None) | ||
|
||
|
||
def test_submit_editform(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
d1 = datetime(2003, 2, 1, tzinfo=tzinfo(0)) | ||
d2 = datetime(2003, 2, 2, tzinfo=tzinfo(0)) | ||
d3 = datetime(2003, 10, 15, tzinfo=tzinfo(0)) | ||
|
||
# submit edit view | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d1' : str(d1), | ||
'field.d2' : str(d2), | ||
'field.d3' : str(d3) }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# check new values in object | ||
object = traverse(self.getRootFolder(), 'test') | ||
|
||
self.assertEqual(object.d1, d1) | ||
self.assertEqual(object.d2, d2) | ||
self.assertEqual(object.d3, d3) | ||
|
||
|
||
def test_missing_value(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
# submit missing values for d2 and d3 | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d2' : '', | ||
'field.d3-empty-marker' : '' }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# check new values in object | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assert_(object.d2 is None) # default missing_value for dates | ||
# 2000-1-1 is missing_value for d3 | ||
self.assertEqual(object.d3, datetime(2000, 1, 1, tzinfo=tzinfo(0))) | ||
|
||
|
||
def test_required_validation(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
# submit missing values for required field d1 | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d1' : '', | ||
'field.d2' : '', | ||
'field.d3' : '' }) | ||
self.assertEqual(response.getStatus(), 200) | ||
|
||
# confirm error msgs | ||
self.assert_(missingInputErrorExists('d1', response.getBody())) | ||
self.assert_(not missingInputErrorExists('d2', response.getBody())) | ||
self.assert_(not missingInputErrorExists('d3', response.getBody())) | ||
|
||
|
||
def test_invalid_value(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
# submit a value for d3 that isn't allowed | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d3' : str(datetime(2003, 2, 1, tzinfo=tzinfo(0))) }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(invalidValueErrorExists('d3', response.getBody())) | ||
|
||
|
||
def test_min_max_validation(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
# submit value for d1 that is too low | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d1' : str(datetime(2002, 12, 31, tzinfo=tzinfo(0))) }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(validationErrorExists('d1', 'Value is too small', | ||
response.getBody())) | ||
|
||
# submit value for i1 that is too high | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d1' : str(datetime(2021, 1, 1, tzinfo=tzinfo(0))) }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(validationErrorExists('d1', 'Value is too big', | ||
response.getBody())) | ||
|
||
|
||
def test_omitted_value(self): | ||
self.getRootFolder()['test'] = DatetimeTest() | ||
get_transaction().commit() | ||
|
||
# remember default values | ||
object = traverse(self.getRootFolder(), 'test') | ||
d1 = object.d1 | ||
d2 = object.d2 | ||
self.assert_(d2 is not None) | ||
d3 = object.d3 | ||
|
||
# submit change with only d2 present -- note that required | ||
# field d1 is omitted, which should not cause a validation error | ||
response = self.publish('/test/edit.html', form={ | ||
'UPDATE_SUBMIT' : '', | ||
'field.d2' : '' }) | ||
self.assertEqual(response.getStatus(), 200) | ||
self.assert_(updatedMsgExists(response.getBody())) | ||
|
||
# check new value in object | ||
object = traverse(self.getRootFolder(), 'test') | ||
self.assertEqual(object.d1, d1) | ||
self.assert_(object.d2 is None) | ||
self.assertEqual(object.d3, d3) | ||
|
||
|
||
def test_suite(): | ||
suite = unittest.TestSuite() | ||
suite.addTest(unittest.makeSuite(Test)) | ||
return suite | ||
|
||
if __name__=='__main__': | ||
unittest.main(defaultTest='test_suite') | ||
|
||
|
Oops, something went wrong.