[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/ - more content add views and tests

Yvo Schubbe y.2008 at wcm-solutions.de
Tue Nov 4 12:43:03 EST 2008


Log message for revision 92781:
  - more content add views and tests

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.py
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.txt
  D   Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/folder_utest.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/link.py
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/link.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/tests.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -48,7 +48,7 @@
 
 - Image, File:  make ZMI "edit" view work.
 
-- views: Added ContentAddFormBase and FileAddView.
+- views: Added ContentAddFormBase and several content add views.
   This shows how form-driven content creation works. The content is created
   without using the constructor methods provided by the types tool.
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml	2008-11-04 17:43:00 UTC (rev 92781)
@@ -78,6 +78,11 @@
 
   <adapter factory=".link.LinkSchemaAdapter"/>
 
+  <adapter
+      name="cmf.link"
+      factory=".link.LinkAddView"
+      />
+
   <browser:page
       for="..interfaces.ILink"
       layer="..interfaces.ICMFDefaultSkin"
@@ -97,6 +102,11 @@
 
   <adapter factory=".favorite.FavoriteSchemaAdapter"/>
 
+  <adapter
+      name="cmf.favorite"
+      factory=".favorite.FavoriteAddView"
+      />
+
   <browser:page
       for="..interfaces.IMutableFavorite"
       layer="..interfaces.ICMFDefaultSkin"
@@ -112,6 +122,11 @@
       factory=".file.FileAddView"
       />
 
+  <adapter
+      name="cmf.image"
+      factory=".file.FileAddView"
+      />
+
   <browser:page
       for="..interfaces.IMutableFile"
       layer="..interfaces.ICMFDefaultSkin"

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.py	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.py	2008-11-04 17:43:00 UTC (rev 92781)
@@ -17,19 +17,26 @@
 
 import urlparse
 
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
 from zope.app.form.browser import BytesWidget
 from zope.component import adapts
 from zope.formlib import form
 from zope.interface import implements
 from zope.interface import Interface
+from zope.schema import ASCIILine
 from zope.schema import BytesLine
+from zope.schema import Text
 from zope.schema import TextLine
 
 from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.formlib.form import ContentAddFormBase
 from Products.CMFDefault.formlib.form import ContentEditFormBase
 from Products.CMFDefault.formlib.schema import ProxyFieldProperty
 from Products.CMFDefault.formlib.schema import SchemaAdapterBase
+from Products.CMFDefault.formlib.widgets import IDInputWidget
 from Products.CMFDefault.interfaces import IMutableFavorite
+from Products.CMFDefault.permissions import AddPortalContent
 from Products.CMFDefault.utils import Message as _
 
 
@@ -37,9 +44,20 @@
 
     title = TextLine(
         title=_(u'Title'),
-        description=_(u'Title'),
-        readonly=True)
+        required=False,
+        missing_value=u'')
 
