[Checkins] SVN: z3c.formdemo/trunk/ - Feature: Created functional tests for the demos.

Stephan Richter srichter at cosmos.phy.tufts.edu
Mon Jul 2 09:19:03 EDT 2007


Log message for revision 77305:
  - Feature: Created functional tests for the demos.
  
  - Feature: Moved all application ZCML declarations into a ZCML file 
    called ``application.zcml``.
  
  

Changed:
  U   z3c.formdemo/trunk/CHANGES.txt
  U   z3c.formdemo/trunk/buildout.cfg
  U   z3c.formdemo/trunk/setup.py
  A   z3c.formdemo/trunk/src/z3c/formdemo/application.zcml
  U   z3c.formdemo/trunk/src/z3c/formdemo/browser/index.pt
  A   z3c.formdemo/trunk/src/z3c/formdemo/ftesting.zcml
  U   z3c.formdemo/trunk/src/z3c/formdemo/layer.py
  A   z3c.formdemo/trunk/src/z3c/formdemo/message/README.txt
  A   z3c.formdemo/trunk/src/z3c/formdemo/questionnaire/README.txt
  A   z3c.formdemo/trunk/src/z3c/formdemo/testing.py
  A   z3c.formdemo/trunk/src/z3c/formdemo/tests.py
  A   z3c.formdemo/trunk/src/z3c/formdemo/widgets/README.txt

-=-
Modified: z3c.formdemo/trunk/CHANGES.txt
===================================================================
--- z3c.formdemo/trunk/CHANGES.txt	2007-07-02 13:16:15 UTC (rev 77304)
+++ z3c.formdemo/trunk/CHANGES.txt	2007-07-02 13:19:02 UTC (rev 77305)
@@ -2,6 +2,14 @@
 CHANGES
 =======
 
+Version 1.3.0 (6/29/2007)
+-------------------------
+
+- Feature: Created functional tests for the demos.
+
+- Feature: Moved all application ZCML declarations into a ZCML file called
+  ``application.zcml``.
+
 Version 1.2.0 (6/29/2007)
 -------------------------
 

Modified: z3c.formdemo/trunk/buildout.cfg
===================================================================
--- z3c.formdemo/trunk/buildout.cfg	2007-07-02 13:16:15 UTC (rev 77304)
+++ z3c.formdemo/trunk/buildout.cfg	2007-07-02 13:19:02 UTC (rev 77305)
@@ -1,76 +1,17 @@
 [buildout]
-develop = .
-parts = demo
+develop = . z3c.form z3c.formui
+parts = demo test
 
+[test]
+recipe = zc.recipe.testrunner
+eggs = z3c.formdemo [app, test]
+
 [zope3]
 location = .
 
 [form-demo-app]
 recipe = zc.zope3recipes:app
