1
##############################################################################
3
# Copyright (c) 2001, 2002, 2006 Zope Corporation and Contributors.
6
# This software is subject to the provisions of the Zope Public License,
7
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11
# FOR A PARTICULAR PURPOSE.
13
##############################################################################
14
"""Decimal Widget Functional Tests
16
$Id: test_functional_decimalwidget.py 81040 2007-10-24 15:27:12Z srichter $
21
from persistent import Persistent
23
import zope.security.checker
24
from zope.interface import Interface, implements
25
from zope.traversing.api import traverse
26
from zope.schema import Decimal, Choice
28
from zope.app.form.testing import AppFormLayer
29
from zope.app.form.browser.tests.support import *
30
from zope.app.testing.functional import BrowserTestCase
32
class IDecimalTest(Interface):
36
min=decimal.Decimal("1.1"),
37
max=decimal.Decimal("10.1"))
44
values=(decimal.Decimal("0.0"), decimal.Decimal("1.1"),
45
decimal.Decimal("2.1"), decimal.Decimal("3.1"),
46
decimal.Decimal("5.1"), decimal.Decimal("7.1"),
47
decimal.Decimal("11.1")),
50
f4 = Decimal(readonly=True)
53
class DecimalTest(Persistent):
55
implements(IDecimalTest)
59
self.f2 = decimal.Decimal("1.1")
60
self.f3 = decimal.Decimal("2.1")
61
self.f4 = decimal.Decimal("17.2")
64
class Test(BrowserTestCase):
67
BrowserTestCase.setUp(self)
68
registerEditForm(IDecimalTest)
69
defineSecurity(DecimalTest, IDecimalTest)
71
def test_display_editform(self):
72
self.getRootFolder()['test'] = DecimalTest()
76
response = self.publish('/test/edit.html')
77
self.assertEqual(response.getStatus(), 200)
79
# f1 and f2 should be displayed in text fields
80
self.assert_(patternExists(
81
'<input .* name="field.f1".* value="".*>', response.getBody()))
82
self.assert_(patternExists(
83
'<input .* name="field.f2".* value="1.1".*>', response.getBody()))
85
# f3 should be in a dropdown
86
self.assert_(patternExists(
87
'<select .*name="field.f3".*>', response.getBody()))
88
self.assert_(patternExists(
89
'<option selected="selected" value="2.1">2.1</option>',
92
# f4 should be rendered by the display widget
93
self.assert_(patternExists(
94
'<div class="field">17.2</div>', response.getBody()))
97
def test_submit_editform(self):
98
self.getRootFolder()['test'] = DecimalTest()
102
response = self.publish('/test/edit.html', form={
103
'UPDATE_SUBMIT' : '',
104
'field.f1' : '1.123',
105
'field.f2' : '2.23456789012345',
106
'field.f3' : '11.1' })
107
self.assertEqual(response.getStatus(), 200)
108
self.assert_(updatedMsgExists(response.getBody()))
110
# check new values in object
111
object = traverse(self.getRootFolder(), 'test')
112
self.assertEqual(object.f1, decimal.Decimal("1.123"))
113
self.assertEqual(object.f2, decimal.Decimal("2.23456789012345"))
114
self.assertEqual(object.f3, decimal.Decimal("11.1"))
117
def test_missing_value(self):
118
self.getRootFolder()['test'] = DecimalTest()
121
# submit missing values for f2 and f3
122
response = self.publish('/test/edit.html', form={
123
'UPDATE_SUBMIT' : '',
126
'field.f3' : '1.1' })
127
self.assertEqual(response.getStatus(), 200)
128
self.assert_(updatedMsgExists(response.getBody()))
130
# check new values in object
131
object = traverse(self.getRootFolder(), 'test')
132
self.assertEqual(object.f1, None)
133
self.assertEqual(object.f2, None) # None is default missing_value
134
self.assertEqual(object.f3, decimal.Decimal("1.1")) # 0 is from f3.missing_value=0
137
def test_required_validation(self):
138
self.getRootFolder()['test'] = DecimalTest()
141
# submit missing values for required field f1
142
response = self.publish('/test/edit.html', form={
143
'UPDATE_SUBMIT' : '',
147
self.assertEqual(response.getStatus(), 200)
150
self.assert_(not missingInputErrorExists('f1', response.getBody()))
151
self.assert_(not missingInputErrorExists('f2', response.getBody()))
152
self.assert_(missingInputErrorExists('f3', response.getBody()))
155
def test_invalid_allowed_value(self):
156
self.getRootFolder()['test'] = DecimalTest()
159
# submit a value for f3 that isn't allowed
160
response = self.publish('/test/edit.html', form={
161
'UPDATE_SUBMIT' : '',
162
'field.f3' : '10000' })
163
self.assertEqual(response.getStatus(), 200)
164
self.assert_(invalidValueErrorExists('f3', response.getBody()))
167
def test_min_max_validation(self):
168
self.getRootFolder()['test'] = DecimalTest()
171
# submit value for f1 that is too low
172
response = self.publish('/test/edit.html', form={
173
'UPDATE_SUBMIT' : '',
175
self.assertEqual(response.getStatus(), 200)
176
self.assert_(validationErrorExists('f1', 'Value is too small',
179
# submit value for f1 that is too high
180
response = self.publish('/test/edit.html', form={
181
'UPDATE_SUBMIT' : '',
182
'field.f1' : '1000.2' })
183
self.assertEqual(response.getStatus(), 200)
184
self.assert_(validationErrorExists('f1', 'Value is too big',
188
def test_omitted_value(self):
189
self.getRootFolder()['test'] = DecimalTest()
192
# confirm default values
193
object = traverse(self.getRootFolder(), 'test')
194
self.assert_(object.f1 is None)
195
self.assertEqual(object.f2, decimal.Decimal("1.1"))
196
self.assertEqual(object.f3, decimal.Decimal("2.1"))
198
# submit change with only f2 present -- note that required
199
# field f1 is omitted, which should not cause a validation error
200
response = self.publish('/test/edit.html', form={
201
'UPDATE_SUBMIT' : '',
203
self.assertEqual(response.getStatus(), 200)
204
self.assert_(updatedMsgExists(response.getBody()))
206
# check new value in object
207
object = traverse(self.getRootFolder(), 'test')
208
self.assert_(object.f1 is None)
209
self.assert_(object.f2 is None)
210
self.assertEqual(object.f3, decimal.Decimal("2.1"))
213
def test_conversion(self):
214
self.getRootFolder()['test'] = DecimalTest()
217
# submit value for f1 that cannot be convert to an float
218
response = self.publish('/test/edit.html', form={
219
'UPDATE_SUBMIT' : '',
220
'field.f1' : 'foo' })
221
self.assertEqual(response.getStatus(), 200)
222
self.assert_(validationErrorExists(
224
'Invalid decimal data', response.getBody()))
228
suite = unittest.TestSuite()
229
Test.layer = AppFormLayer
230
suite.addTest(unittest.makeSuite(Test))
233
if __name__=='__main__':
234
unittest.main(defaultTest='test_suite')