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
===============================

Define some general objects:

    >>> qi = self.portal.portal_quickinstaller
    >>> object_tabs = self.portal.portal_actions.object
    >>> ps = self.portal.portal_setup

Test is 'SEO Properties' action present for a Page before
seoptimizer installed

    >>> browser.open('http://nohost/plone/front-page')
    >>> "SEO Properties" in browser.contents
    False

Now install the product for following testing, and add

    >>> qi.installProduct(PROJECT_NAME)
    'Ran all install steps.'
    >>> sp = self.portal.portal_properties.seo_properties

And check is SEOProperties added to object tabs
 
   >>> object_tabs.get('SEOProperties', None) is not None
    True

Test visibility 'SEO Properties' action after installation

    >>> 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

    >>> 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
    >>> ps.setLastVersionForProfile('quintagroup.seoptimizer:default', '2.0.0')
    >>> qi.reinstallProducts((PROJECT_NAME,))
    >>> self.portal.portal_actions.object.get('SEOProperties', None) is not None
    True

Test visibility 'SEO Properties' action after reinstallation

    >>> 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

    >>> sp.content_types_with_seoproperties = ('File',)
    >>> browser.open('http://nohost/plone/front-page')
    >>> "SEO Properties" in browser.contents
    False

Test uninstallation 'SEO Properties' action

    >>> sp.content_types_with_seoproperties = ('Document',)
    >>> browser.open('http://nohost/plone/front-page')
    >>> "SEO Properties" in browser.contents
    True
    >>> qi.uninstallProducts((PROJECT_NAME,))
    >>> object_tabs.get('SEOProperties', None) is not None
    False

Test visibility 'SEO Properties' action after uninstallation

    >>> sp.content_types_with_seoproperties = ('Document',)
    >>> browser.open('http://nohost/plone/front-page')
    >>> "SEO Properties" in browser.contents
    False