-site.zcml = <configure
-                xmlns="http://namespaces.zope.org/zope"
-                xmlns:browser="http://namespaces.zope.org/browser"
-                i18n_domain="demo">
-            <include package="zope.app.component" file="meta.zcml" />
-            <include package="zope.app.component.browser" file="meta.zcml" />
-            <include package="zope.app.form.browser" file="meta.zcml" />
-            <include package="zope.app.pagetemplate" file="meta.zcml" />
-            <include package="zope.app.publication" file="meta.zcml" />
-            <include package="zope.app.publisher" file="meta.zcml" />
-            <include package="zope.app.security" file="meta.zcml" />
-            <include package="zope.app.securitypolicy" file="meta.zcml" />
-            <include package="zope.rdb" file="meta.zcml" />
-            <include package="zope.viewlet" file="meta.zcml" />
-            <include package="z3c.form" file="meta.zcml" />
-            <include package="z3c.macro" file="meta.zcml" />
-            <include package="z3c.pagelet" file="meta.zcml" />
-            <include package="z3c.template" file="meta.zcml" />
-            <include package="z3c.zrtresource" file="meta.zcml" />
-            <include package="zc.resourcelibrary" file="meta.zcml" />
-
-            <browser:menu id="zmi_views" title="Views" />
-            <browser:menu id="zmi_actions" title="Actions" />
-
-            <include package="zope.app.appsetup" />
-            <include package="zope.app.component" />
-            <include package="zope.app.container" />
-            <include package="zope.app.error" />
-            <include package="zope.app.i18n" />
-            <include package="zope.app.publication" />
-            <include package="zope.app.security" />
-            <include package="zope.app.securitypolicy" />
-            <include package="zope.app.session" />
-            <include package="zope.app.twisted" />
-            <include package="zope.app.wsgi" />
-            <include package="zope.annotation" />
-            <include package="zope.component" />
-            <include package="zope.contentprovider" />
-            <include package="zope.location" />
-            <include package="zope.publisher" />
-            <include package="zope.rdb" />
-            <include package="zope.traversing" />
-            <include package="zope.traversing.browser" />
-            <include package="zope.viewlet" />
-
-            <include package="z3c.form" />
-            <include package="z3c.formui" />
-            <include package="z3c.formdemo" />
-            <include package="z3c.layer.pagelet" />
-            <include package="z3c.macro" />
-            <include package="z3c.pagelet" />
-
-            <include package="zc.resourcelibrary" />
-            <include package="zc.table" />
-
-            <browser:defaultView name="index.html" />
-            <browser:defaultSkin name="Z3CFormDemo" />
-
-            <securityPolicy
-            component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
-
-            <role id="zope.Anonymous" title="Everybody" />
-            <grantAll role="zope.Anonymous" />
-            </configure>
+site.zcml = <include package="z3c.formdemo" file="application.zcml" />
 eggs = z3c.formdemo [app]
 
 [demo]

Modified: z3c.formdemo/trunk/setup.py
===================================================================
--- z3c.formdemo/trunk/setup.py	2007-07-02 13:16:15 UTC (rev 77304)
+++ z3c.formdemo/trunk/setup.py	2007-07-02 13:19:02 UTC (rev 77305)
@@ -64,6 +64,8 @@
                'zope.app.wsgi',
                'zope.contentprovider',
                ],