+    language = TextLine(
+        title=_(u'Language'),
+        required=False,
+        missing_value=u'',
+        max_length=2)
+
+    description = Text(
+        title=_(u'Description'),
+        required=False,
+        missing_value=u'')
+
     remote_url = BytesLine(
         title=_(u'URL'),
         description=_(u'URL relative to the site root.'),
@@ -61,7 +79,11 @@
         self._remote_url = value
         self.context.remote_uid = self.context._getUidByUrl()
 
-    title = ProxyFieldProperty(IFavoriteSchema['title'], 'Title')
+    title = ProxyFieldProperty(IFavoriteSchema['title'], 'Title', 'setTitle')
+    language = ProxyFieldProperty(IFavoriteSchema['language'],
+                                  'Language', 'setLanguage')
+    description = ProxyFieldProperty(IFavoriteSchema['description'],
+                                     'Description', 'setDescription')
     remote_url = property(_getRemoteURL, _setRemoteURL)
 
 
@@ -81,8 +103,9 @@
             tokens = ('', '') + tokens[2:]
             value = urlparse.urlunparse(tokens)
         # if URL begins with site URL, remove site URL
-        obj = self.context.context.context
-        portal_url = getToolByName(obj, 'portal_url').getPortalPath()
+        context = getattr(self.context.context, 'context',
+                          self.context.context)
+        portal_url = getToolByName(context, 'portal_url').getPortalPath()
         if value.startswith(portal_url):
             value = value[len(portal_url):]
         # if site is still absolute, make it relative
@@ -91,10 +114,47 @@
         return value
 
 
+class FavoriteAddView(ContentAddFormBase):
+
+    """Add view for IMutableFavorite.
+    """
+
+    security = ClassSecurityInfo()
+    security.declareObjectProtected(AddPortalContent)
+
+    form_fields = (
+        form.FormFields(ASCIILine(__name__='id', title=_(u'ID'))) +
+        form.FormFields(IFavoriteSchema).omit('language')
+        )
+    form_fields['id'].custom_widget = IDInputWidget
+    form_fields['remote_url'].custom_widget = FavoriteURIWidget
+
+    def setUpWidgets(self, ignore_request=False):
+        super(FavoriteAddView,
+              self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['description'].height = 3
+
+    def create(self, data):
+        obj = super(FavoriteAddView, self).create(dict(id=data['id']))
+        adapted = IFavoriteSchema(obj)
+        adapted.title = data['title']
+        adapted.language = u''
+        adapted.description = data['description']
+        adapted.remote_url = data['remote_url']
+        return obj
+
+InitializeClass(FavoriteAddView)
+
+
 class FavoriteEditView(ContentEditFormBase):
 
     """Edit view for IMutableFavorite.
     """
 
-    form_fields = form.FormFields(IFavoriteSchema)
+    form_fields = form.FormFields(IFavoriteSchema).omit('language')
     form_fields['remote_url'].custom_widget = FavoriteURIWidget
+
+    def setUpWidgets(self, ignore_request=False):
+        super(FavoriteEditView,
+              self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['description'].height = 3

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -0,0 +1,57 @@
+Favorite Views
+--------------
+
+Set up user.
+
+    >>> uf = app.site.acl_users
+    >>> uf._doAddUser('mgr', 'mgrpw', ['Manager'], [])
+
+Create the browser object we'll be using.
+
+    >>> from Products.Five.testbrowser import Browser
+    >>> browser = Browser()
+    >>> browser.handleErrors = False
+    >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+
+Use the add form without input.
+
+    >>> browser.open('http://localhost/site/++add++Favorite')
+    >>> '[[cmf_default][Add [[cmf_default][Favorite]]]]' in browser.contents
+    True
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
+
+Use the add form with valid input.
+
+    >>> browser.open('http://localhost/site/++add++Favorite')
+    >>> '[[cmf_default][Add [[cmf_default][Favorite]]]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.id').value = 'myFavorite'
+    >>> browser.getControl(name='form.title').value = 'FAVORITE TITLE'
+    >>> browser.getControl(name='form.description').value = 'FAVORITE DESCRIPTION.'
+    >>> browser.getControl(name='form.remote_url').value = 'PATH/TO/ITEM'
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[cmf_default][[[cmf_default][Favorite]] added.]]' in browser.contents
+    True
+
+Use the edit form without input.
+
+    >>> browser.open('http://localhost/site/myFavorite/@@edit.html')
+    >>> '[[cmf_default][Edit [[cmf_default][Favorite]]]]' in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Nothing to change.]]' in browser.contents
+    True
+
+Use the edit form with valid input.
+
+    >>> browser.open('http://localhost/site/myFavorite/@@edit.html')
+    >>> '[[cmf_default][Edit [[cmf_default][Favorite]]]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.remote_url').value = 'PATH/TO/OTHER'
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][[[cmf_default][Favorite]] changed.]]' in browser.contents
+    True


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/favorite.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Deleted: Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -1,109 +0,0 @@
-Browser Views for IFolderish
-
-
-  The required environment:
-
-    Setting up a dummy site with required tools::
-
-      >>> from Products.CMFCore.tests.base.dummy import DummySite
-      >>> site = DummySite('site')
-
-      >>> from Products.CMFCore.tests.base.dummy import DummyTool
-      >>> from zope.component import getSiteManager
-      >>> from Products.CMFCore.interfaces import IPropertiesTool
-      >>> sm = getSiteManager()
-      >>> mtool = site._setObject('portal_membership', DummyTool())
-      >>> ptool = site._setObject('portal_properties', DummyTool())
-      >>> sm.registerUtility(ptool, IPropertiesTool)
-      >>> ttool = site._setObject('portal_types', DummyTool())
-      >>> utool = site._setObject('portal_url', DummyTool())
-
-
-  Basic functionality without security setup:
-
-    Setting up a simple request and an empty context object::
-
-      >>> class DummyRequest(dict):
-      ...     def __init__(self):
-      ...         self['ACTUAL_URL'] = 'actual_url'
-      ...         self.form = {}
-      >>> request = DummyRequest()
-
-      >>> from Products.CMFCore.PortalFolder import PortalFolder
-      >>> context = PortalFolder('foo').__of__(site)
-
-    The FolderView interface used by templates::
-
-      >>> from Products.CMFDefault.browser.folder import FolderView
-      >>> view = FolderView(context, request)
-
-      >>> view.title()
-      u''
-
-      >>> view.description()
-      u''
-
-      >>> view.has_local()
-      False
-
-    The FolderContentsView interface used by templates::
-
-      >>> from Products.CMFDefault.browser.folder import FolderContentsView
-      >>> view = FolderContentsView(context, request)
-
-      >>> view.title()
-      u''
-
-      >>> view.description()
-      u''
-
-      >>> view.up_info()
-      {'url': u'', 'id': u'Root', 'icon': u''}
-
-      >>> view.listColumnInfos()
-      ({'url': 'actual_url?key=Type', 'width': '20', 'colspan': '2',
-        'key': 'Type', 'title': u'Type'},
-       {'url': 'actual_url?key=getId', 'width': '360', 'colspan': None,
-        'key': 'getId', 'title': u'Name'},
-       {'url': 'actual_url?key=modified', 'width': '180', 'colspan': None,
-        'key': 'modified', 'title': u'Last Modified'},
-       {'url': 'actual_url?key=position', 'width': '80', 'colspan': None,
-        'key': 'position', 'title': u'Position'})
-
-      >>> view.listItemInfos()
-      ()
-
-      >>> view.listDeltas()
-      ()
-
-      >>> view.is_orderable()
-      False
-
-      >>> view.is_sortable()
-      False
-
-    The FolderContentsView checkers used by button actions::
-
-      >>> view.checkAllowedContentTypes()
-      True
-
-      >>> view.checkClipboardData()
-      False
-
-      >>> view.checkItems()
-      False
-
-    The FolderContentsView validators used by button actions::
-
-      >>> view.validateItemIds()
-      (False, u'Please select one or more items first.')
-      >>> view.validateItemIds(('foo',))
-      True
-
-      >>> view.validateClipboardData()
-      (False, u'Please copy or cut one or more items to paste first.')
-
-    Finally we have to clean up::
-
-      >>> from zope.testing.cleanup import cleanUp
-      >>> cleanUp()

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -0,0 +1,42 @@
+Folder Views
+------------
+
+Set up user.
+
+    >>> uf = app.site.acl_users
+    >>> uf._doAddUser('mgr', 'mgrpw', ['Manager'], [])
+
+Create the browser object we'll be using.
+
+    >>> from Products.Five.testbrowser import Browser
+    >>> browser = Browser()
+    >>> browser.handleErrors = False
+    >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+
+Use the add form without input.
+
+    >>> browser.open('http://localhost/site/++add++Folder')
+    >>> '[[cmf_default][Add [[cmf_default][Folder]]]]' in browser.contents
+    True
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
+
+Use the add form with valid input.
+
+    >>> from StringIO import StringIO
+    >>> browser.open('http://localhost/site/++add++Folder')
+    >>> '[[cmf_default][Add [[cmf_default][Folder]]]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.id').value = 'myFolder'
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[cmf_default][[[cmf_default][Folder]] added.]]' in browser.contents
+    True
+
+Use the folder contents form without input.
+
+    >>> browser.open('http://localhost/site/myFolder/@@edit.html')
+    >>> '[[cmf_default][Folder Contents: ]]' in browser.contents
+    True


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: Products.CMFDefault/trunk/Products/CMFDefault/browser/folder_utest.txt (from rev 91532, Products.CMFDefault/trunk/Products/CMFDefault/browser/folder.txt)
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/folder_utest.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/folder_utest.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -0,0 +1,109 @@
+Browser Views for IFolderish
+
+
+  The required environment:
+
+    Setting up a dummy site with required tools::
+
+      >>> from Products.CMFCore.tests.base.dummy import DummySite
+      >>> site = DummySite('site')
+
+      >>> from Products.CMFCore.tests.base.dummy import DummyTool
+      >>> from zope.component import getSiteManager
+      >>> from Products.CMFCore.interfaces import IPropertiesTool
+      >>> sm = getSiteManager()
+      >>> mtool = site._setObject('portal_membership', DummyTool())
+      >>> ptool = site._setObject('portal_properties', DummyTool())
+      >>> sm.registerUtility(ptool, IPropertiesTool)
+      >>> ttool = site._setObject('portal_types', DummyTool())
+      >>> utool = site._setObject('portal_url', DummyTool())
+
+
+  Basic functionality without security setup:
+
+    Setting up a simple request and an empty context object::
+
+      >>> class DummyRequest(dict):
+      ...     def __init__(self):
+      ...         self['ACTUAL_URL'] = 'actual_url'
+      ...         self.form = {}
+      >>> request = DummyRequest()
+
+      >>> from Products.CMFCore.PortalFolder import PortalFolder
+      >>> context = PortalFolder('foo').__of__(site)
+
+    The FolderView interface used by templates::
+
+      >>> from Products.CMFDefault.browser.folder import FolderView
+      >>> view = FolderView(context, request)
+
+      >>> view.title()
+      u''
+
+      >>> view.description()
+      u''
+
+      >>> view.has_local()
+      False
+
+    The FolderContentsView interface used by templates::
+
+      >>> from Products.CMFDefault.browser.folder import FolderContentsView
+      >>> view = FolderContentsView(context, request)
+
+      >>> view.title()
+      u''
+
+      >>> view.description()
+      u''
+
+      >>> view.up_info()
+      {'url': u'', 'id': u'Root', 'icon': u''}
+
+      >>> view.listColumnInfos()
+      ({'url': 'actual_url?key=Type', 'width': '20', 'colspan': '2',
+        'key': 'Type', 'title': u'Type'},
+       {'url': 'actual_url?key=getId', 'width': '360', 'colspan': None,
+        'key': 'getId', 'title': u'Name'},
+       {'url': 'actual_url?key=modified', 'width': '180', 'colspan': None,
+        'key': 'modified', 'title': u'Last Modified'},
+       {'url': 'actual_url?key=position', 'width': '80', 'colspan': None,
+        'key': 'position', 'title': u'Position'})
+
+      >>> view.listItemInfos()
+      ()
+
+      >>> view.listDeltas()
+      ()
+
+      >>> view.is_orderable()
+      False
+
+      >>> view.is_sortable()
+      False
+
+    The FolderContentsView checkers used by button actions::
+
+      >>> view.checkAllowedContentTypes()
+      True
+
+      >>> view.checkClipboardData()
+      False
+
+      >>> view.checkItems()
+      False
+
+    The FolderContentsView validators used by button actions::
+
+      >>> view.validateItemIds()
+      (False, u'Please select one or more items first.')
+      >>> view.validateItemIds(('foo',))
+      True
+
+      >>> view.validateClipboardData()
+      (False, u'Please copy or cut one or more items to paste first.')
+
+    Finally we have to clean up::
+
+      >>> from zope.testing.cleanup import cleanUp
+      >>> cleanUp()


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/folder_utest.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/link.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/link.py	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/link.py	2008-11-04 17:43:00 UTC (rev 92781)
@@ -17,18 +17,25 @@
 
 import urlparse
 
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
 from zope.app.form.browser import BytesWidget
 from zope.component import adapts
 from zope.formlib import form
 from zope.interface import implements
 from zope.interface import Interface
