[Checkins] SVN: z3ext.statusmessage/trunk/s tests updated
Nikolay Kim
fafhrd at datacom.kz
Thu Nov 20 11:06:30 EST 2008
Log message for revision 93178:
tests updated
Changed:
U z3ext.statusmessage/trunk/setup.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/README.txt
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/__init__.py
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/ftesting.zcml
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/test.pt
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/testbrowser.txt
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/tests.py
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/view.py
D z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py
-=-
Modified: z3ext.statusmessage/trunk/setup.py
===================================================================
--- z3ext.statusmessage/trunk/setup.py 2008-11-20 16:03:21 UTC (rev 93177)
+++ z3ext.statusmessage/trunk/setup.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -21,7 +21,7 @@
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-version = '1.2.2dev'
+version = '1.3.0dev'
setup(name='z3ext.statusmessage',
@@ -64,6 +64,9 @@
],
extras_require = dict(test=['zope.app.testing',
'zope.testing',
+ 'zope.testbrowser',
+ 'zope.app.zcmlfiles',
+ 'zope.securitypolicy',
]),
include_package_data = True,
zip_safe = False
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/README.txt
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/README.txt 2008-11-20 16:03:21 UTC (rev 93177)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/README.txt 2008-11-20 16:06:30 UTC (rev 93178)
@@ -3,7 +3,7 @@
=====================
Instead include notification messages directly to template,
- developer can use messaging service.
+developer can use messaging service.
Main interface is IStatusMessage, it is adapter for IBrowserRequest
so we can have different implementations, for example cookie based or session.
@@ -13,20 +13,19 @@
>>> from zope import interface, component
>>> from zope.interface.verify import verifyClass
- >>> from z3ext.statusmessage import tests
- >>> from z3ext.statusmessage import interfaces, session, message, browser
+ >>> from z3ext.statusmessage import interfaces, session, message
- >>> verifyClass(interfaces.IStatusMessage, session.SessionMessageService)
+ >>> verifyClass(interfaces.IStatusMessage, session.MessageService)
True
- >>> component.provideAdapter(session.getSessionMessageService)
+ >>> component.provideAdapter(session.MessageService)
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> service = interfaces.IStatusMessage(request)
- >>> service.hasMessages()
+ >>> bool(service)
False
>>> service.add('Test message')
@@ -40,123 +39,61 @@
Before we can use message service we need register message type.
- >>> verifyClass(interfaces.IMessage, message.InformationMessage)
- True
+ >>> component.provideAdapter(message.InformationMessage, name='info')
- >>> component.provideUtility(message.InformationMessage,
- ... interfaces.IMessageFactory, 'info')
+ >>> msg = component.getAdapter(request, interfaces.IMessage, 'info')
+ >>> msg.render('Test message')
+ '<div class="statusMessage">Test message</div>'
Now we can add messages.
>>> service.add('Test message')
- >>> service.hasMessages()
+ >>> bool(service)
True
- >>> service.list()
- [<z3ext.statusmessage.message.InformationMessage ...>]
+ >>> service.messages()
+ ['<div class="statusMessage">Test message</div>']
Let's register another message type.
- >>> verifyClass(interfaces.IMessage, message.WarningMessage)
- True
+ >>> component.provideAdapter(message.WarningMessage, name='warning')
- >>> component.provideUtility(message.WarningMessage,
- ... interfaces.IMessageFactory, 'warning')
-
>>> service.add('Warning message', 'warning')
- >>> service.list()
- [<...InformationMessage ...>, <...WarningMessage ...>]
+ >>> service.messages()
+ ['<div class="statusMessage">Test message</div>', '<div class="statusWarningMessage">Warning message</div>']
-Also we can add message directly
-
- >>> verifyClass(interfaces.IMessage, message.ErrorMessage)
- True
-
Error message, we can add exception object
- >>> service.addMessage(message.ErrorMessage(Exception('Error message')))
+ >>> component.provideAdapter(message.ErrorMessage, name='error')
+ >>> service.add(Exception('Error message'), 'error')
+
or text message
- >>> service.addMessage(message.ErrorMessage('Error message'))
+ >>> service.add('Error message', 'error')
- >>> service.list()
- [<...InformationMessage ...>, <...WarningMessage ...>, <...ErrorMessage ...>, <...ErrorMessage ...>]
-
-
-Message renderes
-----------------
-
-We should provider IMesasgeView adater for each message type.
-
- >>> msg = service.list()[0]
- >>> renderer = component.getMultiAdapter((msg, request), interfaces.IMessageView)
- >>> renderer.render()
- '<div class="statusMessage">Test message</div>'
-
-Same for other mesages
-
- >>> msg = service.list()[1]
- >>> renderer = component.getMultiAdapter((msg, request), interfaces.IMessageView)
- >>> renderer.render()
- '<div class="statusWarningMessage">Warning message</div>'
-
- >>> msg = service.list()[2]
- >>> renderer = component.getMultiAdapter((msg, request), interfaces.IMessageView)
- >>> renderer.render()
- '<div class="statusStopMessage">Exception: Error message</div>'
-
-To render all messages, we can use 'statusMessage' content provider.
-Also 'statusMessage' provider clears service
-
- >>> from zope.contentprovider.interfaces import IContentProvider
- >>> renderer = component.getMultiAdapter(
- ... (None, request, None), IContentProvider, 'statusMessage')
- >>> renderer.update()
- >>> print renderer.render()
+ >>> for msg in service.messages():
+ ... print msg
<div class="statusMessage">Test message</div>
<div class="statusWarningMessage">Warning message</div>
<div class="statusStopMessage">Exception: Error message</div>
<div class="statusStopMessage">Error message</div>
- >>> service.hasMessages()
- False
-It is possible to add new messages to service with 'statusMessages' provider
-
- >>> renderer.add('Test message')
- >>> service.list()
- [<...InformationMessage ...>]
-
-With different type:
-
- >>> renderer.add('Warning message', 'warning')
- >>> service.list()
- [<...InformationMessage ...>, <...WarningMessage ...>]
-
- >>> renderer.addIf('')
- >>> len(service.list())
- 2
-
- >>> renderer.addIf('test')
- >>> len(service.list())
- 3
-
- >>> t = service.clear()
-
-
Clearing service
----------------
clear() method return all messages and clear service.
- >>> service.addMessage(message.ErrorMessage('Error message'))
+ >>> for msg in service.clear():
+ ... print msg
+ <div class="statusMessage">Test message</div>
+ <div class="statusWarningMessage">Warning message</div>
+ <div class="statusStopMessage">Exception: Error message</div>
+ <div class="statusStopMessage">Error message</div>
- >>> service.clear()
- [<...ErrorMessage ...>]
-
- >>> service.hasMessages()
+ >>> bool(service)
False
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py 2008-11-20 16:03:21 UTC (rev 93177)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -33,5 +33,11 @@
def add(text, type='info'):
""" add message text as message to service """
+ def clear():
+ """ return all mesasges and clear """
+
+ def messages():
+ """ return all messages """
+
def __nonzero__():
""" check is service has messages """
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py 2008-11-20 16:03:21 UTC (rev 93177)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -55,11 +55,15 @@
return messages
return ()
- def __nonzero__(self):
- session = ISession(request, None)
+ def messages(self):
+ session = ISession(self.request, None)
if session is not None:
data = session.get(SESSIONKEY)
- if data:
- return len(data.get('messages', ())) > 0
- else:
- return False
+ if data is not None:
+ messages = data.get('messages')
+ if messages:
+ return messages
+ return ()
+
+ def __nonzero__(self):
+ return bool(self.messages())
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/__init__.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/__init__.py (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/__init__.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1 @@
+# This file is necessary to make this directory a package.
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/ftesting.zcml
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/ftesting.zcml (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/ftesting.zcml 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1,78 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser">
+
+ <!-- This file is the equivalent of site.zcml and it is -->
+ <!-- used for functional testing setup -->
+
+ <include package="zope.component" file="meta.zcml" />
+ <include package="zope.securitypolicy" file="meta.zcml" />
+ <include package="zope.app.component" file="meta.zcml" />
+ <include package="zope.app.security" file="meta.zcml" />
+ <include package="zope.app.pagetemplate" file="meta.zcml" />
+
+ <include package="zope.securitypolicy" />
+ <include package="zope.app.security" />
+ <include package="zope.app.zcmlfiles" />
+ <include package="zope.app.authentication" />
+
+ <include package="z3c.autoinclude" file="meta.zcml" />
+ <include package="z3ext.statusmessage" />
+
+ <browser:page
+ for="*"
+ name="test.html"
+ class="z3ext.statusmessage.tests.view.TestView"
+ permission="zope.Public" />
+
+ <browser:page
+ for="*"
+ name="test1.html"
+ class="z3ext.statusmessage.tests.view.TestView"
+ attribute="test"
+ permission="zope.Public" />
+
+ <browser:page
+ for="*"
+ name="test2.html"
+ class="z3ext.statusmessage.tests.view.TestView"
+ attribute="redirect"
+ permission="zope.Public" />
+
+ <securityPolicy
+ component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+ <role id="zope.Anonymous" title="Everybody"
+ description="All users have this role implicitly" />
+ <role id="zope.Manager" title="Site Manager" />
+
+ <!-- Replace the following directive if you don't want public access -->
+ <grant permission="zope.View"
+ role="zope.Anonymous" />
+
+ <grant permission="zope.app.dublincore.view"
+ role="zope.Anonymous" />
+
+ <!-- Principals -->
+ <unauthenticatedPrincipal
+ id="zope.anybody"
+ title="Unauthenticated User" />
+
+ <!-- Principal that tests generally run as -->
+ <principal
+ id="zope.mgr"
+ title="Manager"
+ login="mgr"
+ password="mgrpw" />
+
+ <principal
+ id="zope.user"
+ title="User"
+ login="user"
+ password="userpw" />
+
+ <grant role="zope.Manager" principal="zope.mgr" />
+
+ <grantAll role="zope.Manager" />
+
+</configure>
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/test.pt
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/test.pt (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/test.pt 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ <div tal:content="structure provider:statusMessage" />
+ </body>
+</html>
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/testbrowser.txt
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/testbrowser.txt (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/testbrowser.txt 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1,32 @@
+======================
+Render Status Messages
+======================
+
+ >>> from zope.testbrowser.testing import Browser
+
+ >>> actor = Browser()
+ >>> actor.addHeader("Authorization", "Basic mgr:mgrpw")
+ >>> actor.handleErrors = False
+
+Render message in current request
+
+ >>> actor.open("http://localhost/test1.html")
+ >>> print actor.contents
+ <html>
+ <body>
+ <div><div class="statusMessage">Test message</div></div>
+ </body>
+ </html>
+
+Render message in next request after redirect
+
+ >>> actor.open("http://localhost/test2.html")
+ >>> actor.url
+ 'http://localhost/test.html'
+
+ >>> print actor.contents
+ <html>
+ <body>
+ <div><div class="statusMessage">Test message with redirect</div></div>
+ </body>
+ </html>
Copied: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/tests.py (from rev 93154, z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py)
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/tests.py (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/tests.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1,74 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation 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.
+#
+##############################################################################
+""" z3ext.statusmessage tests
+
+$Id$
+"""
+import os, unittest, doctest
+from zope.app.testing import setup
+
+from zope import interface, component
+from zope.component import provideAdapter
+from zope.session.interfaces import ISession
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.app.testing.functional import ZCMLLayer
+from zope.app.testing.functional import FunctionalDocFileSuite
+from z3ext.statusmessage import message
+
+
+statusmessageLayer = ZCMLLayer(
+ os.path.join(os.path.split(__file__)[0], 'ftesting.zcml'),
+ __name__, 'statusmessageLayer', allow_teardown=True)
+
+
+class Session(dict):
+
+ def __getitem__(self, key):
+ if not self.has_key(key):
+ self[key] = {}
+
+ return super(Session, self).__getitem__(key)
+
+session = Session()
+
+ at interface.implementer(ISession)
+ at component.adapter(IBrowserRequest)
+def getSession(request):
+ return session
+
+
+def setUp(test):
+ setup.placelessSetUp()
+ component.provideAdapter(getSession)
+ component.provideAdapter(message.StatusMessage, name='statusMessage')
+
+
+def tearDown(test):
+ session.__init__()
+ setup.placelessTearDown()
+
+
+def test_suite():
+ testbrowser = FunctionalDocFileSuite(
+ "testbrowser.txt",
+ optionflags=doctest.ELLIPSIS|doctest.NORMALIZE_WHITESPACE)
+ testbrowser.layer = statusmessageLayer
+
+ return unittest.TestSuite((
+ testbrowser,
+ doctest.DocFileSuite(
+ '../README.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+ ))
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/view.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/view.py (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests/view.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -0,0 +1,35 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation 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: 2007-12-12 12:27:02Z fafhrd $
+"""
+from zope.app.pagetemplate import ViewPageTemplateFile
+from z3ext.statusmessage.interfaces import IStatusMessage
+
+
+class TestView(object):
+
+ index = ViewPageTemplateFile('test.pt')
+
+ def __call__(self):
+ return self.index()
+
+ def test(self):
+ IStatusMessage(self.request).add('Test message')
+ return self.index()
+
+ def redirect(self):
+ IStatusMessage(self.request).add('Test message with redirect')
+ self.request.response.redirect('test.html')
Deleted: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py 2008-11-20 16:03:21 UTC (rev 93177)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py 2008-11-20 16:06:30 UTC (rev 93178)
@@ -1,69 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation 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.
-#
-##############################################################################
-""" z3ext.statusmessage tests
-
-$Id$
-"""
-__docformat__ = "reStructuredText"
-
-import unittest, doctest
-from zope.app.testing import setup
-
-from zope import interface, component
-from zope.component import provideAdapter
-from zope.session.interfaces import ISession
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.component import provideUtility
-
-import browser
-
-
-class Session(dict):
-
- def __getitem__(self, key):
- if not self.has_key(key):
- self[key] = {}
-
- return super(Session, self).__getitem__(key)
-
-session = Session()
-
- at interface.implementer(ISession)
- at component.adapter(IBrowserRequest)
-def getSession(request):
- return session
-
-
-def setUp(test):
- setup.placelessSetUp()
- provideAdapter(getSession)
- provideAdapter(browser.StatusMessage, name='statusMessage')
- provideAdapter(browser.Message)
- provideAdapter(browser.InformationMessage)
- provideAdapter(browser.ErrorMessage)
- provideAdapter(browser.WarningMessage)
-
-
-def tearDown(test):
- session.__init__()
- setup.placelessTearDown()
-
-
-def test_suite():
- return unittest.TestSuite((
- doctest.DocFileSuite(
- 'README.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
- ))
More information about the Checkins
mailing list