Policy ====== Template -------- ``test_setup.py`` .. code-block:: python from Products.CMFCore.utils import getToolByName import unittest2 as unittest from collective.mypackage.testing import \ COLLECTIVE_MYPACKAGE_INTEGRATION_TESTING class TestExample(unittest.TestCase): layer = COLLECTIVE_MYPACKAGE_INTEGRATION_TESTING def setUp(self): self.app = self.layer['app'] self.portal = self.layer['portal'] self.qi_tool = getToolByName(self.portal, 'portal_quickinstaller') def test_product_is_installed(self): """ Validate that our products GS profile has been run and the product installed """ pid = 'puxam.policy' installed = [p['id'] for p in self.qi_tool.listInstalledProducts()] self.assertTrue(pid in installed, 'package appears not to have been installed') Dependencies ------------ Test if dependencies have been installed:: def test_product_is_installed(self): """ Validate that our products GS profile has been run and the product has been installed. """ pid = 'collective.mailchimp' installed = [p['id'] for p in self.qi_tool.listInstalledProducts()] self.assertTrue( pid in installed, "The package '%s' appears not to have been installed." % pid') ``setup.py`` .. code-block:: python install_requires=[ 'setuptools', 'collective.mailchimp', ], ``profiles/default/metadata.xml`` .. code-block:: xml 1 profile-collective.mailchimp:default Javascript Registration ----------------------- Test if a Javascript file has been registered .. code-block:: python def test_js_available(self): jsreg = getattr(self.portal, 'portal_javascripts') script_ids = jsreg.getResourceIds() self.assertTrue('BarackSlideshow.js' in script_ids) CSS Registration ---------------- .. code-block:: python def test_mailchimp_css_available(self): cssreg = getToolByName(self.portal, "portal_css") stylesheets_ids = cssreg.getResourceIds() self.assertTrue( '++resource++collective.mailchimp.stylesheets/mailchimp.css' in stylesheets_ids ) def test_mailchimp_css_enabled(self): cssreg = getToolByName(self.portal, "portal_css") self.assertTrue( cssreg.getResource( '++resource++collective.mailchimp.stylesheets/mailchimp.css' ).getEnabled() ) Layer registered ``interfaces.py`` .. code-block:: python from zope.interface import Interface class IJungzeelandiaTheme(Interface): """""" ``browserlayer.xml`` .. code-block:: xml ``test_setup.py`` .. code-block:: python def test_barackslideshow_layer_available(self): from plone.browserlayer import utils from collective.barackslideshow.tests.layer import IBarackSlideshowLayer self.failUnless(IBarackSlideshowLayer in utils.registered_layers()) Exclude From Search .. code-block:: python def makeTypeSearchable(portal, type_id, searchable): ptool = getToolByName(portal, 'portal_properties') blacklisted = list(ptool.site_properties.getProperty('types_not_searched')) if searchable and type_id in blacklisted: blacklisted.remove(type_id) elif not searchable and type_id not in blacklisted: blacklisted.append(type_id) ptool.site_properties.manage_changeProperties( types_not_searched=blacklisted) makeTypeSearchable(portal, 'Image', searchable=False) Test .. code-block:: python def test_exclude_images_from_search(self): self.assertTrue( 'Image' in \ self.ptool.site_properties.getProperty("types_not_searched")) Resource Directories ``test_setup.py`` .. code-block:: python def test_resources_directory(self): self.assertTrue( self.portal.restrictedTraverse( "++theme++dkg.contenttypes/medical-information.png" ) ) configure.zcml .. code-block:: xml Image .. code-block:: python def test_method_render_grafik(self): self.portal.mi.eb.invokeFactory('grafik', 'text1') image_file = os.path.join(os.path.dirname(__file__), u'logo.jpg') self.portal.mi.eb.text1.grafik = NamedBlobImage( data=open(image_file, 'r').read(), contentType='image/jpg', filename=u'logo.jpg' ) self.assertTrue(self.portal.mi.eb.text1.render()) Test if code is run as test .. code-block:: python if self.request['URL'] == 'http://nohost': # test run Catalog Catalog Indexes .. code-block:: python def test_catalog_indexes(self): self.assertTrue('title' in self.portal.portal_catalog.indexes()) self.assertTrue('total_comments' in self.portal.portal_catalog.indexes()) ``catalog.xml`` .. code-block:: xml Catalog Metadata .. code-block:: python def test_catalog_metadata_installed(self): self.portal.invokeFactory('freitag.article.article', 'article') self.portal.article.catchword = "Foo" self.portal.article.reindexObject() self.assertTrue('catchword' in self.catalog.schema()) result = self.catalog.searchResults( path='/'.join(self.portal.article.getPhysicalPath())) self.assertTrue(len(result), 1) self.assertEquals(result[0].catchword, "Foo") catalog.xml .. code-block:: xml Searchable index .. code-block:: python def test_subjects_searchable(self): self.folder.invokeFactory("Document", "doc1") doc1 = self.folder.doc1 doc1.setSubject([u"Python", u"Pyramid"]) doc1.reindexObject() result = self.catalog.searchResults(dict( SearchableText = "Python" )) self.assertTrue(len(result), 1) self.assertTrue(result[0].title, "doc1") Generic Setup Hide content type from navigation .. code-block:: python def test_hide_types_form_navigation(self): navtree_properties = self.portal.portal_properties.navtree_properties self.assertTrue(navtree_properties.hasProperty('metaTypesNotToList')) self.assertTrue('freitag.membership.emailresetter' in navtree_properties.metaTypesNotToList) self.assertTrue('freitag.membership.member' in navtree_properties.metaTypesNotToList) self.assertTrue('freitag.membership.passwordresetter' in navtree_properties.metaTypesNotToList) self.assertTrue('freitag.membership.registrator' in navtree_properties.metaTypesNotToList) ``profiles/default/propertiestool.xml`` .. code-block:: xml NavigationTree properties Do not search content type .. code-block:: python def test_types_not_searched(self): types_not_searched = self.portal.portal_properties\ .site_properties.types_not_searched self.assertTrue('freitag.membership.emailresetter' in types_not_searched) self.assertTrue('freitag.membership.passwordresetter' in types_not_searched) self.assertTrue('freitag.membership.registrator' in types_not_searched) ``profiles/default/propertiestool.xml`` .. code-block:: python Portal Actions .. code-block:: python def test_actions(self): user_actions = self.portal.portal_actions.user self.assertTrue("preferences" in user_actions.objectIds()) self.assertTrue('@@my-profile' in user_actions.preferences.url_expr) self.assertEquals(user_actions.preferences.visible, True) ``profiles/default/actions.xml`` .. code-block:: python Preferences string:${globals_view/navigationRootUrl}/@@my-profile python:member is not None True enable user folder .. code-block:: python self.mtool = self.portal.portal_membership self.assertEquals(self.mtool.memberareaCreationFlag, 1) self.assertEquals(self.mtool.memberarea_type, 'freitag.membership.member') self.assertEquals(self.mtool.getMembersFolder().absolute_url(), 'http://nohost/plone/autoren') ``setuphandlers.py`` .. code-block:: python membership_tool.membersfolder_id = MEMBERS_FOLDER_ID logger.info("Members folder set up: %s\n" % MEMBERS_FOLDER_ID) # Configure member areas membership_tool.setMemberAreaType(MEMBER_AREA_TYPE) logger.info("Member area type: %s\n" % MEMBER_AREA_TYPE) membership_tool.setMemberareaCreationFlag() logger.info("Member area creation active\n") Workflow -------- .. code-block:: python def test_workflows_installed(self): """Make sure both comment workflows have been installed properly. """ self.assertTrue('one_state_workflow' in self.portal.portal_workflow.objectIds()) self.assertTrue('comment_review_workflow' in self.portal.portal_workflow.objectIds()) def test_default_workflow(self): """Make sure one_state_workflow is the default workflow. """ self.assertEqual(('one_state_workflow',), self.portal.portal_workflow.getChainForPortalType( 'Discussion Item')) Users and Groups .. code-block:: python def test_users_installed(self): pas = getToolByName(self.portal, 'acl_users') user_ids = [x['login'] for x in pas.searchUsers()] self.assertTrue('zell' in user_ids) ``setuphandlers.py`` .. code-block:: python def setupGroups(portal): acl_users = getToolByName(portal, 'acl_users') if not acl_users.searchGroups(name='Editorial'): gtool = getToolByName(portal, 'portal_groups') gtool.addGroup('Editorial', roles=[]) Test .. code-block:: python def test_editorial_group_installed(self): self.assertTrue( 'Editorial' in self.utool.source_groups.getGroupNames()) Roles .. code-block:: xml ``test_setup.py`` .. code-block:: python def test_freitag_site_administrator_role_installed(self): self.assertTrue( "Freitag Site Administrator" in self.portal.valid_roles()) Mock Mailhost .. code-block:: python from zope.component import getSiteManager from Products.MailHost.interfaces import IMailHost from Products.CMFPlone.tests.utils import MockMailHost class EasyNewsletterTests(unittest.TestCase): layer = EASYNEWSLETTER_INTEGRATION_TESTING def setUp(self): # Set up a mock mailhost self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost('MailHost') sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # We need to fake a valid mail setup self.portal.email_from_address = "portal@plone.test" self.mailhost = self.portal.MailHost def test_send_email(self): self.assertEqual(len(self.mailhost.messages), 1) self.assertTrue(self.mailhost.messages[0]) msg = str(self.mailhost.messages[0]) self.assertTrue('To: john@plone.test' in msg) self.assertTrue('From: portal@plone.test' in msg)