1
##############################################################################
3
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
6
# This software is subject to the provisions of the Zope Public License,
7
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11
# FOR A PARTICULAR PURPOSE.
13
##############################################################################
14
"""'browser' namespace directive tests
16
$Id: test_directives.py 103138 2009-08-24 11:37:52Z nadako $
21
from cStringIO import StringIO
23
from zope import component
24
from zope.interface import Interface, implements, directlyProvides, providedBy
26
import zope.security.management
27
from zope.configuration.xmlconfig import xmlconfig, XMLConfig
28
from zope.configuration.exceptions import ConfigurationError
29
from zope.publisher.browser import TestRequest
30
from zope.publisher.interfaces import IDefaultViewName
31
from zope.publisher.interfaces.browser import IBrowserPublisher
32
from zope.publisher.interfaces.browser import IBrowserRequest
33
from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultSkin
34
from zope.security.proxy import removeSecurityProxy, ProxyFactory
35
from zope.security.permission import Permission
36
from zope.security.interfaces import IPermission
37
from zope.traversing.adapters import DefaultTraversable
38
from zope.traversing.interfaces import ITraversable
40
import zope.publisher.defaultview
41
import zope.browserresource
42
from zope.component import provideAdapter, provideUtility
43
from zope.component.testfiles.views import R1, IV
44
from zope.browserresource.file import FileResource
45
from zope.browserresource.i18nfile import I18nFileResource
46
from zope.browserresource.directory import DirectoryResource
47
from zope.testing import cleanup
49
tests_path = os.path.join(
50
os.path.dirname(zope.browserresource.__file__),
53
template = """<configure
54
xmlns='http://namespaces.zope.org/zope'
55
xmlns:browser='http://namespaces.zope.org/browser'
61
request = TestRequest()
63
class ITestLayer(IBrowserRequest):
66
class ITestSkin(ITestLayer):
70
class MyResource(object):
72
def __init__(self, request):
73
self.request = request
76
class Test(cleanup.CleanUp, unittest.TestCase):
79
super(Test, self).setUp()
80
XMLConfig('meta.zcml', zope.browserresource)()
81
provideAdapter(DefaultTraversable, (None,), ITraversable)
84
super(Test, self).tearDown()
86
def testI18nResource(self):
87
self.assertEqual(component.queryAdapter(request, name='test'), None)
89
path1 = os.path.join(tests_path, 'testfiles', 'test.pt')
90
path2 = os.path.join(tests_path, 'testfiles', 'test2.pt')
92
xmlconfig(StringIO(template % (
94
<browser:i18n-resource name="test" defaultLanguage="fr">
95
<browser:translation language="en" file="%s" />
96
<browser:translation language="fr" file="%s" />
97
</browser:i18n-resource>
101
v = component.getAdapter(request, name='test')
103
component.queryAdapter(request, name='test').__class__,
105
self.assertEqual(v._testData('en'), open(path1, 'rb').read())
106
self.assertEqual(v._testData('fr'), open(path2, 'rb').read())
108
# translation must be provided for the default language
109
config = StringIO(template % (
111
<browser:i18n-resource name="test" defaultLanguage="fr">
112
<browser:translation language="en" file="%s" />
113
<browser:translation language="lt" file="%s" />
114
</browser:i18n-resource>
117
self.assertRaises(ConfigurationError, xmlconfig, config)
119
def testFactory(self):
121
component.queryAdapter(request, name='index.html'), None)
123
xmlconfig(StringIO(template %
128
zope.browserresource.tests.test_directives.MyResource"
133
r = component.getAdapter(request, name='index.html')
134
self.assertEquals(r.__class__, MyResource)
136
self.assertEqual(r.__name__, "index.html")
139
path = os.path.join(tests_path, 'testfiles', 'test.pt')
141
self.assertEqual(component.queryAdapter(request, name='test'), None)
143
xmlconfig(StringIO(template %
152
r = component.getAdapter(request, name='index.html')
153
self.assertTrue(isinstance(r, FileResource))
155
self.assertEqual(r.__name__, "index.html")
157
# Make sure we can access available attrs and not others
158
for n in ('GET', 'HEAD', 'publishTraverse', 'request', '__call__'):
161
self.assertRaises(Exception, getattr, r, '_testData')
163
r = removeSecurityProxy(r)
164
self.assertEqual(r._testData(), open(path, 'rb').read())
167
def testPluggableFactory(self):
169
class ImageResource(object):
170
def __init__(self, image, request):
173
class ImageResourceFactory(object):
174
def __init__(self, path, checker, name):
176
def __call__(self, request):
177
return ImageResource(None, request)
179
from zope.browserresource.interfaces import IResourceFactoryFactory
180
component.provideUtility(ImageResourceFactory, IResourceFactoryFactory,
183
xmlconfig(StringIO(template %
189
''' % os.path.join(tests_path, 'testfiles', 'test.gif')
192
r = component.getAdapter(request, name='test.gif')
193
self.assertTrue(isinstance(r, ImageResource))
195
def testDirectory(self):
196
path = os.path.join(tests_path, 'testfiles', 'subdir')
198
self.assertEqual(component.queryAdapter(request, name='dir'), None)
200
xmlconfig(StringIO(template %
202
<browser:resourceDirectory
209
r = component.getAdapter(request, name='dir')
210
self.assertTrue(isinstance(r, DirectoryResource))
212
self.assertEqual(r.__name__, "dir")
214
# Make sure we can access available attrs and not others
215
for n in ('publishTraverse', 'browserDefault', 'request', '__call__',
216
'get', '__getitem__'):
219
self.assertRaises(Exception, getattr, r, 'directory_factory')
221
inexistent_dir = StringIO(template %
223
<browser:resourceDirectory
225
directory="does-not-exist"
229
self.assertRaises(ConfigurationError, xmlconfig, inexistent_dir)
231
def test_SkinResource(self):
232
self.assertEqual(component.queryAdapter(request, name='test'), None)
234
path = os.path.join(tests_path, 'testfiles', 'test.pt')
235
xmlconfig(StringIO(template % (
241
zope.browserresource.tests.test_directives.ITestLayer"
246
self.assertEqual(component.queryAdapter(request, name='test'), None)
248
r = component.getAdapter(TestRequest(skin=ITestSkin), name='test')
249
self.assertEqual(r._testData(), open(path, 'rb').read())
253
return unittest.makeSuite(Test)