diff --git a/src/plone/app/texttile/configure.zcml b/src/plone/app/texttile/configure.zcml new file mode 100644 index 0000000..e3f4da6 --- /dev/null +++ b/src/plone/app/texttile/configure.zcml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/src/plone/app/texttile/test_doctests.py b/src/plone/app/texttile/test_doctests.py new file mode 100644 index 0000000..dfd1742 --- /dev/null +++ b/src/plone/app/texttile/test_doctests.py @@ -0,0 +1,35 @@ +import doctest +from plone.testing import layered +import unittest2 as unittest +from base import PASTANDARDTILES_FUNCTIONAL_TESTING, \ + PASTANDARDTILES_TESTTYPE_FUNCTIONAL_TESTING +import pprint +import interlude + +optionflags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE) +normal_testfiles = [ + '../text.txt', +] + + +def test_suite(): + suite = unittest.TestSuite() + suite.addTests([ + layered(doctest.DocFileSuite(test, + optionflags=optionflags, + globs={'interact': interlude.interact, + 'pprint': pprint.pprint, + }, + ), + layer=PASTANDARDTILES_FUNCTIONAL_TESTING) + for test in normal_testfiles]) + suite.addTests([ + layered(doctest.DocFileSuite(test, + optionflags=optionflags, + globs={'interact': interlude.interact, + 'pprint': pprint.pprint, + }, + ), + layer=PASTANDARDTILES_TESTTYPE_FUNCTIONAL_TESTING) + for test in testtype_testfiles]) + return suite diff --git a/src/plone/app/texttile/tests/__init__.py b/src/plone/app/texttile/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plone/app/texttile/tests/base.py b/src/plone/app/texttile/tests/base.py new file mode 100644 index 0000000..db821ea --- /dev/null +++ b/src/plone/app/texttile/tests/base.py @@ -0,0 +1,147 @@ +from plone.app.testing.layers import IntegrationTesting +from plone.app.testing.layers import FunctionalTesting +from plone.app.testing import PloneSandboxLayer +from plone.app.testing import PLONE_FIXTURE +from plone.app.testing import applyProfile +from plone.app.testing import login +from plone.app.testing import logout + +from zope.configuration import xmlconfig + +from zope.interface import implements, Interface +from zope.component import adapts, provideAdapter, getSiteManager + +from zope.publisher.interfaces.browser import IBrowserView, IBrowserRequest +from zope.contentprovider.interfaces import UpdateNotCalled + +from plone.portlets.interfaces import IPortletManager +from plone.portlets.manager import PortletManager, PortletManagerRenderer + +from plone.dexterity.fti import DexterityFTI + +from Products.CMFCore.utils import getToolByName + + +class IMockPortletManager(IPortletManager): + """Marker interface for the mock portlet manager.""" + + +class MockPortletManager(PortletManager): + """Mock portlet manager to use in tests.""" + + implements(IMockPortletManager) + + +class MockPortletManagerRenderer(PortletManagerRenderer): + """Mock portlet manager renderer to use in tests.""" + + adapts(Interface, IBrowserRequest, IBrowserView, IMockPortletManager) + + def __init__(self, context, request, view, manager): + self.__updated = False + + def update(self): + self.__updated = True + + def render(self): + if not self.__updated: + raise UpdateNotCalled + return "Portlet Manager Renderer output." + + +class PAStandardtiles(PloneSandboxLayer): + defaultBases = (PLONE_FIXTURE,) + + def setUpZope(self, app, configurationContext): + # load ZCML + import plone.app.standardtiles + xmlconfig.file('configure.zcml', plone.app.standardtiles, + context=configurationContext) + + def setUpPloneSite(self, portal): + # install into the Plone site + applyProfile(portal, 'plone.app.registry:default') + applyProfile(portal, 'plone.app.dexterity:default') + applyProfile(portal, 'plone.app.intid:default') + applyProfile(portal, 'plone.app.standardtiles:default') + + # register portlet manager and portlet manager renderer + sm = getSiteManager(portal) + sm.registerUtility(component=MockPortletManager(), + provided=IMockPortletManager, + name='mock.portletmanager') + provideAdapter(MockPortletManagerRenderer) + + +class PAStandardtilesTestType(PloneSandboxLayer): + defaultBases = (PLONE_FIXTURE,) + + NORMAL_USER_NAME = 'user' + NORMAL_USER_PASSWORD = 'secret' + EDITOR_USER_NAME = 'editor' + EDITOR_USER_PASSWORD = 'confidential' + MANAGER_USER_NAME = 'manager' + MANAGER_USER_PASSWORD = 'topsecret' + + def setUpZope(self, app, configurationContext): + # load ZCML + import plone.app.standardtiles + xmlconfig.file('testing.zcml', plone.app.standardtiles, + context=configurationContext) + + def setUpPloneSite(self, portal): + # install into the Plone site + applyProfile(portal, 'plone.app.registry:default') + applyProfile(portal, 'plone.app.dexterity:default') + applyProfile(portal, 'plone.app.intid:default') + applyProfile(portal, 'plone.app.standardtiles:default') + + # Creates some users + acl_users = getToolByName(portal, 'acl_users') + acl_users.userFolderAddUser( + self.NORMAL_USER_NAME, + self.NORMAL_USER_PASSWORD, + ['Member'], + [], + ) + acl_users.userFolderAddUser( + self.EDITOR_USER_NAME, + self.EDITOR_USER_PASSWORD, + ['Editor'], + [], + ) + acl_users.userFolderAddUser( + self.MANAGER_USER_NAME, + self.MANAGER_USER_PASSWORD, + ['Manager'], + [], + ) + + # Define the dexterity "junk" type + fti = DexterityFTI('DecoTestType1') + fti.schema = u'plone.app.standardtiles.testing.ITestType1' + fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IDublinCore',) + portal.portal_types._setObject('DecoTestType1', fti) + schema = fti.lookupSchema() + + # inserts the content of the types defined above + login(portal, self.MANAGER_USER_NAME) + content = portal[portal.invokeFactory('DecoTestType1', + 'deco-test-type1')] + content.title = u"Test content" + content.description = u"Just a test content" + content.contributors = (u'Jane Doe', u'John Doe') + logout() + + +PASTANDARDTILES_FIXTURE = PAStandardtiles() +PASTANDARDTILES_TESTTYPE_FIXTURE = PAStandardtilesTestType() + +PASTANDARDTILES_INTEGRATION_TESTING = IntegrationTesting( + bases=(PASTANDARDTILES_FIXTURE,), name="PAStandardTiles:Integration") +PASTANDARDTILES_FUNCTIONAL_TESTING = FunctionalTesting( + bases=(PASTANDARDTILES_FIXTURE,), name="PAStandardTiles:Functional") +PASTANDARDTILES_TESTTYPE_FUNCTIONAL_TESTING = FunctionalTesting( + bases=(PASTANDARDTILES_TESTTYPE_FIXTURE,), + name="PAStandardTilesTestType:Functional", +) diff --git a/src/plone/app/texttile/text.pt b/src/plone/app/texttile/text.pt new file mode 100644 index 0000000..e69de29 diff --git a/src/plone/app/texttile/text.py b/src/plone/app/texttile/text.py new file mode 100644 index 0000000..2c6f939 --- /dev/null +++ b/src/plone/app/texttile/text.py @@ -0,0 +1,3 @@ + +class TextTile(Tile): + """ A text tile """ \ No newline at end of file diff --git a/src/plone/app/texttile/text.txt b/src/plone/app/texttile/text.txt new file mode 100644 index 0000000..2994419 --- /dev/null +++ b/src/plone/app/texttile/text.txt @@ -0,0 +1,55 @@ +Content tiles +============= + +Here we show up the main tiles used for the content usage. + +First, we set up a browser instance and get Manager privileges:: + + >>> from plone.testing.z2 import Browser + >>> app = layer['app'] + >>> browser = Browser(app) + >>> browser.handleErrors = False + >>> portal = layer['portal'] + >>> portalURL = portal.absolute_url() + + >>> from plone.app.testing import setRoles + >>> from plone.app.testing import TEST_USER_ID, TEST_USER_NAME, TEST_USER_PASSWORD + >>> browser.addHeader('Authorization', 'Basic %s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD,)) + >>> setRoles(portal, TEST_USER_ID, ['Manager']) + + >>> from plone.app.standardtiles.tests.base import EDITOR_USER_NAME, EDITOR_USER_PASSWORD, MANAGER_USER_NAME, MANAGER_USER_PASSWORD + + >>> import transaction + >>> transaction.commit() # make the browser see this role + +We also keep another testbrowser handy for testing how tiles are rendered if +you're not logged in:: + + >>> unprivileged_browser = Browser(app) + +We create a page in the site to use it in tests later:: + + >>> browser.open(portalURL + '/createObject?type_name=Document') + >>> browser.getControl(name='title').value = 'A simple page' + >>> browser.getControl(name='description').value = 'A description' + >>> browser.getControl('Save').click() + >>> pageURL = browser.url + >>> pageURL + 'http://nohost/plone/a-simple-page' + +Text tile +------------- + +The text tile displays a list of the keywords (aka subjects) +assigned to the context. + +Add the tile:: + + >>> browser.open(pageURL + '/@@plone.app.texttile.text') + >>> browser.getControl('Save').click() + +The tile will show them:: + + >>> unprivileged_browser.open(pageURL + '/@@plone.app.standardtiles.text') + >>> unprivileged_browser.contents + '...id="category"...Sprint...Statues...' \ No newline at end of file