+from zope.schema import ASCIILine
 from zope.schema import BytesLine
+from zope.schema import Text
 from zope.schema import TextLine
 
+from Products.CMFDefault.formlib.form import ContentAddFormBase
 from Products.CMFDefault.formlib.form import ContentEditFormBase
 from Products.CMFDefault.formlib.schema import ProxyFieldProperty
 from Products.CMFDefault.formlib.schema import SchemaAdapterBase
+from Products.CMFDefault.formlib.widgets import IDInputWidget
 from Products.CMFDefault.interfaces import IMutableLink
+from Products.CMFDefault.permissions import AddPortalContent
 from Products.CMFDefault.utils import Message as _
 
 from utils import decode
@@ -40,9 +47,20 @@
 
     title = TextLine(
         title=_(u'Title'),
-        description=_(u'Title'),
-        readonly=True)
+        required=False,
+        missing_value=u'')
 
+    language = TextLine(
+        title=_(u'Language'),
+        required=False,
+        missing_value=u'',
+        max_length=2)
+
+    description = Text(
+        title=_(u'Description'),
+        required=False,
+        missing_value=u'')
+
     remote_url = BytesLine(
         title=_(u'URL'),
         required=False,
@@ -54,7 +72,11 @@
     adapts(IMutableLink)
     implements(ILinkSchema)
 
-    title = ProxyFieldProperty(ILinkSchema['title'], 'Title')
+    title = ProxyFieldProperty(ILinkSchema['title'], 'Title', 'setTitle')
+    language = ProxyFieldProperty(ILinkSchema['language'],
+                                  'Language', 'setLanguage')
+    description = ProxyFieldProperty(ILinkSchema['description'],
+                                     'Description', 'setDescription')
     remote_url = ProxyFieldProperty(ILinkSchema['remote_url'])
 
 
@@ -97,10 +119,45 @@
             return urlparse.urlunparse(tokens)
 
 
+class LinkAddView(ContentAddFormBase):
+
+    """Add view for IMutableLink.
+    """
+
+    security = ClassSecurityInfo()
+    security.declareObjectProtected(AddPortalContent)
+
+    form_fields = (
+        form.FormFields(ASCIILine(__name__='id', title=_(u'ID'))) +
+        form.FormFields(ILinkSchema).omit('language')
+        )
+    form_fields['id'].custom_widget = IDInputWidget
+    form_fields['remote_url'].custom_widget = LinkURIWidget
+
+    def setUpWidgets(self, ignore_request=False):
+        super(LinkAddView, self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['description'].height = 3
+
+    def create(self, data):
+        obj = super(LinkAddView, self).create(dict(id=data['id']))
+        adapted = ILinkSchema(obj)
+        adapted.title = data['title']
+        adapted.language = u''
+        adapted.description = data['description']
+        adapted.remote_url = data['remote_url']
+        return obj
+
+InitializeClass(LinkAddView)
+
+
 class LinkEditView(ContentEditFormBase):
 
     """Edit view for IMutableLink.
     """
 
-    form_fields = form.FormFields(ILinkSchema)
+    form_fields = form.FormFields(ILinkSchema).omit('language')
     form_fields['remote_url'].custom_widget = LinkURIWidget
+
+    def setUpWidgets(self, ignore_request=False):
+        super(LinkEditView, self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['description'].height = 3

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/link.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/link.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/link.txt	2008-11-04 17:43:00 UTC (rev 92781)
@@ -0,0 +1,57 @@
+Link Views
+----------
+
+Set up user.
+
+    >>> uf = app.site.acl_users
+    >>> uf._doAddUser('mgr', 'mgrpw', ['Manager'], [])
+
+Create the browser object we'll be using.
+
+    >>> from Products.Five.testbrowser import Browser
+    >>> browser = Browser()
+    >>> browser.handleErrors = False
+    >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+
+Use the add form without input.
+
+    >>> browser.open('http://localhost/site/++add++Link')
+    >>> '[[cmf_default][Add [[cmf_default][Link]]]]' in browser.contents
+    True
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Required input is missing.]]' in browser.contents
+    True
+
+Use the add form with valid input.
+
+    >>> browser.open('http://localhost/site/++add++Link')
+    >>> '[[cmf_default][Add [[cmf_default][Link]]]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.id').value = 'myLink'
+    >>> browser.getControl(name='form.title').value = 'LINK TITLE'
+    >>> browser.getControl(name='form.description').value = 'LINK DESCRIPTION.'
+    >>> browser.getControl(name='form.remote_url').value = 'WWW.EXAMPLE.ORG'
+    >>> browser.getControl('[[zope][Add]]').click()
+    >>> '[[cmf_default][[[cmf_default][Link]] added.]]' in browser.contents
+    True
+
+Use the edit form without input.
+
+    >>> browser.open('http://localhost/site/myLink/@@edit.html')
+    >>> '[[cmf_default][Edit [[cmf_default][Link]]]]' in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][Nothing to change.]]' in browser.contents
+    True
+
+Use the edit form with valid input.
+
+    >>> browser.open('http://localhost/site/myLink/@@edit.html')
+    >>> '[[cmf_default][Edit [[cmf_default][Link]]]]' in browser.contents
+    True
+    >>> browser.getControl(name='form.remote_url').value = 'WWW.EXAMPLE.COM'
+    >>> browser.getControl('[[cmf_default][Change]]').click()
+    >>> '[[cmf_default][[[cmf_default][Link]] changed.]]' in browser.contents
+    True


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/link.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/tests.py	2008-11-04 17:17:42 UTC (rev 92780)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/tests.py	2008-11-04 17:43:00 UTC (rev 92781)
@@ -24,17 +24,26 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    suite.addTest(doctest.DocFileSuite('folder.txt',
+    suite.addTest(doctest.DocFileSuite('folder_utest.txt',
                                     optionflags=doctest.NORMALIZE_WHITESPACE))
+    s = ZopeTestCase.FunctionalDocFileSuite('folder.txt')
+    s.layer = FunctionalLayer
+    suite.addTest(s)
     s = ZopeTestCase.FunctionalDocFileSuite('metadata.txt')
     s.layer = FunctionalLayer
     suite.addTest(s)
     s = ZopeTestCase.FunctionalDocFileSuite('document.txt')
     s.layer = FunctionalLayer
     suite.addTest(s)
+    s = ZopeTestCase.FunctionalDocFileSuite('favorite.txt')
+    s.layer = FunctionalLayer
+    suite.addTest(s)
     s = ZopeTestCase.FunctionalDocFileSuite('file.txt')
     s.layer = FunctionalLayer
     suite.addTest(s)
+    s = ZopeTestCase.FunctionalDocFileSuite('link.txt')
+    s.layer = FunctionalLayer
+    suite.addTest(s)
     return suite
 
 if __name__ == '__main__':



More information about the Checkins mailing list