############################################################################## # # Copyright (c) 2005 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. # ############################################################################## """Test local sites $Id: test_utility.py 71269 2006-11-22 13:37:06Z yuppie $ """ import os, sys if __name__ == '__main__': execfile(os.path.join(sys.path[0], 'framework.py')) import unittest import sets from Testing import ZopeTestCase from zope.app import zapi from zope.app.component import getNextUtility from zope.app.component.hooks import setHooks from zope.app.testing.placelesssetup import setUp, tearDown from zope.component import getSiteManager from zope.component import provideUtility from zope.interface import directlyProvides import Products.Five from Products.Five import zcml from Products.Five.site.interfaces import IRegisterUtilitySimply from Products.Five.site.tests.dummy import manage_addDummySite, \ IDummyUtility, ISuperDummyUtility, DummyUtility from Products.Five.site.localsite import enableLocalSiteHook class LocalUtilityServiceTest(ZopeTestCase.ZopeTestCase): def afterSetUp(self): setUp() zcml.load_config("meta.zcml", Products.Five) zcml.load_config("permissions.zcml", Products.Five) zcml.load_config("configure.zcml", Products.Five.component) zcml.load_config("configure.zcml", Products.Five.site) zcml_text = """\ """ import warnings showwarning = warnings.showwarning warnings.showwarning = lambda *a, **k: None zcml.load_string(zcml_text) manage_addDummySite(self.folder, 'site') enableLocalSiteHook(self.folder.site) warnings.showwarning = showwarning # Hook up custom component architecture calls; we need to do # this here because zope.app.component.hooks registers a # cleanup with the testing cleanup framework, so the hooks get # torn down by placelesssetup each time. setHooks() def beforeTearDown(self): tearDown() def test_getSiteManagerHook(self): from Products.Five.site.localsite import FiveSiteManager from Products.Five.site.utility import SimpleLocalUtilityRegistry local_sm = getSiteManager(None) self.failIf(local_sm is zapi.getGlobalSiteManager()) self.failUnless(isinstance(local_sm, FiveSiteManager)) local_sm = getSiteManager(self.folder.site) self.failIf(local_sm is zapi.getGlobalSiteManager()) self.failUnless(isinstance(local_sm, FiveSiteManager)) sm = getSiteManager() self.failUnless(isinstance(sm.utilities, SimpleLocalUtilityRegistry)) def test_getUtilitiesNoUtilitiesFolder(self): sm = getSiteManager() self.failUnless(sm.queryUtility(IDummyUtility) is None) self.assertEquals(list(sm.getUtilitiesFor(IDummyUtility)), []) self.assertEquals(list(sm.getAllUtilitiesRegisteredFor(IDummyUtility)), []) def test_registerUtilityOnUtilityRegistry(self): utils = getSiteManager().utilities dummy = DummyUtility() utils.registerUtility(IDummyUtility, dummy, 'dummy') self.assertEquals(zapi.getUtility(IDummyUtility, name='dummy'), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('dummy', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerUtilityOnSiteManager(self): sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() sm.registerUtility(IDummyUtility, dummy, 'dummy') self.assertEquals(zapi.getUtility(IDummyUtility, name='dummy'), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('dummy', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerUtilityWithZopeComponentAPI1(self): # With positional arguments sm = getSiteManager() dummy = DummyUtility() sm.registerUtility(dummy, IDummyUtility, 'dummy') self.assertEquals(zapi.getUtility(IDummyUtility, name='dummy'), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('dummy', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerUtilityWithZopeComponentAPI1(self): # Without name sm = getSiteManager() dummy = DummyUtility() sm.registerUtility(dummy, IDummyUtility) self.assertEquals(zapi.getUtility(IDummyUtility), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerUtilityWithZopeComponentAPI3(self): # With keyword arguments sm = getSiteManager() dummy = DummyUtility() sm.registerUtility(component=dummy, provided=IDummyUtility, name='dummy') self.assertEquals(zapi.getUtility(IDummyUtility, name='dummy'), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('dummy', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerUtilityWithZopeComponentAPI4(self): # The Full kabob: sm = getSiteManager() dummy = DummyUtility() sm.registerUtility(component=dummy, provided=IDummyUtility, name='dummy', info=u'The Dummy', event=True) self.assertEquals(zapi.getUtility(IDummyUtility, name='dummy'), dummy) self.assertEquals(list(zapi.getUtilitiesFor(IDummyUtility)), [('dummy', dummy)]) self.assertEquals(list(zapi.getAllUtilitiesRegisteredFor( IDummyUtility)), [dummy]) def test_registerTwoUtilitiesWithSameNameDifferentInterface(self): sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() superdummy = DummyUtility() directlyProvides(superdummy, ISuperDummyUtility) sm.registerUtility(IDummyUtility, dummy, 'dummy') sm.registerUtility(ISuperDummyUtility, superdummy, 'dummy') self.assertEquals(zapi.getUtility(IDummyUtility, 'dummy'), dummy) self.assertEquals(zapi.getUtility(ISuperDummyUtility, 'dummy'), superdummy) def test_derivedInterfaceRegistration(self): # Utilities providing a derived interface should be listed # when you ask for an interface. So ask for IDummmyInterace, and # anything registered for IDummyInterface of ISuperDummyInterface # should come back. sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() superdummy = DummyUtility() directlyProvides(superdummy, ISuperDummyUtility) uts = list(sm.getUtilitiesFor(IDummyUtility)) self.failUnlessEqual(uts, []) sm.registerUtility(ISuperDummyUtility, superdummy) # We should be able to access this utility both with # IDummyUtility and ISuperDummyUtility interfaces: uts = list(sm.getUtilitiesFor(IDummyUtility)) self.failUnless(uts[0][1].aq_base is superdummy) uts = list(sm.getUtilitiesFor(ISuperDummyUtility)) self.failUnless(uts[0][1].aq_base is superdummy) # Also try that the standard zapi call works: ut = zapi.getUtility(IDummyUtility, context=self.folder.site) self.failUnless(ut.aq_base is superdummy) ut = zapi.getUtility(ISuperDummyUtility, context=self.folder.site) self.failUnless(ut.aq_base is superdummy) # If we register a second utility we should find both utilities # when looking for the base interface sm.registerUtility(IDummyUtility, dummy) uts = list(sm.getAllUtilitiesRegisteredFor(IDummyUtility)) self.failUnless(dummy in uts) self.failUnless(superdummy in uts) # But we should find only one when looking for the derived interface uts = list(sm.getAllUtilitiesRegisteredFor(ISuperDummyUtility)) self.failUnless(dummy not in uts) self.failUnless(superdummy in uts) def test_nestedSitesDontConflictButStillAcquire(self): # let's register a dummy utility in the dummy site dummy = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy) # let's also create a subsite and make that our site manage_addDummySite(self.folder.site, 'subsite') import warnings showwarning = warnings.showwarning warnings.showwarning = lambda *a, **k: None enableLocalSiteHook(self.folder.site.subsite) warnings.showwarning = showwarning # we should still be able to lookup the original utility from # the site one level above self.assertEqual(zapi.getUtility(IDummyUtility), dummy) # now we register a dummy utility in the subsite and see that # its registration doesn't conflict subdummy = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, subdummy) # when we look it up we get the more local one now because the # more local one shadows the less local one self.assertEqual(zapi.getUtility(IDummyUtility), subdummy) # getAllUtilitiesFor gives us both the more local and the less # local utility (XXX not sure if this is the right semantics # for getAllUtilitiesFor) self.assertEqual(sets.Set(zapi.getAllUtilitiesRegisteredFor(IDummyUtility)), sets.Set([subdummy, dummy])) # getUtilitiesFor will only find one, because the more local # one shadows the less local one self.assertEqual(list(zapi.getUtilitiesFor(IDummyUtility)), [('', subdummy)]) def test_registeringTwiceIsConflict(self): dummy1 = DummyUtility() dummy2 = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy1) self.assertRaises(ValueError, sm.registerUtility, IDummyUtility, dummy2) sm.registerUtility(IDummyUtility, dummy1, 'dummy') self.assertRaises(ValueError, sm.registerUtility, IDummyUtility, dummy2, 'dummy') def test_utilitiesHaveProperAcquisitionContext(self): dummy = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy) # let's see if we can acquire something all the way from the # root (Application) object; we need to be careful to choose # something that's only available from the root object from Acquisition import aq_acquire dummy = zapi.getUtility(IDummyUtility) acquired = aq_acquire(dummy, 'ZopeAttributionButton', None) self.failUnless(acquired is not None) name, dummy = zapi.getUtilitiesFor(IDummyUtility).next() acquired = aq_acquire(dummy, 'ZopeAttributionButton', None) self.failUnless(acquired is not None) dummy = zapi.getAllUtilitiesRegisteredFor(IDummyUtility).next() acquired = aq_acquire(dummy, 'ZopeAttributionButton', None) self.failUnless(acquired is not None) def test_getNextUtility(self): # test local site vs. global site global_dummy = DummyUtility() provideUtility(global_dummy, IDummyUtility) local_dummy = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, local_dummy) self.assertEquals(zapi.getUtility(IDummyUtility), local_dummy) self.assertEquals(getNextUtility(self.folder.site, IDummyUtility), global_dummy) # test local site vs. nested local site manage_addDummySite(self.folder.site, 'subsite') import warnings showwarning = warnings.showwarning warnings.showwarning = lambda *a, **k: None enableLocalSiteHook(self.folder.site.subsite) warnings.showwarning = showwarning sublocal_dummy = DummyUtility() sm = getSiteManager() sm.registerUtility(IDummyUtility, sublocal_dummy) self.assertEquals(zapi.getUtility(IDummyUtility), sublocal_dummy) self.assertEquals(getNextUtility(self.folder.site.subsite, IDummyUtility), local_dummy) self.assertEquals(getNextUtility(self.folder.site, IDummyUtility), global_dummy) class LocalUtilityMigrateTest(ZopeTestCase.ZopeTestCase): def afterSetUp(self): setUp() zcml.load_config("meta.zcml", Products.Five) zcml.load_config("permissions.zcml", Products.Five) zcml.load_config("configure.zcml", Products.Five.component) zcml.load_config("configure.zcml", Products.Five.site) zcml_text = """\ """ import warnings showwarning = warnings.showwarning warnings.showwarning = lambda *a, **k: None zcml.load_string(zcml_text) enableLocalSiteHook(self.folder) warnings.showwarning = showwarning # Hook up custom component architecture calls; we need to do # this here because zope.app.component.hooks registers a # cleanup with the testing cleanup framework, so the hooks get # torn down by placelesssetup each time. setHooks() def test_migration(self): # Migrate from Five.site to Five.component # Register utilities sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() superdummy = DummyUtility() directlyProvides(superdummy, ISuperDummyUtility) sm.registerUtility(IDummyUtility, dummy, 'dummy') sm.registerUtility(ISuperDummyUtility, superdummy, 'dummy') self.assertEquals(zapi.getUtility(IDummyUtility, 'dummy'), dummy) self.assertEquals(zapi.getUtility(ISuperDummyUtility, 'dummy'), superdummy) siteview = self.folder.unrestrictedTraverse('manage_site.html') siteview.migrateToFive15() self.assert_('utilities' not in self.folder.objectIds()) # It should still work self.assertEquals(zapi.getUtility(IDummyUtility, 'dummy'), dummy) self.assertEquals(zapi.getUtility(ISuperDummyUtility, 'dummy'), superdummy) def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(LocalUtilityServiceTest)) suite.addTest(unittest.makeSuite(LocalUtilityMigrateTest)) return suite if __name__ == '__main__': framework()