[Checkins] SVN: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/ Fix and add more tests (specially about security).

Sylvain Viollon sylvain at infrae.com
Mon Nov 23 09:55:04 EST 2009


Log message for revision 105963:
  Fix and add more tests (specially about security).
  

Changed:
  U   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/layout.py
  U   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/page.py
  A   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity.py
  A   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity_templates/
  A   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity_templates/master.pt
  U   five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/resources.py

-=-
Modified: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/layout.py
===================================================================
--- five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/layout.py	2009-11-23 14:21:17 UTC (rev 105962)
+++ five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/layout.py	2009-11-23 14:55:03 UTC (rev 105963)
@@ -3,23 +3,34 @@
   >>> from five.megrok.layout.ftests.layout.layout import *
   >>> from zope.component import getMultiAdapter
   >>> from zope.publisher.browser import TestRequest
+  >>> from zope.interface.verify import verifyObject
 
   >>> request = TestRequest()
-  >>> mammoth = Mammoth()
+
+You can create a context object and as a layout for it:
+
+  >>> mammoth = Mammoth('arthur')
   >>> mylayout = getMultiAdapter((request, mammoth), ILayout)
-  >>> ILayout.providedBy(mylayout)
+  >>> mylayout
+  <five.megrok.layout.ftests.layout.layout.MyLayout object at ...>
+  >>> verifyObject(ILayout, mylayout)
   True
-
-  >>> mylayout.context
-  <five.megrok.layout.ftests.layout.layout.Mammoth object at ...>
-
+  >>> mylayout.context.aq_base
+  <Mammoth at arthur>
   >>> mylayout.render()
   '<div> MyLayout </div>'
 
-  >>> elephant = Elephant()
+The layout can be different depending of the context:
+
+  >>> elephant = Elephant('paul')
   >>> mycontextlayout = getMultiAdapter((request, elephant), ILayout)
+  >>> mycontextlayout
+  <five.megrok.layout.ftests.layout.layout.MyContextLayout object at ...>
+  >>> mycontextlayout.context.aq_base
+  <Elephant at paul>
   >>> mycontextlayout.render()
   '<div> MyContextLayout </div>'
+
 """
 
 from five import grok
@@ -28,11 +39,11 @@
 from five.megrok.layout import Layout
 
 
-class Mammoth(grok.Context):
+class Mammoth(grok.Model):
     pass
 
 
-class Elephant(grok.Context):
+class Elephant(grok.Model):
     pass
 
 
@@ -40,12 +51,12 @@
     grok.context(interface.Interface)
 
     def render(self):
-	return "<div> MyLayout </div>"
+        return "<div> MyLayout </div>"
 
 
 class MyContextLayout(Layout):
     grok.context(Elephant)
 
     def render(self):
-	return "<div> MyContextLayout </div>"
+        return "<div> MyContextLayout </div>"
 

Modified: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/page.py
===================================================================
--- five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/page.py	2009-11-23 14:21:17 UTC (rev 105962)
+++ five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/page.py	2009-11-23 14:55:03 UTC (rev 105963)
@@ -1,35 +1,48 @@
 """
-  >>> from five.megrok.layout import ILayout
+  Some requirements:
+  >>> from five.megrok.layout import IPage
   >>> from five.megrok.layout.ftests.layout.page import *
   >>> from zope.component import getMultiAdapter
   >>> from zope.publisher.browser import TestRequest
+  >>> from zope.interface.verify import verifyObject
 
+  >>> from Products.Five.testbrowser import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
   >>> request = TestRequest()
-  >>> cow = Cow()
+  >>> root = getRootFolder()
+  >>> id = root._setObject("cow", Cow(id='cow'))
+  >>> cow = root._getOb("cow")
 
-  The next line is for Zope 2. Don't fear it.
+  Hack for Zope2:
   >>> cow.REQUEST = request
 
-  >>> mylayout = getMultiAdapter((request, cow), ILayout)
+  You can now a page:
   >>> myview = getMultiAdapter((cow, request), name='myview')
+  >>> myview
+  <five.megrok.layout.ftests.layout.page.MyView object at ...>
+  >>> IPage.providedBy(myview)
+  True
 
+  You can render your page, it's going to look for a layout and use it
+  to render itself:
   >>> print myview()
   <html>
    <body>
      <div class="layout"><p> My nice Content </p></div>
    </body>
   </html>
-
-  >>> myview
-  <five.megrok.layout.ftests.layout.page.MyView object at ...>
   >>> myview.layout
   <five.megrok.layout.ftests.layout.page.Master object at ...>
   >>> print myview.content()
   <p> My nice Content </p>
 
