This tests customerizeability (phew :)) of views and viewlets registered for
a specific layer using `plone.browserlayer`.  Most of the test's setup and
actual code or text was borrowed from that package as well, but let's get
started...

In `testing.zcml` we have registered a view, "layer-test-view", available only
for the layer `plone.app.customerize.tests.interfaces.IMyLayer`.  At first we
have to load the correspongin zcml:

  >>> from Products.Five import zcml
  >>> from Products.Five import fiveconfigure
  >>> fiveconfigure.debug_mode = True
  >>> import plone.app.customerize
  >>> zcml.load_config('tests/testing.zcml', plone.app.customerize)
  >>> fiveconfigure.debug_mode = False

Before the product is installed, we cannot view the view, though:

  >>> from plone.app.customerize.tests.interfaces import IMyLayer
  >>> from plone.browserlayer.utils import register_layer, registered_layers
  >>> IMyLayer in registered_layers()
  False

  >>> self.setRoles(('Manager',))
  >>> browser = self.getBrowser(loggedIn=True)
  >>> browser.open('http://nohost/plone/@@layer-test-view')
  Traceback (most recent call last):
  ...
  HTTPError: HTTP Error 404: Not Found

We can view a view registered for the default layer, though:

  >>> browser.open('http://nohost/plone/@@standard-test-view')
  >>> print browser.contents
  a standard view

At this time only the latter should be customerizable:

  >>> browser.open('http://nohost/plone/portal_view_customizations/registrations.html')
  >>> browser.contents
  '...Plone View Customizations...
   ...The following list shows all registered...
   ...<a href="@@customizezpt.html?...view_name=standard-test-view"...
   ...>standard-test-view</a>...'
  >>> 'layer-test-view' in browser.contents
  False

However, if we install the product both views should be traversable and both
should also show up as being customizable:

  >>> register_layer(IMyLayer, name='my.product')
  >>> IMyLayer in registered_layers()
  True

  >>> browser.open('http://nohost/plone/@@layer-test-view')
  >>> print browser.contents
  a local view

  >>> browser.open('http://nohost/plone/@@standard-test-view')
  >>> print browser.contents
  a standard view

  >>> browser.open('http://nohost/plone/portal_view_customizations/registrations.html')
  >>> browser.contents
  '...Plone View Customizations...
   ...The following list shows all registered...
   ...<a href="@@customizezpt.html?...view_name=layer-test-view"...
   ...>layer-test-view</a>...
   ...<a href="@@customizezpt.html?...view_name=standard-test-view"...
   ...>standard-test-view</a>...'

The layer is unregistered again to clean up for the remainder of the test:

  >>> from plone.browserlayer.utils import unregister_layer
  >>> unregister_layer(name='my.product')
  >>> IMyLayer in registered_layers()
  False

The same should be true for viewlets.  First we need to set them up via the
GenericSetup profile provided for testing, after which the standard viewlet
should show up on the home page:

  >>> from Products.CMFCore.utils import getToolByName
  >>> portal_setup = getToolByName(self.portal, 'portal_setup')
  >>> _ = portal_setup.runAllImportStepsFromProfile('profile-plone.app.customerize:testing')

  >>> browser.open('http://nohost/plone/')
  >>> browser.contents
  '...<a id="portal-logo"...
   ...a standard view...
   ...Sections...'
  >>> 'a local view' in browser.contents
  False

The standard viewlet should be customizable, but not the local one:

  >>> browser.open('http://nohost/plone/portal_view_customizations/registrations.html')
  >>> browser.contents
  '...Plone View Customizations...
   ...The following list shows all registered...
   ...<a href="@@customizezpt.html?...view_name=standard-test-viewlet"...
   ...>standard-test-viewlet</a>...'
  >>> 'layer-test-viewlet' in browser.contents
  False

