[sylvain] r51052 - in Formulator/trunk: . tests
[email protected] Mon, 26 Aug 2013 15:10:16 +0200 (CEST)
Newsgroups
gmane.comp.web.zope.silva.cvs
Message-ID
<[email protected] >
Author: sylvain
Date: Mon Aug 26 15:10:16 2013
New Revision: 51052
Added:
Formulator/trunk/ftesting.zcml
Formulator/trunk/tests/test_pattern_checker.py
Formulator/trunk/tests/test_zeam.py
Removed:
Formulator/trunk/tests/test_patternchecker.py
Modified:
Formulator/trunk/Form.py
Formulator/trunk/testing.py
Formulator/trunk/zeamsupport.py
Log:
Try to bust out a bug, write more tests.
Modified: Formulator/trunk/Form.py
==============================================================================
--- Formulator/trunk/Form.py (original)
+++ Formulator/trunk/Form.py Mon Aug 26 15:10:16 2013
@@ -798,7 +798,7 @@
raise FieldDisabledError("Field %s disabled" % id, field)
security.declareProtected('Change Formulator Forms', 'manage_addField')
- def manage_addField(self, id, title, fieldname, REQUEST=None):
+ def manage_addField(self, id, title, fieldname, REQUEST=None, **options):
"""Add a new field to the form.
id -- the id of the field to add
title -- the title of the field to add; this will be used in
@@ -815,7 +815,7 @@
# get the field class we want to add
field_class = FieldRegistry.get_field_class(fieldname)
# create field instance
- field = field_class(id, title=title, description="")
+ field = field_class(id, title=title, **options)
# add the field to the form
id = self._setObject(id, field)
# respond to add_and_edit button if necessary
Added: Formulator/trunk/ftesting.zcml
==============================================================================
--- (empty file)
+++ Formulator/trunk/ftesting.zcml Mon Aug 26 15:10:16 2013
@@ -0,0 +1,8 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope">
+
+ <include package="five.grok" />
+ <include package="zeam.form.base" />
+ <include package="Products.Formulator" />
+
+</configure>
Modified: Formulator/trunk/testing.py
==============================================================================
--- Formulator/trunk/testing.py (original)
+++ Formulator/trunk/testing.py Mon Aug 26 15:10:16 2013
@@ -8,6 +8,8 @@
class FormulatorLayer(BrowserLayer):
+ default_packages = BrowserLayer.default_packages + [
+ 'zeam.form.base']
default_products = BrowserLayer.default_products + [
'Formulator']
default_users = {
@@ -15,7 +17,6 @@
}
-FunctionalLayer = FormulatorLayer(
- Products.Formulator, zcml_file='configure.zcml')
+FunctionalLayer = FormulatorLayer(Products.Formulator)
__all__ = ['FunctionalLayer', 'TestRequest']
Added: Formulator/trunk/tests/test_pattern_checker.py
==============================================================================
--- (empty file)
+++ Formulator/trunk/tests/test_pattern_checker.py Mon Aug 26 15:10:16 2013
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2013 Infrae. All rights reserved.
+# See also LICENSE.txt
+
+
+import unittest
+
+from Products.Formulator.PatternChecker import PatternChecker
+
+
+class PatternCheckerTest(unittest.TestCase):
+
+ def setUp(self):
+ self.val = PatternChecker()
+
+ def assertValueMatches(self, patterns, value):
+ self.assertEquals(value, \
+ self.val.validate_value(patterns, value))
+ def assertValueChanged(self, patterns, value, result):
+ self.assertEquals(result, \
+ self.val.validate_value(patterns, value))
+
+ def test_some_patterns(self):
+ vOk = self.assertValueMatches
+ mOk = self.assertValueChanged
+
+ # American long ZIP
+ vOk(['ddddd-dddd'], '34567-1298')
+ mOk(['ddddd-dddd'], ' 34567-1298 \t ', '34567-1298' )
+
+ # American phone number
+ vOk(['(ddd) ddd-dddd', 'ddd-ddd-dddd','ddd ddd-dddd'],
+ '(345) 678-1298')
+ mOk(['(ddd) ddd-dddd', 'ddd-ddd-dddd', 'ddd ddd-dddd'],
+ '345-678-1298','(345) 678-1298')
+
+ # American money
+ vOk(['$ d*.dd'], '$ 1345345.00')
+ #mOk(['$ d*.dd'], '$ 1345345,00 ', '$ 1345345.00')
+
+ # German money
+ vOk(['d*.dd DM'], '267.98 DM')
+
+ # German license plate
+ vOk(['eee ee-ddd'], 'OSL HR-683')
+
+ # German phone number (international)
+ vOk(['+49 (d*) d*'], '+49 (3574) 7253')
+ mOk(['+49 (d*) d*'], '+49 (3574) 7253', '+49 (3574) 7253')
+
+
+ def test_multiple_ffs(self):
+ for c in ('a','b','c','d','e','f'):
+ self.assertValueMatches(['f-f'], '%s-1'%c)
+
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(PatternCheckerTest, 'test'))
+ return suite
+
Added: Formulator/trunk/tests/test_zeam.py
==============================================================================
--- (empty file)
+++ Formulator/trunk/tests/test_zeam.py Mon Aug 26 15:10:16 2013
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2013 Infrae. All rights reserved.
+# See also LICENSE.txt
+
+import unittest
+
+from Products.Formulator.testing import FunctionalLayer, TestRequest
+from Products.Formulator.zeamsupport import IFormulatorField, IFormulatorWidget
+from zeam.form.base import Fields, Widgets, FormData, DISPLAY
+from zope.interface.verify import verifyObject
+
+
+class IntegrationTestCase(unittest.TestCase):
+ layer = FunctionalLayer
+
+ def setUp(self):
+ self.layer.login('manager')
+ self.root = self.layer.get_application()
+ factory = self.root.manage_addProduct['Formulator']
+ factory.manage_add('form', 'Test Form')
+ form = self.root.form
+ form.manage_addField(
+ 'text_field', 'Name', 'StringField',
+ required=True, default='Arthur van Bossnia')
+ form.manage_addField(
+ 'age_field', 'Age', 'IntegerField',
+ required=False)
+ form.manage_addField(
+ 'life_field', 'Life', 'TextAreaField')
+ form.manage_addField(
+ 'deceased_field', 'Deceased ?', 'CheckBoxField')
+
+ def test_fields(self):
+ """Create fields.
+ """
+ fields = Fields(self.root.form)
+ self.assertEqual(len(fields), 4)
+ # String
+ text_field = fields.get('text_field')
+ self.assertTrue(verifyObject(IFormulatorField, text_field))
+ self.assertEqual(text_field.meta_type, 'StringField')
+ self.assertEqual(text_field.identifier, 'text_field')
+ self.assertEqual(text_field.title, 'Name')
+ self.assertEqual(text_field.readonly, False)
+ self.assertEqual(text_field.required, True)
+ self.assertEqual(text_field.getDefaultValue(None), 'Arthur van Bossnia')
+
+ # Checkbox
+ checkbox_field = fields.get('deceased_field')
+ self.assertTrue(verifyObject(IFormulatorField, checkbox_field))
+ self.assertEqual(checkbox_field.meta_type, 'CheckBoxField')
+ self.assertEqual(checkbox_field.identifier, 'deceased_field')
+ self.assertEqual(checkbox_field.title, 'Deceased ?')
+ self.assertEqual(checkbox_field.readonly, False)
+ self.assertEqual(checkbox_field.required, False)
+ self.assertEqual(checkbox_field.getDefaultValue(None), False)
+
+ def test_display_widgets(self):
+ """Create widgets to input data with Formulator fields.
+ """
+ form = FormData(self.root, TestRequest())
+ form.mode = DISPLAY
+ widgets = Widgets(form=form)
+ widgets.extend(Fields(self.root.form))
+ self.assertEqual(len(widgets), 4)
+
+ # String
+ text_widget = widgets.get('field-text-field')
+ self.assertTrue(verifyObject(IFormulatorWidget, text_widget))
+
+ # Checkbox
+ checkbox_widget = widgets.get('field-deceased-field')
+ self.assertTrue(verifyObject(IFormulatorWidget, checkbox_widget))
+
+ # Update
+ widgets.update()
+
+ # Render
+ self.assertEqual(text_widget.render(), u'Arthur van Bossnia')
+ self.assertEqual(checkbox_widget.render(), u'No')
+
+ def test_input_widgets(self):
+ """Create widgets to input data with Formulator fields.
+ """
+ form = FormData(self.root, TestRequest())
+ widgets = Widgets(form=form)
+ widgets.extend(Fields(self.root.form))
+ self.assertEqual(len(widgets), 4)
+
+ # String
+ text_widget = widgets.get('field-text-field')
+ self.assertTrue(verifyObject(IFormulatorWidget, text_widget))
+ self.assertEqual(text_widget.identifier, 'field-text-field')
+ self.assertEqual(text_widget.title, 'Name')
+ self.assertEqual(text_widget.description, '')
+ self.assertEqual(text_widget.required, True)
+
+ # Checkbox
+ checkbox_widget = widgets.get('field-deceased-field')
+ self.assertTrue(verifyObject(IFormulatorWidget, checkbox_widget))
+ self.assertEqual(checkbox_widget.identifier, 'field-deceased-field')
+ self.assertEqual(checkbox_widget.title, 'Deceased ?')
+ self.assertEqual(checkbox_widget.description, '')
+ self.assertEqual(checkbox_widget.required, False)
+
+ # Update
+ widgets.update()
+
+ # Render
+ self.assertEqual(
+ text_widget.render(),
+ u'<div class="field field-required"><input class="field field-required" id="field-text-field" name="field_text_field" size="20" type="text" value="Arthur van Bossnia" /></div> <input type="hidden" value="1" name="marker_field_text_field" />')
+ self.assertEqual(
+ checkbox_widget.render(),
+ u'<input class="field" id="field-deceased-field" name="field_deceased_field" type="checkbox" /> <input type="hidden" value="1" name="marker_field_deceased_field" />')
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(IntegrationTestCase))
+ return suite
Modified: Formulator/trunk/zeamsupport.py
==============================================================================
--- Formulator/trunk/zeamsupport.py (original)
+++ Formulator/trunk/zeamsupport.py Mon Aug 26 15:10:16 2013
@@ -67,9 +67,11 @@
if required:
css_class.append('field-required')
self._customizations['css_class'] = ' '.join(css_class)
- super(FormulatorField, self).__init__(identifier=field.id,
- required=required,
- readonly=readonly)
+ super(FormulatorField, self).__init__(
+ identifier=field.id,
+ title=decode(field.get_value('title')),
+ required=required,
+ readonly=readonly)
def _getValue(self, identifier, default=NO_VALUE):
if identifier in self._customizations:
@@ -102,6 +104,8 @@
grok.implements(IFormulatorWidget)
order = 0
alternateLayout = False
+ defaultHtmlAttributes = set([])
+ defaultHtmlClass = ['field']
def __init__(self, component, form, request):
field = component._field.__of__(form.context)
@@ -116,19 +120,29 @@
self.description = decode(self._field.get_value('description'))
self.readonly = component.readonly
self.required = component.required
+ self.defaultHtmlClass = [self._field.get_value('css_class')]
+
+ def htmlAttribute(self, name):
+ raise NotImplementedError
+
+ def htmlAttributes(self):
+ raise NotImplementedError
+
+ def clone(self, new_identifier=None):
+ raise NotImplementedError
@property
def error(self):
return self.form.errors.get(self.identifier, None)
- def clone(new_identifier=None):
- raise NotImplementedError
-
def htmlId(self):
return self.identifier
def htmlClass(self):
- return self._field.get_value('css_class')
+ result = self.defaultHtmlClass
+ if self.required:
+ result = result + ['field-required',]
+ return ' '.join(result)
def isVisible(self):
return not self._field.get_value('hidden')