-  >>> bigcow = BigCow()
+  >>> del cow.REQUEST
 
-  The next line is for Zope 2. Don't fear it.
+  Here an another example:
+  >>> id = root._setObject("bigcow", BigCow(id='bigcow'))
+  >>> bigcow = root._getOb("bigcow")
   >>> bigcow.REQUEST = request
 
   >>> mybigview = getMultiAdapter((bigcow, request), name='myview')
@@ -49,6 +62,27 @@
   >>> print mybigview.content()
   <p> My big cool Content </p>
 
+  >>> del bigcow.REQUEST
+
+  We can even do some functional testing:
+  >>> browser.open('http://localhost/cow/myview')
+  >>> print browser.contents
+  <html>
+    <body>
+      <div class="layout"><p> My nice Content </p></div>
+    </body>
+  </html>
+
+  >>> browser.open('http://localhost/bigcow/myview')
+  >>> print browser.contents
+  <html>
+    <body>
+      <div class="layout"><p> My big cool Content </p>
+      </div>
+    </body>
+  </html>
+
+
 """
 from five import grok
 
@@ -56,7 +90,7 @@
 from five.megrok.layout import Layout, Page
 
 
-class Cow(grok.Context):
+class Cow(grok.Model):
     pass
 
 
@@ -73,7 +107,7 @@
     grok.context(interface.Interface)
 
     def render(self):
-	return "<p> My nice Content </p>"
+        return "<p> My nice Content </p>"
 
 
 class MyBigView(Page):

Added: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity.py
===================================================================
--- five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity.py	                        (rev 0)
+++ five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity.py	2009-11-23 14:55:03 UTC (rev 105963)
@@ -0,0 +1,65 @@
+"""
+  Let's create a test content:
+  >>> from five.megrok.layout.ftests.layout.pagesecurity import *
+  >>> root = getRootFolder()
+  >>> id = root._setObject("home", Home(id='home'))
+
+  Now we can go on our page:
+  >>> from Products.Five.testbrowser import Browser
+  >>> browser = Browser()
+
+  >>> browser.open('http://localhost/home/publicview')
+  >>> print browser.contents
+  <html>
+    <body>
+      <div class="layout"><p> I can express myself freely </p></div>
+    </body>
+  </html>
+
+  >>> browser.open('http://localhost/home/securedview')
+  Traceback (most recent call last):
+    ...
+  HTTPError: HTTP Error 401: Unauthorized
+
+  And if you give the permission to anonymous people that should work
+  after:
+
+  >>> root.home.manage_permission('View management screens', ['Anonymous',])
+  >>> browser.open('http://localhost/home/securedview')
+  >>> print browser.contents
+  <html>
+    <body>
+      <div class="layout"><p> My secret </p></div>
+    </body>
+  </html>
+
+"""
+from five import grok
+
+from zope import interface
+from five.megrok.layout import Layout, Page
+
+
+class Home(grok.Model):
+    pass
+
+
+class Master(Layout):
+    grok.name('master')
+    grok.context(Home)
+
+
+class PublicView(Page):
+    grok.context(interface.Interface)
+    grok.require('zope2.View')
+
+    def render(self):
+        return "<p> I can express myself freely </p>"
+
+
+class SecuredView(Page):
+    grok.context(interface.Interface)
+    grok.require('zope2.ViewManagementScreens')
+
+    def render(self):
+        return "<p> My secret </p>"

Added: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity_templates/master.pt
===================================================================
--- five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity_templates/master.pt	                        (rev 0)
+++ five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/pagesecurity_templates/master.pt	2009-11-23 14:55:03 UTC (rev 105963)
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <div class="layout"><tal:page tal:content="structure view/content" /></div>
+  </body>
+</html>

Modified: five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/resources.py
===================================================================
--- five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/resources.py	2009-11-23 14:21:17 UTC (rev 105962)
+++ five.megrok.layout/trunk/src/five/megrok/layout/ftests/layout/resources.py	2009-11-23 14:55:03 UTC (rev 105963)
@@ -5,7 +5,7 @@
   >>> from zope.publisher.browser import TestRequest
 
   >>> request = TestRequest()
-  >>> mongo = Dummy()
+  >>> mongo = Dummy('mongo')
   >>> mylayout = getMultiAdapter((request, mongo), ILayout)
   >>> mylayout.static
   <five.grok.components.ZopeTwoDirectoryResource object at ...>
@@ -17,7 +17,7 @@
 from five.megrok.layout import Layout
 
 
-class Dummy(grok.Context):
+class Dummy(grok.Model):
     pass
 
 



More information about the checkins mailing list