Again, the layer is registered and now both viewlets should show up on the
home page and as being customizable:

  >>> register_layer(IMyLayer, name='my.product')
  >>> IMyLayer in registered_layers()
  True

  >>> browser.open('http://nohost/plone/')
  >>> browser.contents
  '...<a id="portal-logo"...
   ...a local view...a standard view...
   ...Sections...'

  >>> browser.open('http://nohost/plone/portal_view_customizations/registrations.html')
  >>> browser.contents
  '...Plone View Customizations...
   ...The following list shows all registered...
   ...<a href="@@customizezpt.html?...view_name=layer-test-viewlet"...
   ...>layer-test-viewlet</a>...
   ...<a href="@@customizezpt.html?...view_name=standard-test-viewlet"...
   ...>standard-test-viewlet</a>...'

We still need to make sure the local view and viewlet can actually be
customerized.  Well, that is really customerizing things in a test doesn't
work at the moment, but we can at least have a look at their respective
info pages:

  >>> browser.getLink('layer-test-view').click()
  >>> browser.contents
  '...The following is the source of...layer-test-view...
   ...<dl>...
   ...view name...layer-test-view...
   ...registered for interface...zope.interface.Interface...
   ...registered for request type...plone.app.customerize.tests.interfaces.IMyLayer...
   ...template file...plone.app.customerize.tests/local.pt...
   ...zcml file...plone.app.customerize.tests/testing.zcml...
   ...</dl>...
   ...<pre>a local view</pre>...'

  >>> browser.goBack()
  >>> browser.getLink('layer-test-viewlet').click()
  >>> browser.contents
  '...The following is the source of...layer-test-viewlet...
   ...<dl>...
   ...view name...layer-test-viewlet...
   ...registered for interface...zope.interface.Interface...
   ...registered for request type...plone.app.customerize.tests.interfaces.IMyLayer...
   ...template file...plone.app.customerize.tests/local.pt...
   ...zcml file...plone.app.customerize.tests/testing.zcml...
   ...</dl>...
   ...<pre>a local view</pre>...'

As a last test to make sure the extension_ for browserlayer awareness
doesn't have any unwanted side effects, we compare the list of registrations
with the layer registered and not.  The set difference should come down to
only the locally registered view and viewlet:

  >>> from plone.app.customerize.registration import templateViewRegistrations
  >>> IMyLayer in registered_layers()
  True
  >>> with_layer = set([ reg.name for reg in templateViewRegistrations() ])
  >>> unregister_layer(name='my.product')
  >>> IMyLayer in registered_layers()
  False
  >>> without_layer = set([ reg.name for reg in templateViewRegistrations() ])
  >>> without_layer.issubset(with_layer)
  True
  >>> sorted(list(with_layer.difference(without_layer)))
  [u'layer-test-view', u'layer-test-viewlet']

  .. _extension: http://dev.plone.org/plone/changeset/20088

Let's do a test to show that if two browser layers register a viewlet with the
same name, we can customize both of them.  First we load another zcml file
which registers a new viewlet for a second layer, and register both layers:

  >>> zcml.load_config('tests/duplicate_viewlet.zcml', plone.app.customerize)
  >>> from plone.app.customerize.tests.interfaces import IOtherLayer
  >>> register_layer(IMyLayer, name='my.product')
  >>> register_layer(IOtherLayer, name='my.otherproduct')

Now we should see two registrations with this view name:

  >>> browser.open('http://nohost/plone/portal_view_customizations/registrations.html')
  >>> browser.contents
  '...Plone View Customizations...
   ...The following list shows all registered...
   ...<a href="@@customizezpt.html?...view_name=layer-test-viewlet"...
   ...>layer-test-viewlet</a>...
   ...<a href="@@customizezpt.html?...view_name=layer-test-viewlet"...
   ...>layer-test-viewlet</a>...'

But they should link to different places:

  >>> my = browser.getLink(url='IMyLayer&view_name=layer-test-viewlet')
  >>> other = browser.getLink(url='IOtherLayer&view_name=layer-test-viewlet')
  >>> my.text == other.text
  True
  >>> my.url == other.url
  False

