Functional test for local sites
===============================
This tests how local site managers are found during traversal and how
that affects component lookup (depending on whether a site is
traversed or not, local components might or might not be found).
First, we set up all of Five:
>>> import Products.Five
>>> from Products.Five import zcml
>>> zcml.load_config("configure.zcml", Products.Five)
Then we hook up the 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.
>>> from zope.app.component.hooks import setHooks
>>> setHooks()
Next we turn our DummySite class into a site in ZCML (and register
some views that will provide us with some test info),
>>> zcml_text = """
...
...
...
...
...
...
...
...
...
...
...
... """
>>> import warnings
>>> showwarning = warnings.showwarning
>>> warnings.showwarning = lambda *a, **k: None
>>> zcml.load_string(zcml_text)
>>> warnings.showwarning = showwarning
then we add an instance to our folder:
>>> from Products.Five.site.tests.dummy import manage_addDummySite
>>> nothing = manage_addDummySite(self.folder, 'site')
Now we check what the info view tells us about local component lookup:
>>> import warnings
>>> showwarning = warnings.showwarning
>>> warnings.showwarning = lambda *a, **k: None
>>> print http(r'''
... GET /test_folder_1_/site/@@checkSiteManager.html HTTP/1.1
... ''')
HTTP/1.1 200 OK
...
zapi.getSiteManager() is zapi.getGlobalSiteManager(): True
IFiveUtilityRegistry.providedBy(utility_service): False
isinstance(zapi.getSiteManager(), FiveSiteManager): False
We see that we have no local component lookup yet, because we haven't
set the site. Therefore, enable the traversal hook by using the view
that's provided for this task (we first need to create a manager
account in order to be able to access it):
>>> uf = self.folder.acl_users
>>> uf._doAddUser('manager', 'r00t', ['Manager'], [])
>>> import warnings
>>> showwarning = warnings.showwarning
>>> warnings.showwarning = lambda *a, **k: None
>>> print http(r'''
... POST /test_folder_1_/site/@@manage_site.html HTTP/1.1
... Authorization: Basic manager:r00t
... Content-Length: 25
...
... UPDATE_MAKESITE=Make site''')
HTTP/1.1 200 OK
...
>>> warnings.showwarning = showwarning
>>> warnings.showwarning = showwarning
Now we call the info view again and find that local component lookup
is working:
>>> print http(r'''
... GET /test_folder_1_/site/@@checkSiteManager.html HTTP/1.1
... ''')
HTTP/1.1 200 OK
...
zapi.getSiteManager() is zapi.getGlobalSiteManager(): False
IFiveUtilityRegistry.providedBy(utility_service): True
isinstance(zapi.getSiteManager(), FiveSiteManager): True
Of course, sites are only active *during* traversal; after traversal
they're gone:
>>> from zope.app.component.hooks import getSite
>>> getSite() is None
True
We can also register utilities now:
>>> from zope.app import zapi
>>> sm = self.folder.site.getSiteManager()
>>> from Products.Five.site.tests.dummy import IDummyUtility, DummyUtility
>>> dummy = DummyUtility()
>>> sm.registerUtility(IDummyUtility, dummy)
and find them being looked up just fine:
>>> print http(r'''
... GET /test_folder_1_/site/@@lookupUtilities.html HTTP/1.1
... ''')
HTTP/1.1 200 OK
...
zapi.getUtility(IDummyUtility) == dummy: True
Of course, we can't look it up once the request has ended, because we
lose the local site setup:
>>> zapi.getUtility(IDummyUtility)
Traceback (most recent call last):
...
ComponentLookupError: (, '')
At last we can "unmake" the site using the browser view provided by
Five:
>>> import warnings
>>> showwarning = warnings.showwarning
>>> warnings.showwarning = lambda *a, **k: None
>>> print http(r'''
... POST /test_folder_1_/site/@@manage_site.html HTTP/1.1
... Authorization: Basic manager:r00t
... Content-Length: 29
...
... UPDATE_UNMAKESITE=Unmake site''')
HTTP/1.1 200 OK
...
>>> warnings.showwarning = showwarning
And everything is back to normal with respect to local component
lookup:
>>> import warnings
>>> showwarning = warnings.showwarning
>>> warnings.showwarning = lambda *a, **k: None
>>> print http(r'''
... GET /test_folder_1_/site/@@checkSiteManager.html HTTP/1.1
... ''')
HTTP/1.1 200 OK
...
zapi.getSiteManager() is zapi.getGlobalSiteManager(): True
IFiveUtilityRegistry.providedBy(utility_service): False
isinstance(zapi.getSiteManager(), FiveSiteManager): False
Finally, global services and the monkeys:
>>> from zope.app.testing.placelesssetup import tearDown
>>> tearDown()