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