[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