##############################################################################
#
# Copyright (c) 2001, 2002 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.
#
##############################################################################
"""'browser' namespace directive tests
$Id: test_directives.py 67630 2006-04-27 00:54:03Z jim $
"""
import os
import unittest
from cStringIO import StringIO
from zope.interface import Interface, implements, directlyProvides, providedBy
import zope.security.management
from zope.component.interfaces import IDefaultViewName
from zope.configuration.xmlconfig import xmlconfig, XMLConfig
from zope.configuration.exceptions import ConfigurationError
from zope.publisher.browser import TestRequest
from zope.publisher.interfaces.browser import IBrowserPublisher
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultSkin
from zope.security.proxy import removeSecurityProxy, ProxyFactory
from zope.security.permission import Permission
from zope.security.interfaces import IPermission
from zope.testing.doctestunit import DocTestSuite
from zope.traversing.adapters import DefaultTraversable
from zope.traversing.interfaces import ITraversable
import zope.app.publisher.browser
from zope.app import zapi
from zope.app.component.tests.views import IC, V1, VZMI, R1, IV
from zope.app.publisher.browser.fileresource import FileResource
from zope.app.publisher.browser.i18nfileresource import I18nFileResource
from zope.app.publisher.browser.menu import getFirstMenuItem
from zope.app.publisher.interfaces.browser import IMenuItemType
from zope.app.testing import placelesssetup, ztapi
tests_path = os.path.join(
os.path.dirname(zope.app.publisher.browser.__file__),
'tests')
template = """
%s
"""
request = TestRequest()
class V2(V1, object):
def action(self):
return self.action2()
def action2(self):
return "done"
class VT(V1, object):
def publishTraverse(self, request, name):
try:
return int(name)
except:
return super(VT, self).publishTraverse(request, name)
class Ob(object):
implements(IC)
ob = Ob()
class NCV(object):
"non callable view"
def __init__(self, context, request):
pass
class CV(NCV):
"callable view"
def __call__(self):
pass
class C_w_implements(NCV):
implements(Interface)
def index(self):
return self
class ITestMenu(Interface):
"""Test menu."""
directlyProvides(ITestMenu, IMenuItemType)
class ITestLayer(IBrowserRequest):
"""Test Layer."""
class ITestSkin(ITestLayer):
"""Test Skin."""
class MyResource(object):
def __init__(self, request):
self.request = request
class Test(placelesssetup.PlacelessSetup, unittest.TestCase):
def setUp(self):
super(Test, self).setUp()
XMLConfig('meta.zcml', zope.app.publisher.browser)()
ztapi.provideAdapter(None, ITraversable, DefaultTraversable)
def testPage(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template % (
'''
'''
)))
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assert_(issubclass(v.__class__, V1))
def testPageWithClassWithMenu(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
xmlconfig(StringIO(template % (
'''
''' % testtemplate
)))
menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
self.assertEqual(menuItem["title"], "Test View")
self.assertEqual(menuItem["action"], "@@test")
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assertEqual(v(), "
test
\n")
def testPageWithTemplateWithMenu(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
xmlconfig(StringIO(template % (
'''
''' % testtemplate
)))
menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
self.assertEqual(menuItem["title"], "Test View")
self.assertEqual(menuItem["action"], "@@test")
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assertEqual(v(), "test
\n")
def testPageInPagesWithTemplateWithMenu(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
xmlconfig(StringIO(template % (
'''
''' % testtemplate
)))
menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
self.assertEqual(menuItem["title"], "Test View")
self.assertEqual(menuItem["action"], "@@test")
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assertEqual(v(), "test
\n")
def testPageInPagesWithClassWithMenu(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
xmlconfig(StringIO(template % (
'''
''' % testtemplate
)))
menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
self.assertEqual(menuItem["title"], "Test View")
self.assertEqual(menuItem["action"], "@@test")
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assertEqual(v(), "test
\n")
def testDefaultView(self):
self.assertEqual(
zapi.queryMultiAdapter((ob, request), IDefaultViewName),
None)
xmlconfig(StringIO(template % (
'''
'''
)))
self.assertEqual(zapi.getDefaultViewName(ob, request), 'test')
def testDefaultViewWithLayer(self):
class FakeRequest(TestRequest):
implements(ITestLayer)
request2 = FakeRequest()
self.assertEqual(
zapi.queryMultiAdapter((ob, request2), IDefaultViewName),
None)
xmlconfig(StringIO(template % (
'''
'''
)))
self.assertEqual(zapi.getDefaultViewName(ob, request2), 'test2')
self.assertEqual(zapi.getDefaultViewName(ob, request), 'test')
def testSkinResource(self):
self.assertEqual(
zapi.queryAdapter(Request(IV), name='test'), None)
xmlconfig(StringIO(template % (
'''
'''
)))
self.assertEqual(
zapi.queryAdapter(request, name='test').__class__, R1)
self.assertEqual(
zapi.queryAdapter(TestRequest(skin=ITestSkin), name='test').__class__,
RZMI)
def testDefaultSkin(self):
request = TestRequest()
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
XMLConfig('meta.zcml', zope.app.component)()
xmlconfig(StringIO(template % (
'''
'''
)))
# Simulate Zope Publication behavior in beforeTraversal()
adapters = zapi.getSiteManager().adapters
skin = adapters.lookup((providedBy(request),), IDefaultSkin, '')
directlyProvides(request, skin)
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assert_(issubclass(v.__class__, VZMI))
def testSkinPage(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template % (
'''
'''
)))
v = zapi.queryMultiAdapter((ob, request), name='test')
self.assert_(issubclass(v.__class__, V1))
v = zapi.queryMultiAdapter((ob, TestRequest(skin=ITestSkin)), name='test')
self.assert_(issubclass(v.__class__, VZMI))
def testI18nResource(self):
self.assertEqual(zapi.queryAdapter(request, name='test'), None)
path1 = os.path.join(tests_path, 'testfiles', 'test.pt')
path2 = os.path.join(tests_path, 'testfiles', 'test2.pt')
xmlconfig(StringIO(template % (
'''
''' % (path1, path2)
)))
v = zapi.getAdapter(request, name='test')
self.assertEqual(
zapi.queryAdapter(request, name='test').__class__,
I18nFileResource)
self.assertEqual(v._testData('en'), open(path1, 'rb').read())
self.assertEqual(v._testData('fr'), open(path2, 'rb').read())
# translation must be provided for the default language
config = StringIO(template % (
'''
''' % (path1, path2)
))
self.assertRaises(ConfigurationError, xmlconfig, config)
# files and images can't be mixed
config = StringIO(template % (
'''
''' % (path1, path2)
))
self.assertRaises(ConfigurationError, xmlconfig, config)
def testInterfaceProtectedPage(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
v = ProxyFactory(v)
self.assertEqual(v.index(), 'V1 here')
self.assertRaises(Exception, getattr, v, 'action')
def testAttributeProtectedPage(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
v = ProxyFactory(v)
self.assertEqual(v.action(), 'done')
self.assertEqual(v.action2(), 'done')
self.assertRaises(Exception, getattr, v, 'index')
def testAttributeProtectedView(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
v = ProxyFactory(v)
page = v.publishTraverse(request, 'index.html')
self.assertEqual(page(), 'done')
self.assertEqual(v.action2(), 'done')
self.assertRaises(Exception, getattr, page, 'index')
def testInterfaceAndAttributeProtectedPage(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
self.assertEqual(v.index(), 'V1 here')
self.assertEqual(v.action(), 'done')
def testDuplicatedInterfaceAndAttributeProtectedPage(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
self.assertEqual(v.index(), 'V1 here')
self.assertEqual(v.action(), 'done')
def test_class_w_implements(self):
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='test')
self.assertEqual(v.index(), v)
self.assert_(IBrowserPublisher.providedBy(v))
def testIncompleteProtectedPageNoPermission(self):
self.assertRaises(
ConfigurationError,
xmlconfig,
StringIO(template %
'''
'''
))
def testPageViews(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
xmlconfig(StringIO(template %
'''
''' % test3
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
self.assertEqual(v(), 'V1 here')
v = zapi.getMultiAdapter((ob, request), name='action.html')
self.assertEqual(v(), 'done')
v = zapi.getMultiAdapter((ob, request), name='test.html')
self.assertEqual(str(v()), 'done
\n')
def testNamedViewPageViewsCustomTraversr(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
v = view.publishTraverse(request, 'index.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'V1 here')
v = view.publishTraverse(request, 'action.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'done')
def testNamedViewNoPagesForCallable(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
self.assertEqual(view.browserDefault(request), (view, ()))
def testNamedViewNoPagesForNonCallable(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
self.assertEqual(getattr(view, 'browserDefault', None), None)
def testNamedViewPageViewsNoDefault(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
xmlconfig(StringIO(template %
'''
''' % test3
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
v = view.publishTraverse(request, 'index.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'V1 here')
v = view.publishTraverse(request, 'action.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'done')
v = view.publishTraverse(request, 'test.html')
v = removeSecurityProxy(v)
self.assertEqual(str(v()), 'done
\n')
def testNamedViewPageViewsWithDefault(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
xmlconfig(StringIO(template %
'''
''' % test3
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
self.assertEqual(view.browserDefault(request)[1], (u'test.html', ))
v = view.publishTraverse(request, 'index.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'V1 here')
v = view.publishTraverse(request, 'action.html')
v = removeSecurityProxy(v)
self.assertEqual(v(), 'done')
v = view.publishTraverse(request, 'test.html')
v = removeSecurityProxy(v)
self.assertEqual(str(v()), 'done
\n')
def testTraversalOfPageForView(self):
"""Tests proper traversal of a page defined for a view."""
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
view.publishTraverse(request, 'index.html')
def testTraversalOfPageForViewWithPublishTraverse(self):
"""Tests proper traversal of a page defined for a view.
This test is different from testTraversalOfPageForView in that it
tests the behavior on a view that has a publishTraverse method --
the implementation of the lookup is slightly different in such a
case.
"""
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
view = removeSecurityProxy(view)
view.publishTraverse(request, 'index.html')
def testProtectedPageViews(self):
ztapi.provideUtility(IPermission, Permission('p', 'P'), 'p')
request = TestRequest()
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
v = ProxyFactory(v)
zope.security.management.getInteraction().add(request)
self.assertRaises(Exception, v)
v = zapi.getMultiAdapter((ob, request), name='action.html')
v = ProxyFactory(v)
self.assertRaises(Exception, v)
def testProtectedNamedViewPageViews(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
view = zapi.getMultiAdapter((ob, request), name='test')
self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
v = view.publishTraverse(request, 'index.html')
self.assertEqual(v(), 'V1 here')
def testSkinnedPageView(self):
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
self.assertEqual(v(), 'V1 here')
v = zapi.getMultiAdapter((ob, TestRequest(skin=ITestSkin)),
name='index.html')
self.assertEqual(v(), 'done')
def testFactory(self):
self.assertEqual(zapi.queryAdapter(request, name='index.html'), None)
xmlconfig(StringIO(template %
'''
'''
))
r = zapi.getAdapter(request, name='index.html')
self.assertEquals(r.__class__, MyResource)
r = ProxyFactory(r)
self.assertEqual(r.__name__, "index.html")
def testFile(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
self.assertEqual(zapi.queryAdapter(request, name='test'), None)
xmlconfig(StringIO(template %
'''
''' % path
))
r = zapi.getAdapter(request, name='index.html')
self.assertEquals(r.__class__, FileResource)
r = ProxyFactory(r)
self.assertEqual(r.__name__, "index.html")
# Make sure we can access available attrs and not others
for n in ('GET', 'HEAD', 'publishTraverse', 'request', '__call__'):
getattr(r, n)
self.assertEqual(r.__name__, "index.html")
self.assertRaises(Exception, getattr, r, '_testData')
r = removeSecurityProxy(r)
self.assert_(r.__class__ is FileResource)
self.assertEqual(r._testData(), open(path, 'rb').read())
def testSkinResource(self):
self.assertEqual(zapi.queryAdapter(request, name='test'), None)
path = os.path.join(tests_path, 'testfiles', 'test.pt')
xmlconfig(StringIO(template % (
'''
''' % path
)))
self.assertEqual(zapi.queryAdapter(request, name='test'), None)
r = zapi.getAdapter(TestRequest(skin=ITestSkin), name='test')
r = removeSecurityProxy(r)
self.assertEqual(r._testData(), open(path, 'rb').read())
def test_template_page(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
self.assertEqual(
zapi.queryMultiAdapter((ob, request), name='index.html'), None)
xmlconfig(StringIO(template %
'''
''' % path
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
self.assertEqual(v().strip(), 'test
')
def test_page_menu_within_different_layers(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
self.assertEqual(
zapi.queryMultiAdapter((ob, request), name='index.html'),
None)
xmlconfig(StringIO(template %
'''
''' % (path, path)
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
self.assertEqual(v().strip(), 'test
')
def testtemplateWClass(self):
path = os.path.join(tests_path, 'testfiles', 'test2.pt')
self.assertEqual(
zapi.queryMultiAdapter((ob, request), name='index.html'), None)
xmlconfig(StringIO(template %
'''
''' % path
))
v = zapi.getMultiAdapter((ob, request), name='index.html')
self.assertEqual(v().strip(), '42
')
def testProtectedtemplate(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
request = TestRequest()
self.assertEqual(zapi.queryMultiAdapter((ob, request), name='test'),
None)
xmlconfig(StringIO(template %
'''
''' % path
))
xmlconfig(StringIO(template %
'''
''' % path
))
v = zapi.getMultiAdapter((ob, request), name='xxx.html')
v = ProxyFactory(v)
zope.security.management.getInteraction().add(request)
self.assertRaises(Exception, v)
v = zapi.getMultiAdapter((ob, request), name='index.html')
v = ProxyFactory(v)
self.assertEqual(v().strip(), 'test
')
def testtemplateNoName(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
self.assertRaises(
ConfigurationError,
xmlconfig,
StringIO(template %
'''
''' % path
))
def testtemplateAndPage(self):
path = os.path.join(tests_path, 'testfiles', 'test.pt')
self.assertRaises(
ConfigurationError,
xmlconfig,
StringIO(template %
'''
''' % path
))
def testViewThatProvidesAnInterface(self):
request = TestRequest()
self.assertEqual(
zapi.queryMultiAdapter((ob, request), IV, name='test'), None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.queryMultiAdapter((ob, request), IV, name='test')
self.assertEqual(v, None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.queryMultiAdapter((ob, request), IV, name='test')
self.assert_(isinstance(v, V1))
def testUnnamedViewThatProvidesAnInterface(self):
request = TestRequest()
self.assertEqual(zapi.queryMultiAdapter((ob, request), IV),
None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.queryMultiAdapter((ob, request), IV)
self.assertEqual(v, None)
xmlconfig(StringIO(template %
'''
'''
))
v = zapi.queryMultiAdapter((ob, request), IV)
self.assert_(isinstance(v, V1))
def testMenuItemNeedsFor(self):
# directive fails if no 'for' argument was provided
from zope.configuration.exceptions import ConfigurationError
self.assertRaises(ConfigurationError, xmlconfig, StringIO(template %
'''
'''
))
# it works, when the argument is there and a valid interface
xmlconfig(StringIO(template %
'''
'''
))
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(Test),
DocTestSuite('zope.app.publisher.browser.metaconfigure',
setUp=placelesssetup.setUp,
tearDown=placelesssetup.tearDown)
))
if __name__=='__main__':
unittest.main(defaultTest="test_suite")