1##############################################################################
2#
3# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
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.
12#
13##############################################################################
14"""Tests for browser:defaultSkin and browser:defaultView directives
15"""
16from cStringIO import StringIO
17import doctest
18import unittest
19
20from zope.testing import cleanup
21from zope import component
22
23from zope.configuration.xmlconfig import XMLConfig, xmlconfig
24from zope.publisher.browser import TestRequest, BrowserView
25from zope.publisher.defaultview import getDefaultViewName
26from zope.publisher.interfaces import IDefaultViewName, IDefaultSkin
27from zope.publisher.interfaces.browser import IBrowserRequest
28from zope.interface import Interface, implements, providedBy, directlyProvides
29
30import zope.publisher
31
32class IOb(Interface):
33    pass
34
35class Ob(object):
36    implements(IOb)
37
38class ITestLayer(IBrowserRequest):
39    """Test Layer."""
40
41class ITestSkin(ITestLayer):
42    """Test Skin."""
43
44class V1(BrowserView):
45    pass
46
47class V2(BrowserView):
48    pass
49
50
51request = TestRequest()
52ob = Ob()
53
54template = """<configure
55   xmlns='http://namespaces.zope.org/zope'
56   xmlns:browser='http://namespaces.zope.org/browser'
57   i18n_domain='zope'>
58   %s
59   </configure>"""
60
61class Test(cleanup.CleanUp, unittest.TestCase):
62
63    def setUp(self):
64        super(Test, self).setUp()
65        XMLConfig('meta.zcml', zope.publisher)()
66
67    def testDefaultView(self):
68        self.assertTrue(
69            component.queryMultiAdapter((ob, request), IDefaultViewName) is None)
70        xmlconfig(StringIO(template % (
71            '''
72            <browser:defaultView
73                name="test"
74                for="zope.publisher.tests.test_zcml.IOb" />
75            '''
76            )))
77
78        self.assertEqual(getDefaultViewName(ob, request), 'test')
79
80    def testDefaultViewWithLayer(self):
81        class FakeRequest(TestRequest):
82            implements(ITestLayer)
83        request2 = FakeRequest()
84
85        self.assertEqual(
86            component.queryMultiAdapter((ob, request2), IDefaultViewName),
87            None)
88
89        xmlconfig(StringIO(template % (
90            '''
91            <browser:defaultView
92                for="zope.publisher.tests.test_zcml.IOb"
93                name="test"
94                />
95            <browser:defaultView
96                for="zope.publisher.tests.test_zcml.IOb"
97                layer="zope.publisher.tests.test_zcml.ITestLayer"
98                name="test2"
99                />
100            '''
101            )))
102
103        self.assertEqual(
104            zope.publisher.defaultview.getDefaultViewName(ob, request2),
105            'test2')
106        self.assertEqual(
107            zope.publisher.defaultview.getDefaultViewName(ob, request),
108            'test')
109
110    def testDefaultViewForClass(self):
111        self.assertEqual(
112            component.queryMultiAdapter((ob, request), IDefaultViewName),
113            None)
114
115        xmlconfig(StringIO(template % (
116            '''
117            <browser:defaultView
118                for="zope.publisher.tests.test_zcml.Ob"
119                name="test"
120                />
121            '''
122            )))
123
124        self.assertEqual(
125            zope.publisher.defaultview.getDefaultViewName(ob, request),
126            'test')
127
128    def testDefaultSkin(self):
129        request = TestRequest()
130        self.assertEqual(
131            component.queryMultiAdapter((ob, request), name='test'),
132            None)
133
134        XMLConfig('meta.zcml', component)()
135        xmlconfig(StringIO(template % (
136            '''
137            <interface
138                interface="
139                  zope.publisher.tests.test_zcml.ITestSkin"
140                type="zope.publisher.interfaces.browser.IBrowserSkinType"
141                name="Test Skin"
142                />
143            <browser:defaultSkin name="Test Skin" />
144            <view
145                for="zope.publisher.tests.test_zcml.IOb"
146                type="zope.publisher.interfaces.browser.IDefaultBrowserLayer"
147                name="test"
148                factory="zope.publisher.tests.test_zcml.V1"
149                />
150            <view
151                for="zope.publisher.tests.test_zcml.IOb"
152                type="zope.publisher.tests.test_zcml.ITestLayer"
153                name="test"
154                factory="zope.publisher.tests.test_zcml.V2"
155                />
156            '''
157            )))
158
159        # Simulate Zope Publication behavior in beforeTraversal()
160        adapters = component.getSiteManager().adapters
161        skin = adapters.lookup((providedBy(request),), IDefaultSkin, '')
162        directlyProvides(request, skin)
163
164        v = component.queryMultiAdapter((ob, request), name='test')
165        self.assertTrue(isinstance(v, V2))
166
167def test_suite():
168    return unittest.TestSuite((
169            unittest.makeSuite(Test),
170            doctest.DocFileSuite('../configure.txt'),
171            ))
172