[Checkins] SVN: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ add functional tests similar to those written for viewletmanagers

Jan-Wijbrand Kolman janwijbrand at gmail.com
Thu Jun 23 07:18:42 EDT 2011


Log message for revision 121968:
  add functional tests similar to those written for viewletmanagers

Changed:
  U   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftesting.zcml
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/__init__.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/contentprovider.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/contentprovider_templates/
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context_fixture.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/interface.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/interface_templates/
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaprovider.pt
  D   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewlet.pt
  D   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewletmanager.pt
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/view_directive.py
  A   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/view_directive_templates/
  U   grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/test_functional.py
  U   grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta/contentproviders.py

-=-
Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftesting.zcml
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftesting.zcml	2011-06-23 09:30:03 UTC (rev 121967)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftesting.zcml	2011-06-23 11:18:41 UTC (rev 121968)
@@ -15,6 +15,7 @@
   <include package="grokcore.view" file="meta.zcml" />
 
   <include package="zope.security" />
+  <include package="zope.securitypolicy" />
   <include package="zope.principalregistry" />
   <include package="zope.login" />
   <include package="zope.password" />
@@ -23,10 +24,17 @@
   <include package="zope.publisher" />
   <include package="zope.traversing" />
   <include package="zope.traversing.browser" />
+  <include package="zope.annotation" />
   <include package="zope.app.appsetup" />
   <include package="zope.app.publication" />
 
   <include package="grokcore.view" />
