def test_getNextUtility(self): # test local site vs. global site global_dummy = DummyUtility() provideUtility(global_dummy, IDummyUtility) local_dummy = DummyUtility() sm = zapi.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') enableLocalSiteHook(self.folder.site.subsite) setSite(self.folder.site.subsite) sublocal_dummy = DummyUtility() sm = zapi.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)
def test_nestedSitesDontConflictButStillAcquire(self): # let's register a dummy utility in the dummy site dummy = DummyUtility() sm = zapi.getSiteManager() sm.registerUtility(IDummyUtility, dummy) # let's also create a subsite and make that our site manage_addDummySite(self.folder.site, 'subsite') enableLocalSiteHook(self.folder.site.subsite) setSite(self.folder.site.subsite) # 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 = zapi.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_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)
def test_registeringTwiceIsConflict(self): dummy1 = DummyUtility() dummy2 = DummyUtility() sm = zapi.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_registerTwoUtilitiesWithSameNameDifferentInterface(self): sm = zapi.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_registerUtilityOnUtilityRegistry(self): utils = zapi.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_registerUtilityOnUtilityService(self): utils = zapi.getService(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 = zapi.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_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 = zapi.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_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_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_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_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_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_utilitiesHaveProperAcquisitionContext(self): dummy = DummyUtility() sm = zapi.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)