~sidnei/zope3/ztk-1.0a1

« back to all changes in this revision

Viewing changes to src/zope/app/form/browser/tests/test_functional_decimalwidget.py

  • Committer: Sidnei da Silva
  • Date: 2010-03-03 03:29:50 UTC
  • mfrom: (12.1.16 trunk)
  • Revision ID: sidnei.da.silva@canonical.com-20100303032950-duivfaoqsxaf9dgg
Merged newer-from-ztk [r=jkakar,bigkevmcd,free][qa=andreas][f=522474].

Update our monolithic Zope 3 tree to a kgs-based, generated,
monolithic Zope 3 tree built from eggs using the
collective.buildout.omelette recipe.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
##############################################################################
2
 
#
3
 
# Copyright (c) 2001, 2002, 2006 Zope Corporation and Contributors.
4
 
# All Rights Reserved.
5
 
#
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.
12
 
#
13
 
##############################################################################
14
 
"""Decimal Widget Functional Tests
15
 
 
16
 
$Id: test_functional_decimalwidget.py 81040 2007-10-24 15:27:12Z srichter $
17
 
"""
18
 
import unittest
19
 
import decimal
20
 
import transaction
21
 
from persistent import Persistent
22
 
 
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
27
 
 
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
31
 
 
32
 
class IDecimalTest(Interface):
33
 
 
34
 
    f1 = Decimal(
35
 
        required=False,
36
 
        min=decimal.Decimal("1.1"),
37
 
        max=decimal.Decimal("10.1"))
38
 
 
39
 
    f2 = Decimal(
40
 
        required=False)
41
 
 
42
 
    f3 = Choice(
43
 
        required=True,
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")),
48
 
        missing_value=0)
49
 
 
50
 
    f4 = Decimal(readonly=True)
51
 
 
52
 
 
53
 
class DecimalTest(Persistent):
54
 
 
55
 
    implements(IDecimalTest)
56
 
 
57
 
    def __init__(self):
58
 
        self.f1 = None
59
 
        self.f2 = decimal.Decimal("1.1")
60
 
        self.f3 = decimal.Decimal("2.1")
61
 
        self.f4 = decimal.Decimal("17.2")
62
 
 
63
 
 
64
 
class Test(BrowserTestCase):
65
 
 
66
 
    def setUp(self):
67
 
        BrowserTestCase.setUp(self)
68
 
        registerEditForm(IDecimalTest)
69
 
        defineSecurity(DecimalTest, IDecimalTest)
70
 
 
71
 
    def test_display_editform(self):
72
 
        self.getRootFolder()['test'] = DecimalTest()
73
 
        transaction.commit()
74
 
 
75
 
        # display edit view
76
 
        response = self.publish('/test/edit.html')
77
 
        self.assertEqual(response.getStatus(), 200)
78
 
 
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()))
84
 
 
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>',
90
 
            response.getBody()))
91
 
 
92
 
        # f4 should be rendered by the display widget
93
 
        self.assert_(patternExists(
94
 
            '<div class="field">17.2</div>', response.getBody()))
95
 
 
96
 
 
97
 
    def test_submit_editform(self):
98
 
        self.getRootFolder()['test'] = DecimalTest()
99
 
        transaction.commit()
100
 
 
101
 
        # submit edit view
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()))
109
 
 
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"))
115
 
 
116
 
 
117
 
    def test_missing_value(self):
118
 
        self.getRootFolder()['test'] = DecimalTest()
119
 
        transaction.commit()
120
 
 
121
 
        # submit missing values for f2 and f3
122
 
        response = self.publish('/test/edit.html', form={
123
 
            'UPDATE_SUBMIT' : '',
124
 
            'field.f1' : '',
125
 
            'field.f2' : '',
126
 
            'field.f3' : '1.1' })
127
 
        self.assertEqual(response.getStatus(), 200)
128
 
        self.assert_(updatedMsgExists(response.getBody()))
129
 
 
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
135
 
 
136
 
 
137
 
    def test_required_validation(self):
138
 
        self.getRootFolder()['test'] = DecimalTest()
139
 
        transaction.commit()
140
 
 
141
 
        # submit missing values for required field f1
142
 
        response = self.publish('/test/edit.html', form={
143
 
            'UPDATE_SUBMIT' : '',
144
 
            'field.f1' : '',
145
 
            'field.f2' : '',
146
 
            'field.f3' : '' })
147
 
        self.assertEqual(response.getStatus(), 200)
148
 
 
149
 
        # confirm error msgs
150
 
        self.assert_(not missingInputErrorExists('f1', response.getBody()))
151
 
        self.assert_(not missingInputErrorExists('f2', response.getBody()))
152
 
        self.assert_(missingInputErrorExists('f3', response.getBody()))
153
 
 
154
 
 
155
 
    def test_invalid_allowed_value(self):
156
 
        self.getRootFolder()['test'] = DecimalTest()
157
 
        transaction.commit()
158
 
 
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()))
165
 
 
166
 
 
167
 
    def test_min_max_validation(self):
168
 
        self.getRootFolder()['test'] = DecimalTest()
169
 
        transaction.commit()
170
 
 
171
 
        # submit value for f1 that is too low
172
 
        response = self.publish('/test/edit.html', form={
173
 
            'UPDATE_SUBMIT' : '',
174
 
            'field.f1' : '-1' })
175
 
        self.assertEqual(response.getStatus(), 200)
176
 
        self.assert_(validationErrorExists('f1', 'Value is too small',
177
 
            response.getBody()))
178
 
 
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',
185
 
            response.getBody()))
186
 
 
187
 
 
188
 
    def test_omitted_value(self):
189
 
        self.getRootFolder()['test'] = DecimalTest()
190
 
        transaction.commit()
191
 
 
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"))
197
 
 
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' : '',
202
 
            'field.f2' : '' })
203
 
        self.assertEqual(response.getStatus(), 200)
204
 
        self.assert_(updatedMsgExists(response.getBody()))
205
 
 
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"))
211
 
 
212
 
 
213
 
    def test_conversion(self):
214
 
        self.getRootFolder()['test'] = DecimalTest()
215
 
        transaction.commit()
216
 
 
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(
223
 
            'f1',
224
 
            'Invalid decimal data', response.getBody()))
225
 
 
226
 
 
227
 
def test_suite():
228
 
    suite = unittest.TestSuite()
229
 
    Test.layer = AppFormLayer
230
 
    suite.addTest(unittest.makeSuite(Test))
231
 
    return suite
232
 
 
233
 
if __name__=='__main__':
234
 
    unittest.main(defaultTest='test_suite')
235