[sylvain] r51052 - in Formulator/trunk: . tests

[email protected]
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')
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.