
Imports.
  >>> from zope.component import getUtility, getAdapter, getMultiAdapter
  >>> from plone.portlets.interfaces import IPortletManager, IPortletRetriever, IPortletAssignmentMapping
  >>> from plone.portlets.utils import hashPortletInfo
  >>> from Products.GenericSetup.tests.common import DummyImportContext, DummyExportContext
  >>> from plone.app.portlets.exportimport.portlets import importPortlets, exportPortlets
  >>> from plone.app.portlets.exportimport.interfaces import IPortletAssignmentExportImportHandler
  >>> from collective.weightedportlets import ATTR

  >>> from plone.app.testing import TEST_USER_ID
  >>> from plone.app.testing import TEST_USER_NAME
  >>> from plone.app.testing import TEST_USER_PASSWORD
  >>> from plone.app.testing import SITE_OWNER_NAME
  >>> from plone.app.testing import SITE_OWNER_PASSWORD
  >>> from plone.testing.z2 import Browser

Portlet weighting
=================

Here we kick off the ZOPE test browser package.

  >>> app = layer['app']
  >>> portal = layer['portal']
  >>> 'collective.weightedportlets' in [x.get('id') for x in portal.portal_quickinstaller.listInstalledProducts()]
  True    
  >>> portal_url = portal.absolute_url()
  >>> portal_url
  'http://nohost/plone'

  >>> browser = Browser(app)
  >>> browser.open(portal_url + '/login')
  >>> browser.getControl(name='__ac_name').value = SITE_OWNER_NAME
  >>> browser.getControl(name='__ac_password').value = SITE_OWNER_PASSWORD
  >>> browser.getControl(name='submit').click()

Did we manage to log in correctly

  >>> "You are now logged in" in browser.contents
  True

  >>> browser.open(portal_url)
  >>> browser.url == portal_url
  True

  >>> view = portal.restrictedTraverse('@@plone')
  >>> manager = getUtility(IPortletManager, name='plone.leftcolumn', context=portal)
  >>> retriever = getMultiAdapter((portal, manager), IPortletRetriever)
  >>> [p['name'] for p in retriever.getPortlets()]
  []

Lets add a portlet - Use the 'Add portlet' select box to add a login portlet.

  >>> browser.open(portal_url + "/@@manage-portlets")
  >>> leftcolumn_form = browser.getForm(index=1)
  >>> add_portlet_select = leftcolumn_form.getControl(name=":action", index=0)
  >>> val = "/++contextportlets++plone.leftcolumn/+/portlets.Login"
  >>> add_portlet_select.getControl(value=val).selected = True
  >>> leftcolumn_form.submit()
  >>> print browser.contents
  <BLANKLINE>
  ...<input type="text" size="2" class="weight" title="Portlet Weight" data-portlethash="..." value="50" />...

Now we call the AJAX action which would normally be triggered by Javascript, lets check that weight works
  >>> browser.open(portal_url + "/@@manage-portlets")
  >>> portlethash = hashPortletInfo(dict(manager='plone.leftcolumn', category='context', name='label_log_in', key='/plone'))
  >>> url = 'http://nohost/plone/@@assign-weight-info?weight=42&portlethash='+portlethash
  >>> browser.open(url)
  >>> browser.contents == ''
  True

Now lets check that it errors out on strings
  >>> browser.open(portal_url + "/@@manage-portlets")
  >>> portlethash = hashPortletInfo(dict(manager='plone.leftcolumn', category='context', name='label_log_in', key='/plone'))
  >>> url = 'http://nohost/plone/@@assign-weight-info?weight=a&portlethash='+portlethash
  >>> browser.open(url)
  >>> 'Error: You must enter an integer for the portlet weight' in browser.contents
  True

Now lets check that weight also works for portlet not on the root
  >>> browser.open(portal_url + "/myfolder/@@manage-portlets")
  >>> leftcolumn_form = browser.getForm(index=1)
  >>> add_portlet_select = leftcolumn_form.getControl(name=":action", index=0)
  >>> val = "/++contextportlets++plone.leftcolumn/+/portlets.Login"
  >>> add_portlet_select.getControl(value=val).selected = True
  >>> leftcolumn_form.submit()
  >>> print browser.contents
  <BLANKLINE>
  ...<input type="text" size="2" class="weight" title="Portlet Weight" data-portlethash="..." value="50" />...

  >>> browser.open(portal_url + "/myfolder/@@manage-portlets")
  >>> portlethash = hashPortletInfo(dict(manager='plone.leftcolumn', category='context', name='label_log_in', key='/plone/myfolder'))
  >>> url = 'http://nohost/plone/myfolder/@@assign-weight-info?weight=42&portlethash='+portlethash
  >>> browser.open(url)
  >>> browser.contents == ''
  True


GenericSetup Import/Export
==========================

Portlet weights can be included when loading portlet assignments using GenericSetup.
  >>> context = DummyImportContext(portal, purge=False)
  >>> context._files['portlets.xml'] = """<?xml version="1.0"?>
  ... <portlets>
  ...    <assignment
  ...        name="testportlet"
  ...        type="portlets.Calendar"
  ...        manager="plone.leftcolumn"
  ...        category="context"
  ...        key="/"
  ...        weight="40"
  ...    />
  ... </portlets>"""
  >>> importPortlets(context)
  >>> portlets = retriever.getPortlets()
  >>> [p['name'] for p in portlets]
  ['testportlet', 'label_log_in']

  >>> getattr(portlets[0]['assignment'], ATTR, {}).get('weight')
  40

And they are also included when exporting portlet assignments.
  >>> context = DummyExportContext(portal)
  >>> exportPortlets(context)
  >>> """<assignment name="testportlet" category="context" key="/"\n    manager="plone.leftcolumn" type="portlets.Calendar" visible="True"\n    weight="40"/>\n""" in context._wrote[0][1]
  True

Uninstallation
==============

Uninstall the product.
  >>> portal.portal_quickinstaller.uninstallProducts(['collective.weightedportlets'])

Now make sure that our local override of the portlet retriever has been removed.
  >>> getMultiAdapter((portal, manager), IPortletRetriever)
  <plone.portlets.retriever.PortletRetriever object at ...>

And same for the override of the assignment importer/exporter.
  >>> getAdapter(portal, IPortletAssignmentExportImportHandler)
  <plone.app.portlets.exportimport.portlets.PropertyPortletAssignmentExportImportHandler object at ...>
