# Flon is a package for enabling hand picked Five features in Plone # Copyright (C) 2004 Enfold Systems, LLC # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # """ $Id: __init__.py,v 1.2 2004/07/14 22:23:16 dreamcatcher Exp $ """ import os, sys if __name__ == '__main__': execfile(os.path.join(sys.path[0], 'framework.py')) # Load fixture from Testing import ZopeTestCase from Products.CMFPlone.tests import PloneTestCase # Install our product ZopeTestCase.installProduct('ProxyIndex') ZopeTestCase.installProduct('Flon') ZopeTestCase.installProduct('Five') from Products.CMFCore.utils import getToolByName from Products.CMFPlone.tests.testBrowserDefault import TestDefaultPage from Products.Five.traversable import FakeRequest from Products.Five.browser import BrowserView from zope.interface import implements, Interface, directlyProvides from zope.app.component.interface import provideInterface from zope.interface import Interface from zope.publisher.interfaces.browser import IBrowserRequest from zope.app import zapi from zope.app.tests import placelesssetup, ztapi from zope.app.component.interface import provideInterface from zope.app.apidoc.viewmodule import ISkinRegistration from zope.app.apidoc.viewmodule import ISkinDocumentation, SkinDocumentation from zope.app.apidoc.viewmodule import ILayerRegistration from zope.app.apidoc.viewmodule import ILayerDocumentation, LayerDocumentation from sets import Set class IFoo(Interface): pass class IBar(Interface): pass class FooView(BrowserView): pass class ViewsTest(PloneTestCase.PloneTestCase): def afterSetUp(self): # XXX There needs to be a way to do this cleanly and # clean on tearDown or maybe move to a test.zcml file? self.qi = getToolByName(self.portal, 'portal_quickinstaller') self.qi.installProduct('Flon') self.it = getToolByName(self.portal, 'portal_interface') pres = zapi.getGlobalService('Presentation') for index in range(1, 6): pres.defineLayer('layer'+str(index)) pres.defineSkin('skinA', ['default'], 'doc skin A') pres.defineSkin('skinB', ['layer5', 'layer4', 'default'], 'doc skin B') pres.defineSkin('skinC', ['layer4', 'layer2', 'layer1', 'default'], 'doc skin C') provideInterface('IFoo', IFoo) provideInterface('IBrowserRequest', IBrowserRequest) ztapi.browserView(IFoo, 'index.html', FooView, layer='default') def test_views(self): view = self.it.unrestrictedTraverse('@@skin_layer') skins = dict([(s.name, s.layers) for s in view.getSkins(False)]) self.failUnless('skinA' in skins, skins) self.failUnless('skinB' in skins, skins) self.failUnless('skinC' in skins, skins) # Sort # is order important? #[v.sort() for k, v in skins.items()] layers = lambda s: [l.name for l in s] self.assertEquals(layers(skins['skinA']), ['default']) self.assertEquals(Set(layers(skins['skinB'])), Set(['layer5', 'layer4', 'default'])) self.assertEquals(Set(layers(skins['skinC'])), Set(['layer4', 'layer2', 'layer1', 'default'])) # Test view details request = self.it.REQUEST request['iface'] = 'IFoo' request['type'] = 'IBrowserRequest' view = self.it.unrestrictedTraverse('@@view_details') layer = view.getViewsByLayers()[0] self.assertEquals(layer['name'], 'default') view = layer['views'][0] info = dict(view) self.assertEquals(info['name'], 'index.html') finfo = dict(info['factory']) self.assertEquals(finfo['template'], None) self.assertEquals(finfo['path'], 'test_views.FooView') class TestDefaultView(TestDefaultPage): def afterSetUp(self): TestDefaultPage.afterSetUp(self) self.ob = self.ob.__of__(self.portal) def getDefault(self, request=None): from Products.Flon.browser import BrowserDefault if request is None: request = self.portal.REQUEST return BrowserDefault(self.ob).defaultView(request) def testdefaultViewPrecedence(self): pres = zapi.getGlobalService('Presentation') type = IBrowserRequest ztapi.browserView(IFoo, 'foo.html', FooView, layer='default') ztapi.browserView(IFoo, 'bar.html', FooView, layer='default') directlyProvides(self.ob, IFoo) pres.setDefaultViewName(IFoo, type, 'foo.html') self.ob.set_default(['baz'], 0) # baz doesn't exist, should get foo.html which exists self.ob.keys = [] self.assertEquals(self.getDefault(), (self.ob, ['foo.html'])) # And if changed to bar, then we get bar pres.setDefaultViewName(IFoo, type, 'bar.html') self.assertEquals(self.getDefault(), (self.ob, ['bar.html'])) # But if baz exists, we should get baz self.ob.keys = ['baz'] self.assertEquals(self.getDefault(), (self.ob, ['baz'])) # Now, if index_html exists, it should have precedence self.ob.keys = ['index_html'] self.assertEquals(self.getDefault(), (self.ob, ['index_html'])) # The same for index.html self.ob.keys = ['index.html'] self.assertEquals(self.getDefault(), (self.ob, ['index.html'])) # And for Frontpage self.ob.keys = ['FrontPage'] self.assertEquals(self.getDefault(), (self.ob, ['FrontPage'])) # And then, if we don't implement IFoo anymore, and there's # no content, we should get None, which will trigger the fallback # browserDefault method. directlyProvides(self.ob, IBar) self.ob.keys = [] self.assertEquals(self.getDefault(), (self.ob, None)) def get_default(ob, request=None): from Products.Flon.browser import BrowserDefault if request is None: request = ob.REQUEST return BrowserDefault(ob).defaultView(request) class TestContentDefaultView(PloneTestCase.PloneTestCase): def test_document_default(self): self.loginPortalOwner() p = self.portal if not 'index_html' in p.objectIds(): p.invokeFactory('Document', 'index_html') ob = self.portal.index_html self.assertEquals(ob.getPortalTypeName(), 'Document') default = get_default(ob) self.assertEquals(default, (ob, ['document_view'])) def test_news_default(self): self.loginPortalOwner() p = self.portal p.invokeFactory('News Item', 'news1') ob = self.portal.news1 self.assertEquals(ob.getPortalTypeName(), 'News Item') default = get_default(ob) self.assertEquals(default, (ob, ['newsitem_view'])) def test_folder_default(self): self.loginPortalOwner() p = self.portal p.invokeFactory('Folder', 'test') ob = self.portal.test self.assertEquals(ob.getPortalTypeName(), 'Folder') default = get_default(ob) self.assertEquals(default, (ob, None)) def test_suite(): import unittest suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(ViewsTest)) suite.addTest(unittest.makeSuite(TestContentDefaultView)) suite.addTest(unittest.makeSuite(TestDefaultView)) return suite if __name__ == '__main__': framework(descriptions=1, verbosity=1)