+
+  <!-- We define our test permission here (don't have grok.Role) -->
+  <permission id="bone.gold" title="Gold Bone" />
+  <role id="grok.BoneOwner" title="Bone Owner" />
+  <grant role="grok.BoneOwner" permission="bone.gold" />
+
   <grok:grok package="grokcore.view.ftests" />
 
   <securityPolicy

Added: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/__init__.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/__init__.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/__init__.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1 @@
+#package

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/contentprovider.py (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/viewlet_security.py)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/contentprovider.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/contentprovider.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,69 @@
+"""
+=====================
+Test Content Provider
+=====================
+
+This doctest will test the various grok content provider registrations. Grok
+viewlets offer the same flexibility as zope3, allowing you to register viewlets
+for a particular view, context, layer, and permission.
+
+Set up a content object in the application root::
+
+  >>> root = getRootFolder()
+  >>> root['wilma'] = CaveWoman()
+  >>> root['fred'] = CaveMan()
+
+Traverse to the view on the model object. We get the viewlets
+registered for the default layer, with the anybody permission::
+
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/wilma/@@caveview")
+  >>> print browser.contents
+  Soup pot
+
+"""
+
+from zope.interface import Interface
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+import grokcore.view as grok
+
+class CaveWoman(grok.Context):
+    pass
+
+class CaveMan(grok.Context):
+    pass
+
+class CaveView(grok.View):
+    grok.context(Interface)
+
+class FireView(grok.View):
+    grok.context(Interface)
+    grok.template('caveview')
+
+class Pot(grok.ContentProvider):
+    grok.context(Interface)
+
+    def render(self):
+        return u"Soup pot"
+
+class GoldPot(grok.ContentProvider):
+    grok.name('pot')
+    grok.context(Interface)
+    grok.require('bone.gold')
+    grok.view(FireView)
+
+    def render(self):
+        return u"Gold Soup Pot"
+
+class IBoneLayer(IDefaultBrowserLayer):
+    grok.skin('boneskin')
+
+class LayeredPot(grok.ContentProvider):
+    grok.name('pot')
+    grok.context(Interface)
+    grok.layer(IBoneLayer)
+
+    def render(self):
+        return u"Layered pot"

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context.py (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/viewlet_context.py)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,64 @@
+"""
+Content providers auto-associate with the context object that may be in a
+module.
+
+Set up the model object to view::
+
+  >>> root = getRootFolder()
+  >>> root['cave'] = cave = Cave()
+
+We also set up another model that the content provider should not be auto-
+associated with::
+
+  >>> root['club'] = club = Club()
+
+Let's get a content rpvoider associated with ``cave``::
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((cave, request), name='index')
+  >>> from zope.contentprovider.interfaces import IContentProvider
+  >>> mgr = component.getMultiAdapter((cave, request, view), IContentProvider,
+  ...   'manage.cavemen')
+
+We cannot get this content provider for ``club``, as there is none associated
+with that as a context for the given name::
+
+  >>> component.queryMultiAdapter((club, request, view), IContentProvider,
+  ...   'manage.caveman') is None
+  True
+
+Ther is for one with a different name, using an explicit grok.context directive
+however:
+
+  >>> mgr = component.getMultiAdapter((club, request, view), IContentProvider,
+  ...   'manage.clubmen')
+
+"""
+
+import zope.interface
+import grokcore.view as grok
+from context_fixture import Club
+
+class CavemenContentProvider(grok.ContentProvider):
+    grok.name('manage.cavemen')
+
+    def render(self):
+        pass
+
+class Cave(grok.Context):
+    pass
+
+class Index(grok.View):
+    grok.context(zope.interface.Interface)
+
+    def render(self):
+        return u"Hi"
+
+class ClubContentProvider(grok.ContentProvider):
+    grok.name('manage.clubmen')
+    grok.context(Club)
+
+    def render(self):
+        pass

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context_fixture.py (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/viewlet_context2.py)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context_fixture.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/context_fixture.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,10 @@
+"""
+This file is used by viewlet_context. It defines a model that the viewlets
+and viewlet manager should *not* be associating with.
+"""
+
+import grokcore.view as grok
+
+class Club(grok.Context):
+    pass
+

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/interface.py (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/viewlet_interface.py)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/interface.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/interface.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,49 @@
+"""
+Verify that associating a content provider with an view interface instead of
+with a view class works as expected.
+
+Set up the model object to view::
+
+  >>> root = getRootFolder()
+  >>> root['cave'] = Cave()
+
+Viewing the cave object should result in the content provider being displayed,
+as it is associated with the view's interface::
+
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/cave")
+  >>> print browser.contents
+  Hi
+
+  >>> browser.open("http://localhost/cave/@@secondindex")
+  >>> print browser.contents
+  Hi
+
+"""
+
+from zope.interface import Interface
+import grokcore.view as grok
+
+class Cave(grok.Context):
+    pass
+
+class ICavemenView(Interface):
+    pass
+
+class Index(grok.View):
+    grok.implements(ICavemenView)
+
+class CavemenContentProvider(grok.ContentProvider):
+    grok.name('manage.cavemen')
+    grok.view(ICavemenView)
+
+    def render(self):
+        return u'Hi'
+
+class SecondIndex(grok.View):
+    grok.implements(ICavemenView)
+
+    def render(self):
+        return u'Hi'

Added: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,52 @@
+"""
+Let's check that the contentprovider namespaces are correct. In
+particular, ``view`` in a template should refer to the view the content
+provider is registered for, not the provider itself.
+
+  >>> root = getRootFolder()
+  >>> root['cave'] = Cave()
+
+Let's look at the first template, which includes the content provider:
+
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/cave/@@index")
+  >>> print browser.contents
+  <grokcore.view.ftests.contentprovider.template_namespaces.Cave object at ...>
+  <grokcore.view.ftests.contentprovider.template_namespaces.Index object at ...>
+  <grokcore.view.ftests.contentprovider.template_namespaces.CavewomenContentProvider object at ...>
+
+This is indeed what we expected from the content provider.
+
+Let's look at a template for too:
+
+  >>> browser.open("http://localhost/cave/@@necklace")
+  >>> print browser.contents
+  <grokcore.view.ftests.contentprovider.template_namespaces.Cave object at ...>
+  <grokcore.view.ftests.contentprovider.template_namespaces.Necklace object at ...>
+  <grokcore.view.ftests.contentprovider.template_namespaces.CavewomenContentProviderWithTemplate object at ...>
+
+"""
+import grokcore.view as grok
+
+class Cave(grok.Context):
+    pass
+
+class Index(grok.View):
+    pass
+
+class CavewomenContentProvider(grok.ContentProvider):
+    grok.name('manage.cavewomen')
+    grok.view(Index)
+
+    def render(self):
+        return u'%r %r %r' % (self.context, self.view, self)
+
+class Necklace(grok.View):
+    pass
+
+class CavewomenContentProviderWithTemplate(grok.ContentProvider):
+    grok.name('manage.cavewomenwithtemplate')
+    grok.template('mirandaprovider')
+    grok.view(Necklace)

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaprovider.pt (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/template_namespaces_templates/mirandaviewletmanager.pt)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaprovider.pt	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaprovider.pt	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,3 @@
+<tal:block replace="structure python: repr(context)" />
+<tal:block replace="structure python: repr(view)" />
+<tal:block replace="structure python: repr(provider)" />

Deleted: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewlet.pt
===================================================================
--- grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/template_namespaces_templates/mirandaviewlet.pt	2011-05-26 11:27:21 UTC (rev 121818)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewlet.pt	2011-06-23 11:18:41 UTC (rev 121968)
@@ -1,4 +0,0 @@
-<tal:block replace="structure python: repr(context)" />
-<tal:block replace="structure python: repr(view)" />
-<tal:block replace="structure python: repr(viewlet)" />
-<tal:block replace="structure python: repr(viewletmanager)" />

Deleted: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewletmanager.pt
===================================================================
--- grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/template_namespaces_templates/mirandaviewletmanager.pt	2011-05-26 11:27:21 UTC (rev 121818)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/template_namespaces_templates/mirandaviewletmanager.pt	2011-06-23 11:18:41 UTC (rev 121968)
@@ -1,3 +0,0 @@
-<tal:block replace="structure python: repr(context)" />
-<tal:block replace="structure python: repr(view)" />
-<tal:block replace="structure python: repr(viewletmanager)" />

Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/view_directive.py (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/ftests/viewlet/view_directive.py)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/view_directive.py	                        (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/contentprovider/view_directive.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -0,0 +1,63 @@
+"""
+We check here that specifying grok.view() on module level works.
+grok.view() on module level will make the content provider be associated
+with the CaveView, so nothing is found for BoneView and an error should
+occur.
+
+Set up a content object in the application root:
+
+  >>> root = getRootFolder()
+  >>> root['fred'] = Fred()
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+This view does have the content provider registered for:
+
+  >>> browser.open("http://localhost/fred/@@caveview")
+  >>> browser.contents
+  'Cave'
+
+However, the boneview does not have a content provider registered for:
+
+  >>> browser.open("http://localhost/fred/@@boneview")
+  Traceback (most recent call last):
+  ...
+  ContentProviderLookupError: cave
+
+And the potview again does, by way of a component-level grok.view directive:
+
+  >>> browser.open("http://localhost/fred/@@potview")
+  >>> browser.contents
+  'Pot'
+
+"""
+
+import grokcore.view as grok
+
+class Fred(grok.Context):
+    pass
+
+class CaveView(grok.View):
+
+    def render(self):
+        return u"Cave"
+
+grok.view(CaveView)
+
+class BoneView(grok.View):
+    pass
+
+class CaveContentProvider(grok.ContentProvider):
+    grok.name('cave')
+
+    def render(self):
+        pass
+
+class PotView(grok.View):
+
+    def render(self):
+        return u"Pot"
+
+class PotCaveContentProvider(CaveContentProvider):
+    grok.view(PotView)

Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/test_functional.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/test_functional.py	2011-06-23 09:30:03 UTC (rev 121967)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/ftests/test_functional.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -44,6 +44,12 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['view', 'staticdir', 'url', 'directoryresource']:
+    for name in [
+        'contentprovider',
+        'directoryresource',
+        'staticdir',
+        'url',
+        'view',
+        ]:
         suite.addTest(suiteFromPackage(name))
     return suite

Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta/contentproviders.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta/contentproviders.py	2011-06-23 09:30:03 UTC (rev 121967)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta/contentproviders.py	2011-06-23 11:18:41 UTC (rev 121968)
@@ -50,3 +50,6 @@
             callable=component.provideAdapter,
             args=(factory, (context, layer, view), IContentProvider, name))
         return True
+
+
+



More information about the checkins mailing list