+        test = ['z3c.etestbrowser',
+                'zope.app.testing'],
         ),
     install_requires = [
         'setuptools',

Added: z3c.formdemo/trunk/src/z3c/formdemo/application.zcml
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/application.zcml	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/application.zcml	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,65 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    i18n_domain="demo">
+
+  <include package="zope.app.component" file="meta.zcml" />
+  <include package="zope.app.component.browser" file="meta.zcml" />
+  <include package="zope.app.form.browser" file="meta.zcml" />
+  <include package="zope.app.pagetemplate" file="meta.zcml" />
+  <include package="zope.app.publication" file="meta.zcml" />
+  <include package="zope.app.publisher" file="meta.zcml" />
+  <include package="zope.app.security" file="meta.zcml" />
+  <include package="zope.app.securitypolicy" file="meta.zcml" />
+  <include package="zope.rdb" file="meta.zcml" />
+  <include package="zope.viewlet" file="meta.zcml" />
+  <include package="z3c.form" file="meta.zcml" />
+  <include package="z3c.macro" file="meta.zcml" />
+  <include package="z3c.pagelet" file="meta.zcml" />
+  <include package="z3c.template" file="meta.zcml" />
+  <include package="z3c.zrtresource" file="meta.zcml" />
+  <include package="zc.resourcelibrary" file="meta.zcml" />
+
+  <browser:menu id="zmi_views" title="Views" />
+  <browser:menu id="zmi_actions" title="Actions" />
+
+  <include package="zope.app.appsetup" />
+  <include package="zope.app.component" />
+  <include package="zope.app.container" />
+  <include package="zope.app.error" />
+  <include package="zope.app.i18n" />
+  <include package="zope.app.publication" />
+  <include package="zope.app.security" />
+  <include package="zope.app.securitypolicy" />
+  <include package="zope.app.session" />
+  <include package="zope.app.twisted" />
+  <include package="zope.app.wsgi" />
+  <include package="zope.annotation" />
+  <include package="zope.component" />
+  <include package="zope.contentprovider" />
+  <include package="zope.location" />
+  <include package="zope.publisher" />
+  <include package="zope.rdb" />
+  <include package="zope.traversing" />
+  <include package="zope.traversing.browser" />
+  <include package="zope.viewlet" />
+
+  <include package="z3c.form" />
+  <include package="z3c.formui" />
+  <include package="z3c.formdemo" />
+  <include package="z3c.layer.pagelet" />
+  <include package="z3c.macro" />
+  <include package="z3c.pagelet" />
+
+  <include package="zc.resourcelibrary" />
+  <include package="zc.table" />
+
+  <browser:defaultView name="index.html" />
+  <browser:defaultSkin name="Z3CFormDemo" />
+
+  <securityPolicy
+  component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+  <role id="zope.Anonymous" title="Everybody" />
+  <grantAll role="zope.Anonymous" />
+</configure>


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/application.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.formdemo/trunk/src/z3c/formdemo/browser/index.pt
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/browser/index.pt	2007-07-02 13:16:15 UTC (rev 77304)
+++ z3c.formdemo/trunk/src/z3c/formdemo/browser/index.pt	2007-07-02 13:19:02 UTC (rev 77305)
@@ -3,45 +3,43 @@
 <div class="demo">
   <h4>Div based layout</h4>
   <div>
-    <a href="../++skin++Z3CFormDemo/addHelloWorld.html">Hello World</a>
+    <a href="/addHelloWorld.html">Hello World</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/widgets.html">All widgets</a>
+    <a href="/widgets.html">All widgets</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/questionnaireResults.html">
-      Questionnaire
-    </a>
+    <a href="/questionnaireResults.html">Questionnaire</a>
   </div>
 
   <h4>Table based layout</h4>
   <div>
-    <a href="../++skin++Z3CTableFormDemo/addHelloWorld.html">Hello World</a>
+    <a href="/++skin++Z3CTableFormDemo/addHelloWorld.html">Hello World</a>
   </div>
   <div>
-    <a href="../++skin++Z3CTableFormDemo/widgets.html">All widgets</a>
+    <a href="/++skin++Z3CTableFormDemo/widgets.html">All widgets</a>
   </div>
   <div>
-    <a href="../++skin++Z3CTableFormDemo/questionnaireResults.html">
+    <a href="/++skin++Z3CTableFormDemo/questionnaireResults.html">
       Questionnaire
     </a>
   </div>
 
   <h4>Advanced Demos</h4>
   <div>
-    <a href="../++skin++Z3CFormDemo/calculator.html">Calculator</a>
+    <a href="/calculator.html">Calculator</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/wizard.html">Wizard</a>
+    <a href="/wizard.html">Wizard</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/spreadsheet.html">Spreadsheet</a>
+    <a href="/spreadsheet.html">Spreadsheet</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/addressbook.html">Address Book</a>
+    <a href="/addressbook.html">Address Book</a>
   </div>
   <div>
-    <a href="../++skin++Z3CFormDemo/showAllSQLHelloWorld.html">
+    <a href="/showAllSQLHelloWorld.html">
       SQL Hello World
     </a>
   </div>

Added: z3c.formdemo/trunk/src/z3c/formdemo/ftesting.zcml
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/ftesting.zcml	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/ftesting.zcml	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1 @@
+<include file="application.zcml" />


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.formdemo/trunk/src/z3c/formdemo/layer.py
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/layer.py	2007-07-02 13:16:15 UTC (rev 77304)
+++ z3c.formdemo/trunk/src/z3c/formdemo/layer.py	2007-07-02 13:19:02 UTC (rev 77305)
@@ -14,6 +14,7 @@
 """
 $Id$
 """
+__docformat__ = "reStructuredText"
 
 from z3c.form.interfaces import IFormLayer
 from z3c.layer.pagelet import IPageletBrowserLayer

Added: z3c.formdemo/trunk/src/z3c/formdemo/message/README.txt
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/message/README.txt	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/message/README.txt	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,90 @@
+========================
+Hello World Message Demo
+========================
+
+The "Hello World Message" demo is intended to demonstrate the most minimal
+setup required to get add, edit and display to work.
+
+To start, we need to open a browser and go to the demo applications overview
+screen:
+
+  >>> from z3c.formdemo import testing
+  >>> from z3c.etestbrowser.testing import ExtendedTestBrowser
+  >>> user = ExtendedTestBrowser()
+  >>> user.addHeader('Accept-Language', 'en')
+  >>> user.open('http://localhost:8080')
+
+Since all demos are purely public, there is no need to log in. Let's now click
+on the "Hello World" link:
+
+  >>> user.getLink('Hello World').click()
+
+You are now represented with the message add form.
+
+  >>> user.url
+  'http://localhost:8080/addHelloWorld.html'
+
+If we submit the form by clicking on add, ...
+
+  >>> user.getControl('Add').click()
+
+... the same page returns telling us we have some errors:
+
+  >>> testing.printElement(user, "//div[@class='summary']")
+  <div class="summary">There were some errors.</div>
+
+This is because we forgot to enter the "Who" field, which is required:
+
+  >>> testing.printElement(user, "//ul[@class='errors']/li")
+  <li>
+     Who: <div class="error">Required input is missing.</div>
+  </li>
+
+Let's now fill out all the required fields and try to add the message again:
+
+  >>> user.getControl('Who').value = u'Stephan'
+  >>> user.getControl('When').value = u'7/1/07'
+  >>> user.getControl('Add').click()
+
+Once submitted, the message is now added to the database and the display view
+is shown:
+
+  >>> testing.printElement(user, "//h1")
+  <h1>
+    A cool Hello World from Stephan on 7/1/07 !
+  </h1>
+
+The message's edit form can be accessed by clicking on the "Edit Message"
+link:
+
+  >>> user.getLink('Edit Message').click()
+
+When immediately pressing "Apply", a message appears telling us that no data
+has been changed:
+
+  >>> user.getControl('Apply', index=0).click()
+  >>> testing.printElement(user, "//div[@class='summary']")
+  <div class="summary">No changes were applied.</div>
+
+Let's now change the name and submit the form:
+
+  >>> user.getControl('Who').value = u'Roger'
+  >>> user.getControl('Apply', index=0).click()
+
+The now informs us that the data has been updated:
+
+  >>> testing.printElement(user, "//div[@class='summary']")
+  <div class="summary">Data successfully updated.</div>
+
+When pressing the "Apply and View" button, the changed data is stored and the
+user is also forwarded to the view page again:
+
+  >>> user.getControl('What').getControl('best').click()
+  >>> user.getControl('Apply and View').click()
+
+Of course, the view shows the latest data:
+
+  >>> testing.printElement(user, "//h1")
+  <h1>
+    A best Hello World from Roger on 7/1/07 !
+  </h1>


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/message/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.formdemo/trunk/src/z3c/formdemo/questionnaire/README.txt
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/questionnaire/README.txt	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/questionnaire/README.txt	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,153 @@
+==================
+Questionnaire Demo
+==================
+
+The purpose of the questionnaire demo is demonstrate the concept of field
+groups and attribute value adapters for fields.
+
+To start, we need to open a browser and go to the demo applications overview
+screen:
+
+  >>> from z3c.formdemo import testing
+  >>> from z3c.etestbrowser.testing import ExtendedTestBrowser
+  >>> user = ExtendedTestBrowser()
+  >>> user.addHeader('Accept-Language', 'en')
+  >>> user.open('http://localhost:8080')
+
+Since all demos are purely public, there is no need to log in. Let's now click
+on the "All widgets" link:
+
+  >>> user.getLink('Questionnaire').click()
+
+The first screen you see is the questionnaire results screen.
+
+  >>> testing.printElement(user, "//h1")
+  <h1>Zope Developer Questionnaire Results</h1>
+
+Initially there are no questionnaires, so the screen contains little
+information. Let's first fill out a questionnaire by click on the link below
+the table.
+
+  >>> user.getLink('Fill out Questionnaire').click()
+
+The user is now presented with the questionnaire screen, which is organized
+into three groups. Let's fill out the questionnaire:
+
+  >>> user.getControl('Name').value = u'Stephan Richter'
+  >>> user.getControl('Age').value = u'27'
+
+  >>> user.getControl('yes', index=0).click()
+  >>> user.getControl('no', index=1).click()
+  >>> user.getControl('yes', index=2).click()
+  >>> user.getControl('no', index=3).click()
+
+  >>> user.getControl('yes', index=4).click()
+  >>> user.getControl('have you contributed').value = u'5'
+  >>> user.getControl('What is your Zope Id?').value = u'srichter'
+
+  >>> user.getControl('Submit Questionnaire').click()
+
+Once the questionnaire has been submitted, the user is returned to the results
+screen. Now the table has an entry:
+
+  >>> testing.printElement(user, "//table/tbody/tr[1]")
+  <tr class="odd"><td
+     class="sorted-on">
+      Stephan Richter
+    </td>
+    <td class="right">
+      27
+    </td>
+    <td class="right">
+      yes
+    </td>
+    <td class="right">
+      no
+    </td>
+    <td class="right">
+      yes
+    </td>
+    <td class="right">
+      no
+    </td>
+    <td class="right">
+      yes
+    </td>
+    <td class="right">
+      5
+    </td>
+    <td class="right">
+      srichter
+    </td>
+  </tr>
+
+Let's now fill out another questionnaire:
+
+  >>> user.getLink('Fill out Questionnaire').click()
+
+  >>> user.getControl('Name').value = u'Roger Ineichen'
+  >>> user.getControl('Age').value = u'39'
+
+  >>> user.getControl('yes', index=0).click()
+  >>> user.getControl('yes', index=1).click()
+  >>> user.getControl('yes', index=2).click()
+  >>> user.getControl('no', index=3).click()
+
+  >>> user.getControl('yes', index=4).click()
+  >>> user.getControl('have you contributed').value = u'4'
+  >>> user.getControl('What is your Zope Id?').value = u'projekt01'
+
+  >>> user.getControl('Submit Questionnaire').click()
+
+Now that we have two entries, we can use the table headers cells to sort
+them. By default they are sorted by name:
+
+  >>> testing.printElement(user, "//table/tbody/tr/td[1]/text()",
+  ...                      multiple=True, serialize=False)
+  Roger Ineichen
+  Stephan Richter
+
+Clicking on the "Name" table header cell, will leave the order, since the
+ordering must be initialized. The second time the order is reversed:
+
+  >>> user.getLink('Name').click()
+  >>> user.getLink('Name').click()
+
+  >>> testing.printElement(user, "//table/tbody/tr/td[1]/text()",
+  ...                      multiple=True, serialize=False)
+  Stephan Richter
+  Roger Ineichen
+
+Selecting another header will sort on it. Let's choose the age; clicking on it
+once sorts it in ascending order:
+
+  >>> user.getLink('Age').click()
+  >>> testing.printElement(user, "//table/tbody/tr/td[2]/text()",
+  ...                      multiple=True, serialize=False)
+  27
+  39
+
+Clicking it again, reverses the order:
+
+  >>> user.getLink('Age').click()
+  >>> testing.printElement(user, "//table/tbody/tr/td[2]/text()",
+  ...                      multiple=True, serialize=False)
+  39
+  27
+
+Finally, let's make sure that all headers are linked:
+
+  >>> user.getLink('Zope 2')
+  <Link text='Zope 2' url='...?sort-on=formdemo.questionnaire.zope2'>
+  >>> user.getLink('Plone')
+  <Link text='Plone' url='...?sort-on=formdemo.questionnaire.plone'>
+  >>> user.getLink('Zope 3')
+  <Link text='Zope 3' url='...?sort-on=formdemo.questionnaire.zope3'>
+  >>> user.getLink('Five')
+  <Link text='Five' url='...?sort-on=formdemo.questionnaire.five'>
+  >>> user.getLink('Contrib.')
+  <Link text='Contrib.' url='...?sort-on=formdemo.questionnaire.contributor'>
+  >>> user.getLink('Years')
+  <Link text='Years' url='...?sort-on=formdemo.questionnaire.years'>
+  >>> user.getLink('Zope Id')
+  <Link text='Zope Id' url='...?sort-on=formdemo.questionnaire.zopeId'>


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/questionnaire/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.formdemo/trunk/src/z3c/formdemo/testing.py
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/testing.py	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/testing.py	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,33 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+import lxml.etree
+import os
+from zope.app.testing.functional import ZCMLLayer
+
+def printElement(browser, xpath, multiple=False, serialize=True):
+    result = [serialize and lxml.etree.tounicode(elem) or elem
+              for elem in browser.etree.xpath(xpath)]
+    if not multiple:
+        print result[0]
+        return
+    for elem in result:
+        print elem
+
+FormDemoLayer = ZCMLLayer(
+    os.path.join(os.path.split(__file__)[0], 'ftesting.zcml'),
+    __name__, 'FormDemoLayer', allow_teardown=True)


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/testing.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: z3c.formdemo/trunk/src/z3c/formdemo/tests.py
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/tests.py	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/tests.py	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,40 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+__docformat__ = "reStructuredText"
+import os
+import unittest
+from zope.app.testing import functional
+from z3c.formdemo import testing
+
+def getRootFolder():
+    return functional.FunctionalTestSetup().getRootFolder()
+
+def test_suite():
+    suites = []
+    for docpath in (('message', 'README.txt'),
+                    ('widgets', 'README.txt'),
+                    ('questionnaire', 'README.txt'),
+                    ):
+        suite = functional.FunctionalDocFileSuite(
+            os.path.join(*docpath), globs={'getRootFolder': getRootFolder})
+        suite.layer = testing.FormDemoLayer
+        suites.append(suite)
+    return unittest.TestSuite(suites)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/tests.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: z3c.formdemo/trunk/src/z3c/formdemo/widgets/README.txt
===================================================================
--- z3c.formdemo/trunk/src/z3c/formdemo/widgets/README.txt	                        (rev 0)
+++ z3c.formdemo/trunk/src/z3c/formdemo/widgets/README.txt	2007-07-02 13:19:02 UTC (rev 77305)
@@ -0,0 +1,131 @@
+============
+Widgets Demo
+============
+
+The purpose of the widgets demo is demonstrate that there exists a widget for
+each standard field type and how it works.
+
+To start, we need to open a browser and go to the demo applications overview
+screen:
+
+  >>> from z3c.formdemo import testing
+  >>> from z3c.etestbrowser.testing import ExtendedTestBrowser
+  >>> user = ExtendedTestBrowser()
+  >>> user.addHeader('Accept-Language', 'en')
+  >>> user.open('http://localhost:8080')
+
+Since all demos are purely public, there is no need to log in. Let's now click
+on the "All widgets" link:
+
+  >>> user.getLink('All widgets').click()
+
+You are now in the widgets form. Let's now fill out all forms an submit the
+form:
+
+  >>> import cStringIO
+
+  >>> def addSelection(browser, name, value, selected=True):
+  ...     form = browser.mech_browser.forms().next()
+  ...     form.new_control(
+  ...         'select', name, attrs={'__select': {'name': name, 'size': '5'}})
+  ...     form.new_control(
+  ...         'select', name,
+  ...         attrs={'__select': {'name': name, 'size': '5'},
+  ...                'selected': 'selected', 'value': value})
+
+  >>> user.getControl('ASCII', index=0).value += u' Add on.'
+  >>> user.getControl('ASCII Line').value += u' Add on.'
+  >>> user.getControl('no', index=0).click() # Boolean
+  >>> user.getControl('Bytes', index=0).add_file(
+  ...     cStringIO.StringIO('File contents'), 'text/plain', 'test.txt')
+  >>> user.getControl('Bytes Line').value += u' Add on.'
+  >>> user.getControl('Choice', index=0).getControl('Two').click()
+  >>> user.getControl('Choice (Not Required)').getControl('Two').click()
+  >>> user.getControl('Choice (Explicit Prompt)').getControl('Two').click()
+  >>> user.getControl('Date', index=0).value = u'7/1/07'
+  >>> user.getControl('Date/Time').value = u'7/1/07 12:15 AM'
+  >>> user.getControl('Decimal').value = u'12439.986'
+  >>> user.getControl('Dotted Name').value += u'demo'
+  >>> user.getControl('Float').value += u'12439.986'
+  >>> user.getControl('Frozen Set').getControl('One').click()
+  >>> user.getControl('Id').value += u'demo'
+  >>> user.getControl('Integer').value = u'12439'
+  >>> addSelection(user, 'form.widgets.listField', u'1')
+  >>> user.getControl('Password').value = u'pwd'
+  >>> user.getControl('Set', index=1).getControl('One').click()
+  >>> user.getControl('Source Text').value += u' Add on.'
+  >>> user.getControl('Text', index=1).value += u' Add on.'
+  >>> user.getControl('Text Line').value += u' Add on.'
+  >>> user.getControl('Time', index=1).value = u'12:15 AM'
+  >>> user.getControl('Time Delta').value = u'4 days, 1:00:00'
+  >>> addSelection(user, 'form.widgets.tupleField', u'1')
+  >>> user.getControl('URI').value += u'/Documentation'
+  >>> user.getControl(name='form.widgets.hiddenField').value += u' Add on.'
+
+  >>> user.getControl('Apply').click()
+
+Once submitted, the same form returns with a data changed method:
+
+  >>> from z3c.formdemo import testing
+  >>> testing.printElement(user, "//div[@class='summary']")
+  <div class="summary">Data successfully updated.</div>
+
+Let's now ensure that the data has been truly uploaded:
+
+  >>> from z3c.formdemo.widgets import interfaces
+  >>> fields = interfaces.IAllFields(getRootFolder())
+
+  >>> fields.asciiField
+  'This is\n ASCII. Add on.'
+  >>> fields.asciiLineField
+  'An ASCII line. Add on.'
+  >>> fields.boolField
+  False
+  >>> fields.bytesField
+  'File contents'
+  >>> fields.bytesLineField
+  'A Bytes line. Add on.'
+  >>> fields.choiceField
+  2
+  >>> fields.optionalChoiceField
+  2
+  >>> fields.promptChoiceField
+  2
+  >>> fields.dateField
+  datetime.date(2007, 7, 1)
+  >>> fields.datetimeField
+  datetime.datetime(2007, 7, 1, 0, 15)
+  >>> fields.decimalField
+  Decimal("12439.986")
+  >>> fields.dottedNameField
+  'z3c.formdemo'
+  >>> fields.floatField
+  12.811999999999999
+  >>> fields.frozenSetField
+  frozenset([3])
+  >>> fields.idField
+  'z3c.formdemo'
+  >>> fields.intField
+  12439
+  >>> fields.listField
+  [1]
+  >>> fields.passwordField
+  u'pwd'
+  >>> fields.setField
+  set([3])
+  >>> fields.sourceTextField
+  u'<source /> Add on.'
+  >>> fields.textField
+  u'Some\n Text. Add on.'
+  >>> fields.textLineField
+  u'Some Text line. Add on.'
+  >>> fields.timeField
+  datetime.time(0, 15)
+  >>> fields.timedeltaField
+  datetime.timedelta(4, 3600)
+  >>> fields.tupleField
+  (1,)
+  >>> fields.uriField
+  'http://zope.org/Documentation'
+  >>> fields.hiddenField
+  u'Some Hidden Text. Add on.'


Property changes on: z3c.formdemo/trunk/src/z3c/formdemo/widgets/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list