Some legacy tests. And a (disabled) failing one that tests the __of__

behaviour of BrowserView.  Well, when I say failing I should really say
segfaulting :/
parent 1853b0f6
...@@ -15,18 +15,21 @@ ...@@ -15,18 +15,21 @@
$Id$ $Id$
""" """
import Acquisition
import zope.publisher.browser import zope.publisher.browser
from Acquisition import aq_chain
from Acquisition import aq_inner
class BrowserView(zope.publisher.browser.BrowserView): class BrowserView(zope.publisher.browser.BrowserView):
# BBB for code that expects BrowserView to still inherit from # BBB for code that expects BrowserView to still inherit from
# Acquisition.Explicit. # Acquisition.Explicit.
def __of__(self, context): def __of__(self, context):
# Technically this isn't in line with the way Acquisition's
# __of__ works. With Acquisition, you get a wrapper around
# the original object and only that wrapper's parent is the
# new context. Here we change the original object.
#self.__parent__ = context # ugh. segfault!
return self return self
# XXX Classes which are still based on Acquisition and access # XXX Classes which are still based on Acquisition and access
...@@ -34,7 +37,7 @@ class BrowserView(zope.publisher.browser.BrowserView): ...@@ -34,7 +37,7 @@ class BrowserView(zope.publisher.browser.BrowserView):
# aq_chain. We do this here for BBB friendly purposes. # aq_chain. We do this here for BBB friendly purposes.
def __getParent(self): def __getParent(self):
return getattr(self, '_parent', aq_inner(self.context)) return getattr(self, '_parent', Acquisition.aq_inner(self.context))
def __setParent(self, parent): def __setParent(self, parent):
self._parent = parent self._parent = parent
...@@ -43,12 +46,8 @@ class BrowserView(zope.publisher.browser.BrowserView): ...@@ -43,12 +46,8 @@ class BrowserView(zope.publisher.browser.BrowserView):
# We provide the aq_* properties here for BBB # We provide the aq_* properties here for BBB
@property aq_self = aq_inner = aq_base = property(lambda self: self)
def aq_base(self):
return self
aq_self = aq_inner = aq_base
@property @property
def aq_chain(self): def aq_chain(self):
return aq_chain(self) return Acquisition.aq_chain(self)
##############################################################################
#
# 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.
#
##############################################################################
"""Legacy browser view tests.
Here we nake sure that legacy implementations of views (e.g. those
which mix-in one of the Acquisition base classes without knowing
better) still work.
"""
import Acquisition
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
class LegacyAttributes(BrowserView):
"""Make sure that accessing those old aq_* attributes on Five
BrowserViews still works, even though BrowserView may not be an
Acquisition-decendant class anymore...
"""
def __call__(self):
assert self.aq_parent == self.context
assert self.aq_inner == self
assert self.aq_base == self
assert self.aq_self == self
return repr([obj for obj in self.aq_chain])
class Explicit(Acquisition.Explicit):
def render(self):
return 'Explicit'
class ExplicitWithTemplate(Acquisition.Explicit):
template = ViewPageTemplateFile('falcon.pt')
class Implicit(Acquisition.Implicit):
def render(self):
return 'Implicit'
class ImplicitWithTemplate(Acquisition.Implicit):
template = ViewPageTemplateFile('falcon.pt')
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">
<browser:page
for="*"
name="attributes"
class=".aqlegacy.LegacyAttributes"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit"
class=".aqlegacy.Explicit"
attribute="render"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit_zcmltemplate"
class=".aqlegacy.Explicit"
template="falcon.pt"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit_template"
class=".aqlegacy.ExplicitWithTemplate"
attribute="template"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit"
class=".aqlegacy.Implicit"
attribute="render"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit_template"
class=".aqlegacy.ImplicitWithTemplate"
attribute="template"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit_zcmltemplate"
class=".aqlegacy.Implicit"
template="falcon.pt"
permission="zope.Public"
/>
</configure>
\ No newline at end of file
Testing legacy browser views
============================
This test tests publishing aspects of browser pages. Let's register
some:
>>> import Products.Five.browser.tests
>>> from Products.Five import zcml
>>> zcml.load_config("configure.zcml", Products.Five)
>>> zcml.load_config('aqlegacy.zcml', package=Products.Five.browser.tests)
>>> from Products.Five.testbrowser import Browser
>>> browser = Browser()
>>> browser.handleErrors = False
Acquisition API legacy on BrowserView
-------------------------------------
Let's make sure that accessing those old aq_* properties on browser
views still works (the printed output is the aq_chain of the view):
>>> browser.open('http://localhost/test_folder_1_/attributes')
>>> print browser.contents
[<Products.Five.metaclass.LegacyAttributes object at ...>, <Folder at /test_folder_1_>, <Application at >, <ZPublisher.BaseRequest.RequestContainer object at ...>]
Let's also make sure that calling __of__ on a view has the desired
effect. First let's get a view:
>>> from zope.component import getMultiAdapter
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> view = getMultiAdapter((self.folder, request), name='attributes')
Let's try the __of__ protocol:
#>>> view = view.__of__(self.app)
#>>> view.aq_parent == self.folder
#False
#>>> view.aq_parent == self.app
#True
Mixing in Acquisition.{Ex|Im}plicit
-----------------------------------
Let's make sure that mixing in Acquisition.Explicit or Implicit won't
mess up your views (even though you should never have done it in the
first place...):
>>> browser.open('http://localhost/test_folder_1_/explicit')
>>> print browser.contents
Explicit
>>> browser.open('http://localhost/test_folder_1_/explicit_zcmltemplate')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/explicit_template')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/implicit')
>>> print browser.contents
Implicit
>>> browser.open('http://localhost/test_folder_1_/implicit_template')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/implicit_zcmltemplate')
>>> print browser.contents
<p>The falcon has taken flight</p>
Clean up
--------
>>> from zope.app.testing.placelesssetup import tearDown
>>> tearDown()
...@@ -77,7 +77,9 @@ def test_suite(): ...@@ -77,7 +77,9 @@ def test_suite():
ZopeDocTestSuite(), ZopeDocTestSuite(),
ZopeDocFileSuite('pages.txt', package='Products.Five.browser.tests'), ZopeDocFileSuite('pages.txt', package='Products.Five.browser.tests'),
FunctionalDocFileSuite('pages_ftest.txt', FunctionalDocFileSuite('pages_ftest.txt',
package='Products.Five.browser.tests') package='Products.Five.browser.tests'),
FunctionalDocFileSuite('aqlegacy_ftest.txt',
package='Products.Five.browser.tests'),
)) ))
return suite return suite
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment