[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