[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