[Checkins] SVN: plone.z3cform/trunk/plone/z3cform/t Add some tests for the traversal adapter

Martin Aspeli optilude at gmx.net
Tue Aug 26 16:45:53 EDT 2008


Log message for revision 90363:
  Add some tests for the traversal adapter

Changed:
  U   plone.z3cform/trunk/plone/z3cform/tests.py
  A   plone.z3cform/trunk/plone/z3cform/traversal.txt

-=-
Modified: plone.z3cform/trunk/plone/z3cform/tests.py
===================================================================
--- plone.z3cform/trunk/plone/z3cform/tests.py	2008-08-26 19:44:03 UTC (rev 90362)
+++ plone.z3cform/trunk/plone/z3cform/tests.py	2008-08-26 20:45:52 UTC (rev 90363)
@@ -61,8 +61,11 @@
     fieldsets_txt = doctest.DocFileSuite('fieldsets/README.txt')
     fieldsets_txt.layer = testing_zcml_layer
     
+    traversal_txt = doctest.DocFileSuite('traversal.txt')
+    traversal_txt.layer = testing_zcml_layer
+    
     return unittest.TestSuite([
-        layout_txt, fieldsets_txt,
+        layout_txt, fieldsets_txt, traversal_txt,
 
         doctest.DocFileSuite(
            'README.txt',
@@ -83,4 +86,5 @@
            'plone.z3cform.crud.crud',
            setUp=testing.setUp, tearDown=testing.tearDown,
            ),
+           
         ])

Added: plone.z3cform/trunk/plone/z3cform/traversal.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/traversal.txt	                        (rev 0)
+++ plone.z3cform/trunk/plone/z3cform/traversal.txt	2008-08-26 20:45:52 UTC (rev 90363)
@@ -0,0 +1,74 @@
+Traversal
+=========
+
+plone.z3cform allows you to traverse to a widget using the ++wiget++ namespace
+adapter on a form view. Note that widgets may need to mix in
+Acquisition.Explicit to be truly traversable in Zope 2.
+
+First, we create a simple form and context.
+
+    >>> from zope.interface import alsoProvides
+    >>> from zope.publisher.browser import TestRequest
+    >>> from zope.annotation.interfaces import IAttributeAnnotatable
+    >>> from z3c.form.interfaces import IFormLayer
+
+    >>> def make_request(form={}):
+    ...     request = TestRequest()
+    ...     request.form.update(form)
+    ...     alsoProvides(request, IFormLayer)
+    ...     alsoProvides(request, IAttributeAnnotatable)
+    ...     return request
+
+    >>> from zope import interface, schema
+    >>> from z3c.form import form, field, button
+    >>> from plone.z3cform.layout import FormWrapper
+
+    >>> class MySchema(interface.Interface):
+    ...     age = schema.Int(title=u"Age")
+
+    >>> from z3c.form.interfaces import IFieldsForm
+    >>> from zope.interface import implements
+    >>> class MyForm(form.Form):
+    ...     implements(IFieldsForm)
+    ...     fields = field.Fields(MySchema)
+    ...     ignoreContext = True # don't use context to get widget data
+    ...     
+    ...     def update(self):
+    ...         print "Updating test form"
+    ...         super(MyForm, self).update()
+
+    >>> class MyFormWrapper(FormWrapper):
+    ...     form = MyForm
+    ...     label = u"Please enter your age"
+
+    >>> from zope.component import provideAdapter
+    >>> from zope.publisher.interfaces.browser import IBrowserRequest
+    >>> from zope.interface import Interface
+
+    >>> provideAdapter(adapts=(Interface, IBrowserRequest),
+    ...                provides=Interface,
+    ...                factory=MyFormWrapper,
+    ...                name=u"test-form")
+
+    >>> from Acquisition import Implicit
+    >>> class Bar(Implicit):
+    ...     __allow_access_to_unprotected_subobjects__ = 1
+    ...     implements(Interface)
+
+    >>> from zope.component import getMultiAdapter
+    >>> context = Bar()
+    >>> request = make_request()
+
+Now, let's emulate the publisher and look up the namespace traversal
+adapter. For example, let's say we'd traversed to
+../@@test-form/++widget++age. The publisher would then do:
+
+    >>> form = getMultiAdapter((context, request), name=u"test-form")
+
+    >>> from zope.traversing.interfaces import ITraversable
+    >>> traverser = getMultiAdapter((form, request), name=u"widget")
+    >>> traverser.traverse('age', [])
+    Updating test form
+    <TextWidget 'form.widgets.age'>
+
+Please note that this point, the form has been updated, but not rendered.
\ No newline at end of file



More information about the Checkins mailing list