Introduction ============ This is a full-blown functional test. The emphasis here is on testing what the user may input and see, and the system is largely tested as a black box. We use PloneTestCase to set up this test as well, so we have a full Plone site to play with. We *can* inspect the state of the portal, e.g. using self.portal and self.folder, but it is often frowned upon since you are not treating the system as a black box. Also, if you, for example, log in or set roles using calls like self.setRoles(), these are not reflected in the test browser, which runs as a separate session. Being a doctest, we can tell a story here. First, we must perform some setup. We use the testbrowser that is shipped with Five, as this provides proper Zope 2 integration. Most of the documentation, though, is in the underlying zope.testbrower package. >>> from Products.Five.testbrowser import Browser >>> browser = Browser() >>> portal_url = self.portal.absolute_url() The following is useful when writing and debugging testbrowser tests. It lets us see all error messages in the error_log. >>> self.portal.error_log._ignored_exceptions = () With that in place, we can go to the portal front page and log in. We will do this using the default user from PloneTestCase: >>> from Products.PloneTestCase.setup import portal_owner, default_password >>> browser.open(portal_url) We have the login portlet, so let's use that. >>> browser.open('http://nohost/plone/login_form') >>> browser.getLink('Log in').click() >>> browser.url 'http://nohost/plone/login_form' >>> browser.getControl('Login Name').value = portal_owner >>> browser.getControl('Password').value = default_password >>> browser.getControl('Log in').click() >>> "You are now logged in" in browser.contents True >>> "Login failed" in browser.contents False >>> browser.url 'http://nohost/plone/login_form' -*- extra stuff goes here -*- Test 'SEO Properties' action =============================== >>> self.qi = self.portal.portal_quickinstaller >>> self.sp = self.portal.portal_properties.seo_properties >>> self.object_tabs = self.portal.portal_actions.object >>> self.ps = self.portal.portal_setup First uninstall product, if it is already installed: >>> from quintagroup.seoptimizer.config import PROJECT_NAME >>> if self.qi.isProductInstalled(PROJECT_NAME): ... self.qi.uninstallProducts([PROJECT_NAME,]) Test installation 'SEO Properties' action >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents False >>> self.qi.installProduct(PROJECT_NAME) 'Ran all install steps.' >>> self.portal.portal_actions.object.get('SEOProperties', None) is not None True Test visibility 'SEO Properties' action after installation >>> self.sp.content_types_with_seoproperties = ('Document',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents True >>> browser.getLink('SEO Properties').url 'http://nohost/plone/front-page/@@seo-context-properties' Test invisibility 'SEO Properties' action after installation >>> self.sp.content_types_with_seoproperties = ('File',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents False Test reinstallation 'SEO Properties' action For perform all upgrade steps on re-installation, earlier version of profile must be set. >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents False >>> self.ps.setLastVersionForProfile('quintagroup.seoptimizer:default', '2.0.0') >>> self.qi.reinstallProducts((PROJECT_NAME,)) >>> self.portal.portal_actions.object.get('SEOProperties', None) is not None True Test visibility 'SEO Properties' action after reinstallation >>> self.sp.content_types_with_seoproperties = ('Document',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents True >>> browser.getLink('SEO Properties').url 'http://nohost/plone/front-page/@@seo-context-properties' Test invisibility 'SEO Properties' action after reinstallation >>> self.sp.content_types_with_seoproperties = ('File',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents False Test uninstallation 'SEO Properties' action >>> self.sp.content_types_with_seoproperties = ('Document',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents True >>> self.qi.uninstallProducts((PROJECT_NAME,)) >>> self.portal.portal_actions.object.get('SEOProperties', None) is not None False Test visibility 'SEO Properties' action after uninstallation >>> self.sp.content_types_with_seoproperties = ('Document',) >>> browser.open('http://nohost/plone/front-page') >>> "SEO Properties" in browser.contents False