示例#1
0
 def setUp(self):
     activateAndReindex(self.layer["portal"])
     commit()
     self.browser = Browser(self.layer["app"])
     self.browser.addHeader(
         "Authorization",
         "Basic %s:%s" % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD))
    def setUp(self):
        self.app = self.layer['app']
        self.request = self.layer['request']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        # we have to create a user on the zope root. this just does not work
        # with plone.app.testing and TEST_USER or SITE_OWNER
        self.app.acl_users.userFolderAddUser('app', 'secret', ['Manager'], [])
        from plone.testing import z2
        z2.login(self.app['acl_users'], 'app')

        import transaction
        transaction.commit()
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % ('app', 'secret')
        )

        self.site_administrator_browser = Browser(self.app)
        self.site_administrator_browser.handleErrors = False
        self.site_administrator_browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD,)
        )
示例#3
0
 def setUp(self):
     app = self.layer['app']
     self.portal = self.layer['portal']
     self.request = self.layer['request']
     self.portal_url = self.portal.absolute_url()
     setRoles(self.portal, TEST_USER_ID, ['Contributor'])
     fti = DexterityFTI('tocdocument')
     self.portal.portal_types._setObject('tocdocument', fti)
     fti.klass = 'plone.dexterity.content.Item'
     fti.behaviors = ('plone.app.contenttypes.behaviors.tableofcontents.'
                      'ITableOfContents', )
     self.fti = fti
     alsoProvides(self.portal.REQUEST, IPloneAppContenttypesLayer)
     alsoProvides(self.request, IPloneAppContenttypesLayer)
     from plone.app.contenttypes.behaviors.tableofcontents \
         import ITableOfContents
     alsoProvides(self.request, ITableOfContents)
     self.portal.invokeFactory('tocdocument',
                               id='tocdoc',
                               title=u'Document with a table of contents')
     import transaction
     transaction.commit()
     # Set up browser
     self.browser = Browser(app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', 'Basic {0}:{1}'.format(
             SITE_OWNER_NAME,
             SITE_OWNER_PASSWORD,
         ))
示例#4
0
 def setUp(self):
     app = self.layer['app']
     self.portal = self.layer['portal']
     self.request = self.layer['request']
     self.portal_url = self.portal.absolute_url()
     setRoles(self.portal, TEST_USER_ID, ['Contributor'])
     fti = DexterityFTI('leadimagefolder')
     self.portal.portal_types._setObject('leadimagefolder', fti)
     fti.klass = 'plone.dexterity.content.Container'
     fti.behaviors = (
         'plone.app.contenttypes.behaviors.leadimage.ILeadImageBehavior', )
     self.fti = fti
     alsoProvides(self.portal.REQUEST, IPloneAppContenttypesLayer)
     alsoProvides(self.request, IPloneAppContenttypesLayer)
     from plone.app.contenttypes.behaviors.leadimage import ILeadImage
     alsoProvides(self.request, ILeadImage)
     self.portal.invokeFactory('leadimagefolder',
                               id='leadimagefolder',
                               title=u'Folder with a lead image')
     import transaction
     transaction.commit()
     # Set up browser
     self.browser = Browser(app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', 'Basic {0}:{1}'.format(
             SITE_OWNER_NAME,
             SITE_OWNER_PASSWORD,
         ))
示例#5
0
 def test_okay_browser(self):
     browser = Browser(self.app)
     app_url = self.app.absolute_url()
     portal_url = self.portal.absolute_url()
     # Try a couple of urls that should return the same.
     urls = (
         app_url + '/@@ok',
         app_url + '/ok?hello=1',
         portal_url + '/@@ok',
         portal_url + '/ok?hello=1',
     )
     for url in urls:
         browser.open(url)
         self.assertEqual(browser.contents, 'OK')
         get_header = browser.headers.get
         self.assertEqual(get_header('Expires'),
                          'Sat, 1 Jan 2000 00:00:00 GMT')
         self.assertEqual(get_header('Cache-Control'),
                          'max-age=0, must-revalidate, private')
         # Getting it with a browser gives some more headings than accessing
         # the view directly.
         self.assertEqual(get_header('content-length'), '2')
         # content-type has a charset, but we don't really care about that.
         self.assertTrue(
             get_header('content-type').startswith('text/plain'))
    def setUp(self):
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        # disable diazo theming
        self.portal.portal_registry[
            'plone.app.theming.interfaces.IThemeSettings.enabled'] = False

        # disable auto-CSRF
        from plone.protect import auto
        auto.CSRF_DISABLED = True

        _createObjectByType('Folder', self.portal, 'folder')
        _createObjectByType('Document', self.portal, 'document')
        _createObjectByType('File', self.portal, 'file')
        self.portal.file.file = NamedBlobFile('foo', 'text/plain', u'foo.txt')
        transaction.commit()

        self.putils = getToolByName(self.portal, "plone_utils")
        self.browser = Browser(self.layer['app'])
        self.browser.addHeader(
            'Authorization', 'Basic %s:%s' % (
                TEST_USER_NAME,
                TEST_USER_PASSWORD,
            ))
示例#7
0
    def prepare_for_acquisition_tests(self):
        """create content and an alternate authenticated browser session

        creates the following content structure:

        |-- f1
        |   |-- test
        |-- test
        """
        # create a page at the root and one nested with the same id.
        p1 = self.portal.invokeFactory(type_name='Document',
                                       id='test',
                                       title='Test Page at Root')
        folder_1 = self.portal['f1']
        p2 = folder_1.invokeFactory(type_name='Document',
                                    id='test',
                                    title='Test Page in Folder')
        contained_test_page = folder_1[p2]

        transaction.commit()

        # create an alternate browser also logged in with manager
        browser_2 = Browser(self.layer['app'])
        browser_2.handleErrors = False
        browser_2.addHeader('Authorization',
                            'Basic {}:{}'.format(TEST_USER_NAME, 'secret'))

        # return the id of the root page, the nested page itself, and the
        # alternate browser
        return p1, contained_test_page, browser_2
 def setUp(self):
     self.portal = self.layer['portal']
     self.app = self.layer['app']
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}')
示例#9
0
    def setUp(self):
        if not TEST_MIGRATION:
            raise unittest.SkipTest('Migration tests require ATContentTypes')

        app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.request['ACTUAL_URL'] = self.portal.absolute_url()
        self.request['URL'] = self.portal.absolute_url()
        self.catalog = getToolByName(self.portal, 'portal_catalog')
        self.portal.acl_users.userFolderAddUser('admin',
                                                'secret',
                                                ['Manager'],
                                                [])
        login(self.portal, 'admin')
        self.portal.portal_workflow.setDefaultChain(
            'simple_publication_workflow')
        self.portal_url = self.portal.absolute_url()

        self.browser = Browser(app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic {0}:{1}'.format(SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
示例#10
0
    def testDoubleKeys(self):
        from zExceptions import NotFound

        browser = Browser(self.layer["app"])
        browser.handleErrors = False
        url = "%s/reset-password/one/two" % self.layer["portal"].absolute_url()
        self.assertRaises(NotFound, browser.open, url)
示例#11
0
 def getBrowser(self, loggedIn=True):
     transaction.commit()
     browser = Browser(self.app)
     if loggedIn:
         user = TEST_USER_NAME
         pwd = default_password
         browser.addHeader('Authorization', 'Basic %s:%s' % (user, pwd))
     return browser
示例#12
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.uf = self.portal.acl_users
     self.uf.userFolderAddUser('reviewer', 'secret', ['Reviewer'], [])
     transaction.commit()
     self.browser = Browser(self.layer['app'])
     self.browser.handleErrors = True
     self.wftool = getToolByName(self.portal, 'portal_workflow')
示例#13
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.folder = self.portal['test-folder']
     self.browser = Browser(self.layer['app'])
     self.auth_info = f'{TEST_USER_NAME}:{TEST_USER_PASSWORD}'
     self.cookie = encodebytes(self.auth_info.encode('utf8'))[:-1]
     self.folder.manage_permission('View', ['Manager'], acquire=0)
     logout()
示例#14
0
 def get_browser(self):
     browser = Browser(self.layer["app"])
     browser.handleErrors = False
     browser.addHeader(
         "Authorization",
         f"Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}",
     )
     return browser
示例#15
0
 def setUp(self):
     super().setUp()
     self.browser = Browser(self.layer['app'])
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
     )
示例#16
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.folder = self.portal['test-folder']
     self.browser = Browser(self.layer['app'])
     self.auth_info = '%s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD)
     self.cookie = base64.encodestring(self.auth_info.encode('utf8'))[:-1]
     self.folder.manage_permission('View', ['Manager'], acquire=0)
     logout()
 def setUp(self):
     self.app = self.layer["app"]
     self.portal = self.layer["portal"]
     self.portal_url = self.portal.absolute_url()
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         "Authorization",
         "Basic " + SITE_OWNER_NAME + ":" + SITE_OWNER_PASSWORD)
示例#18
0
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     self.types_url = "%s/@@content-controlpanel" % self.portal_url
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}')
示例#19
0
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
     )
示例#20
0
def get_browser(layer, auth=True):
    browser = Browser(layer["app"])
    browser.handleErrors = False
    if auth:
        api.user.create(
            username="******", password="******", email="*****@*****.**", roles=("Manager",)
        )
        transaction.commit()
        browser.addHeader("Authorization", "Basic adm:secret")
    return browser
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     registry = getUtility(IRegistry)
     self.settings = registry.forInterface(ISecuritySchema, prefix="plone")
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}')
示例#22
0
 def setUp(self):
     super(FunctionalTestCase, self).setUp()
     self.browser = Browser(self.layer['app'])
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', 'Basic %s:%s' % (
             SITE_OWNER_NAME,
             SITE_OWNER_PASSWORD,
         ))
     transaction.commit()
示例#23
0
class ConflictTests(TestCase):

    layer = LEGACY_COLLECTIVE_SOLR_FUNCTIONAL_TESTING

    def setUp(self):
        activateAndReindex(self.layer["portal"])
        commit()
        self.browser = Browser(self.layer["app"])
        self.browser.addHeader(
            "Authorization",
            "Basic %s:%s" % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD))

    def test_retry_on_conflict(self):
        """This tests transaction handling when indexing in Solr, or more
        specifically properly aborting a transaction.  To do this we'll try to
        create some content and fake a `ConflictError` shortly before the
        transaction completes.  The publisher will catch it and retry, but
        while doing so the object will get a different UID than the first time.
        Without being able to abort the transaction Solr would receive two sets
        of data and consequently return two results when searching for this
        particular piece of content later on.
        """
        self.browser.open(self.layer["portal"].absolute_url())
        self.browser.getLink("Page").click()
        self.browser.getControl("Title", index=0).value = "Foo"
        component.provideHandler(raise_on_first_add,
                                 (Interface, IObjectCreatedEvent))
        self.browser.getControl("Save").click()
        self.assertEqual(len(UIDS), 2)
        self.assertEqual(len(solrSearchResults(SearchableText="Foo")), 1)

        sm = component.getSiteManager()
        sm.unregisterHandler(raise_on_first_add,
                             (Interface, IObjectCreatedEvent))
    def setUp(self):
        app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.portal_url = self.portal.absolute_url()

        self.browser = Browser(app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization', f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}')
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
 def setUp(self):
     app = self.layer["app"]
     self.portal = self.layer["portal"]
     self.request = self.layer["request"]
     self.portal_url = self.portal.absolute_url()
     self.browser = Browser(app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         "Authorization",
         f"Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}",
     )
示例#26
0
    def setUp(self):
        self.portal = self.layer['portal']
        self.portal.acl_users.userFolderAddUser('editor', 'secret', ['Editor'],
                                                [])

        self._create_structure()
        transaction.commit()

        self.browser = Browser(self.layer['app'])
        self.browser.addHeader('Authorization',
                               'Basic {}:{}'.format('editor', 'secret'))
示例#27
0
 def setUp(self):
     app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     self.browser = Browser(app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', 'Basic {0}:{1}'.format(
             SITE_OWNER_NAME,
             SITE_OWNER_PASSWORD,
         ))
示例#28
0
class FunctionalTestCase(IntegrationTestCase):
    layer = testing.FUNCTIONAL

    def setUp(self):
        super().setUp()
        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
 def setUp(self):
     app = self.layer['app']
     self.portal = self.layer['portal']
     self.request = self.layer['request']
     self.portal_url = self.portal.absolute_url()
     self.icons = self.portal.restrictedTraverse("@@iconresolver")
     self.browser = Browser(app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', 'Basic {0}:{1}'.format(
             SITE_OWNER_NAME,
             SITE_OWNER_PASSWORD,
         ))
示例#30
0
class TestRoot(unittest.TestCase, _BaseAutoTest):

    def setUp(self):
        self.portal = self.layer['portal']
        self.browser = Browser(self.layer['app'])
        self.request = self.layer['request']
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def open(self, path):
        self.browser.open(self.portal.aq_parent.absolute_url() + '/' + path)
示例#31
0
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.request = self.layer['request']
     self.portal_url = self.portal.absolute_url()
     registry = getUtility(IRegistry)
     self.settings = registry.forInterface(IFilterSchema, prefix="plone")
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization', f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}')
     self.safe_html = getattr(
         getToolByName(self.portal, 'portal_transforms'), 'safe_html', None)
示例#32
0
class TestCSRF(unittest.TestCase):
    layer = PROTECT_FUNCTIONAL_TESTING

    def setUp(self):
        self.portal = self.layer['portal']
        self.browser = Browser(self.layer['app'])
        self.request = self.layer['request']
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_change_password_on_root_does_not_throw_other_csrf_protection(
            self
    ):
        self.browser.open(
            '%s/acl_users/users/manage_users?user_id=%s&passwd=1' % (
                self.layer['app'].absolute_url(), SITE_OWNER_NAME
            )
        )
        self.browser.getControl(name='password').value = SITE_OWNER_PASSWORD
        self.browser.getControl(name='confirm').value = SITE_OWNER_PASSWORD
        self.browser.getForm(action='manage_updateUserPassword').submit()
        self.assertEquals(
            self.browser.url,
            '%s/acl_users/users/manage_users?'
            'manage_tabs_message=password+updated' % (
                self.layer['app'].absolute_url()
            )
        )
示例#33
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.browser = Browser(self.layer['app'])
     self.request = self.layer['request']
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
     )
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
     )
示例#35
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.browser = Browser(self.layer['app'])
     self.request = self.layer['request']
     login(self.portal, TEST_USER_NAME)
     self.browser.open(self.portal.absolute_url() + '/login_form')
     self.browser.getControl(name='__ac_name').value = TEST_USER_NAME
     self.browser.getControl(
         name='__ac_password'
     ).value = TEST_USER_PASSWORD
     self.browser.getControl('Log in').click()
示例#36
0
class AutoRotateTests(unittest.TestCase):
    layer = PROTECT_FUNCTIONAL_TESTING

    def setUp(self):
        self.portal = self.layer['portal']
        self.browser = Browser(self.layer['app'])
        self.request = self.layer['request']

    def test_keyrings_get_rotated_on_login(self):
        manager = getUtility(IKeyManager)
        ring = manager['_forms']
        keys = ring.data
        ring.last_rotation = 0
        transaction.commit()

        # should be rotated on login
        login(self.portal, TEST_USER_NAME)
        self.browser.open(self.portal.absolute_url() + '/login_form')
        self.browser.getControl(name='__ac_name').value = TEST_USER_NAME
        self.browser.getControl(
            name='__ac_password').value = TEST_USER_PASSWORD
        self.browser.getControl('Log in').click()

        self.assertNotEqual(keys, ring.data)
        self.assertNotEqual(ring.last_rotation, 0)
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.portal_url = self.portal.absolute_url()
     registry = getUtility(IRegistry)
     self.settings = registry.forInterface(
         ISecuritySchema, prefix="plone")
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
     )
    def setUp(self):
        if six.PY2:
            raise unittest.SkipTest('Disabled in py2 for now.')
        data = getFile('image.png')
        item = DummyContent()
        item.image = NamedImage(data, 'image/png', u'image.png')
        self.layer['app']._setOb('item', item)
        self.item = self.layer['app'].item
        self.view = self.item.unrestrictedTraverse('@@images')
        self._orig_sizes = ImageScaling._sizes

        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
        self.browser.addHeader('Referer', self.layer['app'].absolute_url())
示例#39
0
class AutoCSRFProtectTests(unittest.TestCase, _BaseAutoTest):

    def setUp(self):
        self.portal = self.layer['portal']
        self.browser = Browser(self.layer['app'])
        self.request = self.layer['request']
        login(self.portal, TEST_USER_NAME)
        self.browser.open(self.portal.absolute_url() + '/login_form')
        self.browser.getControl(name='__ac_name').value = TEST_USER_NAME
        self.browser.getControl(
            name='__ac_password'
        ).value = TEST_USER_PASSWORD
        self.browser.getControl('Log in').click()

    def open(self, path):
        self.browser.open(self.portal.absolute_url() + '/' + path)

    def test_CSRF_header(self):
        self.request.environ['HTTP_X_CSRF_TOKEN'] = createToken()
        view = AuthenticatorView(None, self.request)
        self.assertEqual(view.verify(), True)

    def test_incorrect_CSRF_header(self):
        self.request.environ['HTTP_X_CSRF_TOKEN'] = 'foobar'
        view = AuthenticatorView(None, self.request)
        self.assertEqual(view.verify(), False)

    def test_only_add_auth_when_user_logged_in(self):
        logout()
        self.open('logout')
        self.open('test-unprotected')
        try:
            self.browser.getForm('one').getControl(name="_authenticator")
            self.assertEqual('anonymous should not be protected', '')
        except LookupError:
            pass
    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.usergroups_url = "%s/@@usergroup-userprefs" % self.portal_url
        self.groups_url = "%s/@@usergroup-groupprefs" % self.portal_url
        self._generateGroups()
        self._generateUsers()
        transaction.commit()

        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
 def setUp(self):
     self.app = self.layer['app']
     self.portal = self.layer['portal']
     self.request = self.layer['request']
     self.portal_url = self.portal.absolute_url()
     registry = getUtility(IRegistry)
     self.settings = registry.forInterface(
         IFilterSchema, prefix="plone")
     self.browser = Browser(self.app)
     self.browser.handleErrors = False
     self.browser.addHeader(
         'Authorization',
         'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
     )
     self.safe_html = getattr(
         getToolByName(self.portal, 'portal_transforms'),
         'safe_html',
         None)
    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.portal_url = self.portal.absolute_url()
        self.usergroups_url = "%s/@@usergroup-userprefs" % self.portal_url
        self.groups_url = "%s/@@usergroup-groupprefs" % self.portal_url
        self._generateUsers()
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        transaction.commit()

        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (TEST_USER_ID, TEST_USER_PASSWORD,)
        )
        self.normal_user = '******'
    def testHeadRequestMethod(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # make sure the referenced image scale is available
        url = str(scale.url)
        self.browser.open(url)
        GET_length = len(self.browser.contents)

        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
        self.browser.addHeader('Referer', self.layer['app'].absolute_url())

        def make_head_request(args):
            return self.browser.testapp.head(url, **args)

        self.browser._processRequest(url, make_head_request)

        self.assertEqual('image/png', self.browser.headers['content-type'])
        self.assertEqual(
            self.browser.headers['Content-Length'],
            str(GET_length)
        )
        self.assertEqual(self.browser.contents, b'')
class EditingControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the editing control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.request = self.layer['request']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()

        registry = getUtility(IRegistry)
        self.settings = registry.forInterface(IEditingSchema, prefix='plone')

        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_editing_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Editing').click()

    def test_editing_control_panel_backlink(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.assertTrue("Content" in self.browser.contents)

    def test_editing_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    @unittest.skip("TODO: Not implemented yet.")
    def test_visible_ids_active(self):
        pass

    def test_default_editor(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getControl("Default editor").value = ["None"]
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.default_editor, "None")

    @unittest.skip("TODO: Not implemented yet.")
    def test_default_editor_active(self):
        pass

    def test_available_editors_hidden(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.assertTrue('Available editors' not in self.browser.contents)

    def test_ext_editor(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getControl("Enable External Editor feature")\
            .selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.ext_editor, True)

    @unittest.skip("TODO: Not implemented yet.")
    def test_ext_editor_active(self):
        pass

    def test_enable_link_integrity_checks(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getControl("Enable link integrity checks")\
            .selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.enable_link_integrity_checks, True)

    def test_enable_link_integrity_checks_active(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getControl("Enable link integrity checks")\
            .selected = True
        self.browser.getControl('Save').click()
        self.assertTrue(linkintegrity_enabled())

    def test_lock_on_ttw_edit(self):
        self.browser.open(
            "%s/@@editing-controlpanel" % self.portal_url)
        self.browser.getControl("Enable locking for through-the-web edits")\
            .selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.lock_on_ttw_edit, True)

    @unittest.skip("TODO: Not implemented yet.")
    def test_lock_on_ttw_edit_active(self):
        pass
class NavigationControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the navigation control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_navigation_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Navigation').click()
        self.assertTrue("Navigation Settings" in self.browser.contents)

    def test_navigation_control_panel_backlink(self):
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)
        self.assertTrue("General" in self.browser.contents)

    def test_navigation_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_navigation_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="navigation-controlpanel")
        self.assertTrue(view())

    def test_generate_tabs(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(INavigationSchema, prefix='plone')
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)
        self.assertEqual(settings.generate_tabs, True)
        self.assertEqual(
            self.browser.getControl('Automatically generate tabs').selected,
            True
        )
        self.browser.getControl('Automatically generate tabs').selected = False
        self.browser.getControl('Save').click()

        self.assertEqual(settings.generate_tabs, False)

    def test_nonfolderish_tabs(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(INavigationSchema, prefix='plone')
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)
        self.assertEqual(settings.generate_tabs, True)
        self.assertEqual(
            self.browser.getControl('Automatically generate tabs').selected,
            True
        )
        self.browser.getControl(
            'Generate tabs for items other than folders').selected = False
        self.browser.getControl('Save').click()

        self.assertEqual(settings.nonfolderish_tabs, False)

    def test_displayed_types(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(INavigationSchema, prefix='plone')
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)
        self.browser.getControl('Collection', index=0).selected = True
        self.browser.getControl('Comment').selected = True
        self.browser.getControl('Event').selected = True
        self.browser.getControl('File').selected = True
        self.browser.getControl('Folder').selected = True
        self.browser.getControl('Image').selected = True
        self.browser.getControl('Link').selected = True
        self.browser.getControl('News Item').selected = True
        self.browser.getControl('Page').selected = True
        self.browser.getControl('Save').click()

        self.assertTrue('Collection' in settings.displayed_types)
        self.assertTrue('Discussion Item' in settings.displayed_types)
        self.assertTrue('Event' in settings.displayed_types)
        self.assertTrue('File' in settings.displayed_types)
        self.assertTrue('Folder' in settings.displayed_types)
        self.assertTrue('Image' in settings.displayed_types)
        self.assertTrue('Link' in settings.displayed_types)
        self.assertTrue('News Item' in settings.displayed_types)
        self.assertTrue('Document' in settings.displayed_types)

    def test_workflow_settings(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(INavigationSchema, prefix='plone')
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)

        self.browser.getControl('Filter on workflow state').selected = True
        self.browser.getControl('Externally visible [external]').selected = True  # noqa
        self.browser.getControl('Internal draft [internal]').selected = True
        self.browser.getControl('Internally published [internally_published]').selected = True  # noqa
        self.browser.getControl('Pending [pending]').selected = True
        self.browser.getControl('Private [private]').selected = True
        self.browser.getControl('Public draft [visible]').selected = True
        self.browser.getControl('Published [published]').selected = True
        self.browser.getControl("Save").click()

        self.assertTrue(self.browser.url.endswith('navigation-controlpanel'))
        self.assertTrue('Changes saved.' in self.browser.contents)

        self.assertTrue(settings.filter_on_workflow)

        self.assertTrue('external' in settings.workflow_states_to_show)
        self.assertTrue('internal' in settings.workflow_states_to_show)
        self.assertTrue('internally_published' in settings.workflow_states_to_show)  # noqa
        self.assertTrue('pending' in settings.workflow_states_to_show)
        self.assertTrue('private' in settings.workflow_states_to_show)
        self.assertTrue('visible' in settings.workflow_states_to_show)
        self.assertTrue('published' in settings.workflow_states_to_show)

    def test_show_excluded_items(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(INavigationSchema, prefix='plone')
        self.browser.open(
            "%s/@@navigation-controlpanel" % self.portal_url)

        self.browser.getControl(
            'Show items normally excluded from navigation if viewing their children.').selected = False  # noqa
        self.browser.getControl("Save").click()

        self.assertFalse(settings.show_excluded_items)
class TypesControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the types control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.types_url = "%s/@@content-controlpanel" % self.portal_url
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_types_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Editing').click()

    def test_standard_type_select(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.assertIn('content-controlpanel', self.browser.url)

    def test_standard_type_cancel(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getControl('Cancel').click()
        self.assertIn('@@overview-controlpanel', self.browser.url)

    def test_standard_type_allow_commenting(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.browser.getControl('Allow comments').selected = True
        self.browser.getControl('Save').click()

        # Check if settings got saved correctly
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.assertIn('Globally addable', self.browser.contents)
        self.assertIn('Allow comments', self.browser.contents)
        self.assertEqual(
            self.browser.getControl('Allow comments').selected,
            True
        )
        self.assertIn('Visible in searches', self.browser.contents)
        self.assertIn(
            '<input id="redirect_links" type="checkbox" class="noborder"'
            ' name="redirect_links:boolean" checked="checked" />',
            self.browser.contents)
        self.assertIn(
            '<label for="redirect_links">Redirect immediately to link target',
            self.browser.contents
        )

    def test_standard_types_redirect_links(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.browser.getControl(
            'Redirect immediately to link target'
        ).selected = True
        self.browser.getControl('Save').click()

        # Check if settings got saved correctly
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.assertTrue(
            'Redirect immediately to link target' in self.browser.contents
        )
        self.assertEqual(
            self.browser.getControl(
                'Redirect immediately to link target').selected,
            True
        )

    def test_set_no_default_workflow(self):
        # references http://dev.plone.org/plone/ticket/11901
        self.browser.open(self.types_url)
        self.browser.getControl(name="new_workflow").value = ['[none]']
        self.browser.getControl(name="form.button.Save").click()

        # Check that setting No workflow as default workflow doesn't break
        # break editing types
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Link']
        self.browser.getForm(action=self.types_url).submit()
        self.assertIn('Globally addable', self.browser.contents)
        self.assertIn('Allow comments', self.browser.contents)
        self.assertIn('Visible in searches', self.browser.contents)

    def test_disable_versioning_removes_behavior(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Document']
        self.browser.getForm(action=self.types_url).submit()
        self.browser.getControl(name='versionpolicy').value = ['off']
        self.browser.getForm(action=self.types_url).submit()

        portal_types = self.portal.portal_types
        doc_type = portal_types.Document
        self.assertTrue(
            'plone.app.versioningbehavior.behaviors.IVersionable'
            not in doc_type.behaviors)  # noqa

    def test_enable_versioning_behavior_on_document(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['Document']
        self.browser.getForm(action=self.types_url).submit()
        self.browser.getControl(name='versionpolicy').value = ['off']
        self.browser.getForm(action=self.types_url).submit()

        portal_types = self.portal.portal_types
        doc_type = portal_types.Document
        self.assertTrue(
            'plone.app.versioningbehavior.behaviors.IVersionable'
            not in doc_type.behaviors)  # noqa

        self.browser.getControl(name='versionpolicy').value = ['manual']
        self.browser.getForm(action=self.types_url).submit()

        self.assertTrue(
            'plone.app.versioningbehavior.behaviors.IVersionable'
            in doc_type.behaviors)

    def test_enable_versioning_behavior_on_file(self):
        self.browser.open(self.types_url)
        self.browser.getControl(name='type_id').value = ['File']
        self.browser.getForm(action=self.types_url).submit()
        self.browser.getControl(name='versionpolicy').value = ['off']
        self.browser.getForm(action=self.types_url).submit()

        portal_types = self.portal.portal_types
        file_type = portal_types.File

        # File has no Versioning and no Locking on default, but needs it
        self.assertTrue(
            'plone.app.versioningbehavior.behaviors.IVersionable'
            not in file_type.behaviors)  # noqa
        self.assertTrue(
            'plone.app.lockingbehavior.behaviors.ILocking'
            not in file_type.behaviors)  # noqa

        self.browser.getControl(name='versionpolicy').value = ['manual']
        self.browser.getForm(action=self.types_url).submit()

        self.assertTrue(
            'plone.app.versioningbehavior.behaviors.IVersionable'
            in file_type.behaviors)
        self.assertTrue(
            'plone.app.lockingbehavior.behaviors.ILocking'
            in file_type.behaviors)
示例#47
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.browser = Browser(self.layer['app'])
     self.request = self.layer['request']
class ImagePublisherTests(unittest.TestCase):

    layer = PLONE_NAMEDFILE_FUNCTIONAL_TESTING

    def setUp(self):
        if six.PY2:
            raise unittest.SkipTest('Disabled in py2 for now.')
        data = getFile('image.png')
        item = DummyContent()
        item.image = NamedImage(data, 'image/png', u'image.png')
        self.layer['app']._setOb('item', item)
        self.item = self.layer['app'].item
        self.view = self.item.unrestrictedTraverse('@@images')
        self._orig_sizes = ImageScaling._sizes

        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
        self.browser.addHeader('Referer', self.layer['app'].absolute_url())

    def tearDown(self):
        ImageScaling._sizes = self._orig_sizes

    def testPublishScaleViaUID(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # make sure the referenced image scale is available
        self.browser.open(scale.url)
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (64, 64))

    def testPublishWebDavScaleViaUID(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # make sure the referenced image scale is available
        self.browser.open(scale.url + '/manage_DAVget')
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (64, 64))

    def testPublishFTPScaleViaUID(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # make sure the referenced image scale is available
        self.browser.open(scale.url + '/manage_FTPget')
        self.assertIn('200', self.browser.headers['status'])
        # Same remark as in testPublishWebDavScaleViaUID is valid here.
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (64, 64))

    def testHeadRequestMethod(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # make sure the referenced image scale is available
        url = str(scale.url)
        self.browser.open(url)
        GET_length = len(self.browser.contents)

        self.browser = Browser(self.layer['app'])
        self.browser.handleErrors = False
        self.browser.addHeader('Referer', self.layer['app'].absolute_url())

        def make_head_request(args):
            return self.browser.testapp.head(url, **args)

        self.browser._processRequest(url, make_head_request)

        self.assertEqual('image/png', self.browser.headers['content-type'])
        self.assertEqual(
            self.browser.headers['Content-Length'],
            str(GET_length)
        )
        self.assertEqual(self.browser.contents, b'')

    def testPublishThumbViaUID(self):
        ImageScaling._sizes = {'thumb': (128, 128)}
        scale = self.view.scale('image', 'thumb')
        transaction.commit()
        # make sure the referenced image scale is available
        self.browser.open(scale.url)
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (128, 128))

    def testPublishCustomSizeViaUID(self):
        # set custom image sizes
        ImageScaling._sizes = {'foo': (23, 23)}
        scale = self.view.scale('image', 'foo')
        transaction.commit()
        # make sure the referenced image scale is available
        self.browser.open(scale.url)
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (23, 23))

    def testPublishThumbViaName(self):
        ImageScaling._sizes = {'thumb': (128, 128)}
        transaction.commit()

        # make sure traversing works as is and with scaling
        # first the field without a scale name
        self.browser.open(
            self.layer['app'].absolute_url() + '/item/@@images/image'
        )
        self.assertEqual('image/png', self.browser.headers['content-type'])
        self.assertEqual(self.browser.contents, getFile('image.png'))

        # and last a scaled version
        self.browser.open(
            self.layer['app'].absolute_url() + '/item/@@images/image/thumb'
        )
        self.assertEqual('image/png', self.browser.headers['content-type'])
        assertImage(self, self.browser.contents, 'PNG', (128, 128))

    def testPublishCustomSizeViaName(self):
        # set custom image sizes
        ImageScaling._sizes = {'foo': (23, 23)}
        transaction.commit()
        # make sure traversing works as expected
        self.browser.open(
            self.layer['app'].absolute_url() + '/item/@@images/image/foo'
        )
        assertImage(self, self.browser.contents, 'PNG', (23, 23))

    def testPublishScaleWithInvalidUID(self):
        scale = self.view.scale('image', width=64, height=64)
        transaction.commit()
        # change the url so it's invalid...
        from zExceptions import NotFound
        with self.assertRaises(NotFound):
            self.browser.open(scale.url.replace('.png', 'x.png'))

    def testPublishScaleWithInvalidScale(self):
        scale = self.view.scale('image', 'no-such-scale')
        transaction.commit()
        self.assertEqual(scale, None)

    def test_getAvailableSizesWithInvalidScaleMethod(self):
        self.assertEqual(self.view.getAvailableSizes('no-such-scale'), {})

    def test_getAvailableSizesWithInvalidScaleProperty(self):
        self.assertEqual(self.view.available_sizes, {})

    def test_getImageSizeWithInvalidScale(self):
        self.assertEqual(self.view.getImageSize('no-such-scale'), (0, 0))

    def testGuardedAccess(self):
        # make sure it's not possible to access scales of forbidden images
        self.item.__allow_access_to_unprotected_subobjects__ = 0
        ImageScaling._sizes = {'foo': (23, 23)}
        transaction.commit()
        self.browser.addHeader(
            'Authorization',
            'Basic {0:s}:{1:s}'.format(TEST_USER_NAME, TEST_USER_PASSWORD)
        )
        from zExceptions import Unauthorized
        with self.assertRaises(Unauthorized):
            self.browser.open(
                self.layer['app'].absolute_url() + '/item/@@images/image/foo'
            )
        self.item.__allow_access_to_unprotected_subobjects__ = 1
class SyndicationControlPanelFunctionalTest(unittest.TestCase):

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_syndication_controlpanel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Syndication').click()

    def test_syndication_controlpanel_backlink(self):
        self.browser.open(
            "%s/@@syndication-controlpanel" % self.portal_url)
        self.assertTrue("General" in self.browser.contents)

    def test_syndication_controlpanel_sidebar(self):
        self.browser.open(
            "%s/@@syndication-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_syndication_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="syndication-controlpanel")
        self.assertTrue(view())

    def test_syndication_controlpanel_enabled(self):
        self.browser.open(
            "%s/@@syndication-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.default_enabled:list').value = True
        self.browser.getControl(
            name='form.widgets.show_author_info:list').value = False
        self.browser.getControl(
            name='form.widgets.show_syndication_link:list').value = True
        self.browser.getControl('Save').click()

        self.assertTrue('Changes saved' in self.browser.contents)
        self.browser.open(
            "%s/@@syndication-controlpanel" % self.portal_url)

        self.assertEqual(
            self.browser.getControl(
                name='form.widgets.default_enabled:list'
            ).value,
            ['selected']
        )
        self.assertEqual(
            self.browser.getControl(
                name='form.widgets.show_author_info:list').value,
            []
        )
        self.assertEqual(
            self.browser.getControl(
                name='form.widgets.show_syndication_link:list'
            ).value,
            ['selected']
        )

    def test_create_collection(self):
        """Create collection and check if synPropertiesForm link is present.
        """
        # create collection
        self.portal.invokeFactory('Collection', 'collection')
        self.portal.collection.query = [
            {
                "i": "portal_type",
                "o": "plone.app.querystring.operation.selection.any",
                "v": ["News Item"]
            },
            {
                "i": "review_state",
                "o": "plone.app.querystring.operation.selection.any",
                "v": ["published"]
            }
        ]
        transaction.commit()
        # Enable syndication
        self.browser.open(
            "%s/@@syndication-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.default_enabled:list').value = ['selected']
        self.browser.getControl(
            name='form.widgets.show_syndication_link:list'
        ).value = ['selected']
        self.browser.getControl('Save').click()
        self.assertTrue('Changes saved' in self.browser.contents)

        self.browser.open(self.portal_url + '/collection')
        self.assertTrue('/RSS' in self.browser.contents)
class SecurityControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the security control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        registry = getUtility(IRegistry)
        self.settings = registry.forInterface(
            ISecuritySchema, prefix="plone")
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_security_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Security').click()

    def test_security_control_panel_backlink(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.assertTrue("Security" in self.browser.contents)

    def test_security_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_enable_self_reg(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl('Enable self-registration').selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.enable_self_reg, True)

    def test_enable_user_pwd_choice(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl(
            'Let users select their own passwords').selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.enable_user_pwd_choice, True)

    def test_enable_user_folders(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl(
            'Enable User Folders').selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.enable_user_folders, True)

    def test_allow_anon_views_about(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl(
            "Allow anyone to view 'about' information").selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.allow_anon_views_about, True)

    def test_use_email_as_login(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl(
            "Use email address as login name").selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.use_email_as_login, True)

    def test_use_uuid_as_userid(self):
        self.browser.open(
            "%s/@@security-controlpanel" % self.portal_url)
        self.browser.getControl(
            "Use UUID user ids").selected = True
        self.browser.getControl('Save').click()

        self.assertEqual(self.settings.use_uuid_as_userid, True)
class FilterControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the site control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.portal_url = self.portal.absolute_url()
        registry = getUtility(IRegistry)
        self.settings = registry.forInterface(
            IFilterSchema, prefix="plone")
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
        self.safe_html = getattr(
            getToolByName(self.portal, 'portal_transforms'),
            'safe_html',
            None)

    def test_filter_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Site').click()

    def test_filter_control_panel_backlink(self):
        self.browser.open(
            "%s/@@filter-controlpanel" % self.portal_url)
        self.assertTrue("Security" in self.browser.contents)

    def test_filter_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@filter-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_filter_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="filter-controlpanel")
        self.assertTrue(view())

    def test_disable_filtering(self):
        self.browser.open(
            "%s/@@filter-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.disable_filtering:list').value = "selected"
        self.browser.getControl('Save').click()

        # test that the transform is disabled
        self.assertEqual(
            self.settings.disable_filtering,
            1)

        # anything passes
        nasty_html = '<script></script>'
        ds = datastream('dummy_name')
        self.assertEqual(
            nasty_html,
            str(self.safe_html.convert(nasty_html, ds))
        )

    def test_nasty_tags(self):
        self.browser.open(
            "%s/@@filter-controlpanel" % self.portal_url)
        self.assertEqual(
            self.browser.getControl(name='form.widgets.nasty_tags').value,
            'style\nobject\nembed\napplet\nscript\nmeta')
        self.browser.getControl(
            name='form.widgets.nasty_tags').value = 'div\na'
        valid_tags = self.browser.getControl(
            name='form.widgets.valid_tags').value
        self.assertTrue(valid_tags.startswith('a\nabbr\nacronym\naddress'))
        valid_tags = valid_tags.replace('a\n', '')
        valid_tags = self.browser.getControl(
            name='form.widgets.valid_tags').value = valid_tags
        self.browser.getControl('Save').click()
        self.assertEqual(self.settings.nasty_tags, [u'div', u'a'])
        self.assertNotIn(u'a', self.settings.valid_tags)

        # test that <a> is filtered
        self.assertFalse(self.settings.disable_filtering)
        good_html = '<p><a href="http://example.com">harmless link</a></p>'
        ds = datastream('dummy_name')
        self.assertEqual(
            self.safe_html.convert(good_html, ds).getData(),
            '<p/>'
        )
class TestSiteAdministratorRoleFunctional(unittest.TestCase):

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def _generateUsers(self):
        rtool = getToolByName(self.portal, 'portal_registration')
        rtool.addMember('DIispfuF', 'secret', ['Member'], [])
        rtool.addMember('siteadmin', 'secret', ['Site Administrator'], [])
        rtool.addMember('root', 'secret', ['Manager'], [])

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.portal_url = self.portal.absolute_url()
        self.usergroups_url = "%s/@@usergroup-userprefs" % self.portal_url
        self.groups_url = "%s/@@usergroup-groupprefs" % self.portal_url
        self._generateUsers()
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        transaction.commit()

        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (TEST_USER_ID, TEST_USER_PASSWORD,)
        )
        self.normal_user = '******'

    def _get_authenticator(self, browser=None):
        if not browser:
            browser = self.browser
        return browser.getControl(name='_authenticator').value

    def _simplify_white_space(self, text):
        """For easier testing we replace all white space with one space.

        And we remove white space around '<' and '>'.

        So this:

          <p
              id="foo"> Bar
          </p>

        becomes this:

          <p id="foo">Bar</p>
        """
        text = re.sub(r'\s*<\s*', '<', text)
        text = re.sub(r'\s*>\s*', '>', text)
        text = re.sub(r'\s+', ' ', text)
        return text

    def testControlPanelOverview(self):
        # make sure we can view the Site Setup page,
        # at both old and new URLs
        view = self.portal.restrictedTraverse('plone_control_panel')
        self.assertTrue(view())
        view = self.portal.restrictedTraverse('overview-controlpanel')
        self.assertTrue(view())

    def testUserManagerRoleCheckboxIsDisabledForNonManagers(self):
        login(self.portal, 'siteadmin')
        view = self.portal.restrictedTraverse('@@usergroup-userprefs')
        contents = view()
        self.assertTrue('<input type="checkbox" class="noborder" '
                        'name="users.roles:list:records" value="Manager" '
                        'disabled="disabled" />' in contents)

    def testManagerCanDelegateManagerRoleForUsers(self):
        # a user with the Manager role can grant the Manager role
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
        self.browser.open(self.usergroups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'users.id:records': self.normal_user,
            'users.roles:list:records': 'Manager',
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        self.browser.post(self.usergroups_url, post_data)
        self.assertIn('Status: 200', str(self.browser.headers))

        roles = self.portal.acl_users.getUserById(self.normal_user).getRoles()
        self.assertEqual(['Manager', 'Authenticated'], roles)

    def testNonManagersCannotDelegateManagerRoleForUsers(self):
        # a user without the Manager role cannot delegate the Manager role
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')
        self.browser.open(self.usergroups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'users.id:records': self.normal_user,
            'users.roles:list:records': 'Manager',
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.post(self.usergroups_url, post_data)
        roles = self.portal.acl_users.getUserById(self.normal_user).getRoles()
        self.assertEqual(['Member', 'Authenticated'], roles)

    def testNonManagersCanEditOtherRolesOfUsersWithManagerRole(self):
        roles = self.portal.acl_users.getUserById('root').getRoles()
        self.assertEqual(['Manager', 'Authenticated'], roles)
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')
        self.browser.open(self.usergroups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'users.id:records': 'root',
            'users.roles:list:records': ('Member', 'Manager'),
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form, doseq=True)
        self.browser.post(self.usergroups_url, post_data)
        roles = self.portal.acl_users.getUserById('root').getRoles()
        self.assertEqual(['Authenticated', 'Manager', 'Member'], sorted(roles))

    def testGroupManagerRoleCheckboxIsDisabledForNonManagers(self):
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')
        self.browser.open(self.groups_url)
        contents = self._simplify_white_space(self.browser.contents)
        self.assertTrue('<input type="checkbox" class="noborder" '
                        'name="group_Reviewers:list" value="Manager" '
                        'disabled="disabled" />' in contents)

    def testManagerCanDelegateManagerRoleForGroups(self):
        # a user with the Manager role can grant the Manager role
        roles = self.portal.acl_users.getGroupById('Reviewers').getRoles()
        self.assertEqual(['Reviewer', 'Authenticated'], roles)
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )
        self.browser.open(self.groups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'group_Reviewers:list': ('', 'Manager'),
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form, doseq=True)
        self.browser.post(self.groups_url, post_data)
        roles = self.portal.acl_users.getGroupById('Reviewers').getRoles()
        self.assertEqual(['Manager', 'Authenticated'], roles)

    def testNonManagersCannotDelegateManagerRoleForGroups(self):
        # a user without the Manager role cannot delegate the Manager role
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        self.browser.open(self.groups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'group_Reviewers:list': ('', 'Manager'),
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form, doseq=True)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.post(self.groups_url, post_data)
        # self.assertEqual(403, res.status)
        roles = self.portal.acl_users.getGroupById('Reviewers').getRoles()
        self.assertEqual(['Reviewer', 'Authenticated'], roles)

    def testNonManagersCanEditOtherRolesOfGroupsWithManagerRole(self):
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        roles = self.portal.acl_users.getUserById('root').getRoles()
        self.assertEqual(['Manager', 'Authenticated'], roles)
        self.browser.open(self.groups_url)
        form = {
            '_authenticator': self._get_authenticator(),
            'group_Administrators:list': ('', 'Member', 'Manager'),
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form, doseq=True)
        self.browser.post(self.groups_url, post_data)
        # self.assertEqual(200, res.status)
        roles = self.portal.acl_users.getGroupById('Administrators').getRoles()
        self.assertEqual(['Authenticated', 'Manager', 'Member'], sorted(roles))

    def test_usergroup_usermembership_blocks_escalation(self):
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        # groups granting the Manager role shouldn't show as a valid option to
        # add
        self.browser.open(
            self.portal_url + '/@@usergroup-usermembership?userid=%s' % self.normal_user)
        contents = self._simplify_white_space(self.browser.contents)
        self.assertTrue(
            '<input type="checkbox" class="noborder" name="add:list" '
            'value="Administrators" disabled="disabled" />' in contents
        )

        # and should not be addable
        form = {
            '_authenticator': self._get_authenticator(),
            'add:list': 'Administrators',
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.open(
                self.portal_url + '/@@usergroup-usermembership?userid=%s' % self.normal_user, post_data
            )
        # self.assertEqual(403, res.status)
        roles = self.portal.acl_users.getUserById(self.normal_user).getRoles()
        self.assertEqual(['Member', 'Authenticated'], roles)

    def test_usergroup_groupmembership_blocks_escalation(self):
        # should not show section to add users for groups granting the Manager
        # role
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        self.browser.open(
            self.portal_url + '/@@usergroup-groupmembership?groupname=Administrators'
        )
        contents = self._simplify_white_space(self.browser.contents)
        self.assertFalse('Search for new group members' in contents)

        # and should not be addable if we try to force it
        form = {
            '_authenticator': self._get_authenticator(),
            'add:list': self.normal_user,
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.post(
                self.portal_url + '/@@usergroup-groupmembership?groupname=Administrators', post_data
            )
        # self.assertEqual(403, res.status)
        roles = self.portal.acl_users.getUserById(self.normal_user).getRoles()
        self.assertEqual(['Member', 'Authenticated'], roles)

    def test_user_registration_form_blocks_escalation(self):
        # groups granting the Manager role should not be available for
        # selection
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')
        self.browser.open(self.portal_url + '/@@new-user')
        contents = self._simplify_white_space(self.browser.contents)
        self.assertFalse(
            '<input class="label checkboxType" id="form.groups.0" '
            'name="form.groups" type="checkbox" value="Administrators '
            '(Administrators)" />' in contents
        )
        # and should not be getting that roles if we try to force it
        form = {
            '_authenticator': self._get_authenticator(),
            'form.widgets.username': '******',
            'form.widgets.email': '*****@*****.**',
            'form.widgets.password': '******',
            'form.widgets.password_ctl': 'secret',
            'form.widgets.groups:list': 'Administrators',
            'form.widgets.groups-empty-marker': '1',
            'form.buttons.register': 'Register',
        }
        post_data = urlencode(form)
        self.browser.post(self.portal_url + '/@@new-user', post_data)
        self.assertEqual(
            ['Member', 'Authenticated'],
            self.portal.acl_users.getUserById('newuser').getRoles())

    def test_users_overview_blocks_deleting_managers(self):
        # a user without the Manager role cannot delete a user with the
        # Manager role
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        self.browser.open(self.usergroups_url)
        contents = self._simplify_white_space(self.browser.contents)
        self.assertTrue(
            '<input type="checkbox" class="noborder notify" '
            'name="delete:list" value="root" disabled="disabled" />'
            in contents)

        form = {
            '_authenticator': self._get_authenticator(),
            'users.id:records': 'root',
            'delete:list': 'root',
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.post(self.usergroups_url, post_data)
        # self.assertEqual(403, res.status)
        user = self.portal.acl_users.getUserById('root')
        self.assertTrue(user is not None)

    def test_groups_overview_blocks_deleting_managers(self):
        # a user without the Manager role cannot delete a group with the
        # Manager role
        self.browser.addHeader(
            'Authorization', 'Basic siteadmin:secret')

        self.browser.open(self.groups_url)
        contents = self._simplify_white_space(self.browser.contents)
        self.assertTrue(
            '<input type="checkbox" class="noborder notify" '
            'name="delete:list" value="Administrators" disabled="disabled" />'
            in contents
        )

        form = {
            '_authenticator': self._get_authenticator(),
            'delete:list': 'Administrators',
            'form.button.Modify': 'Save',
            'form.submitted': 1,
        }
        post_data = urlencode(form)
        with self.assertRaises(zExceptions.Forbidden):
            self.browser.post(self.groups_url, post_data)
        # self.assertEqual(403, res.status)
        group = self.portal.acl_users.getGroupById('Administrators')
        self.assertTrue(group is not None)
class AddonsControlPanelFunctionalTest(unittest.TestCase):
    """Test that the add-ons control panel works nicely."""

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_addons_controlpanel_link(self):
        self.browser.open(
            '%s/@@overview-controlpanel' % self.portal_url)
        self.browser.getLink('Add-ons').click()

    def test_addons_controlpanel_backlink(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        self.assertTrue('General' in self.browser.contents)

    def test_addons_controlpanel_sidebar(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_addons_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name='prefs_install_products_form')
        self.assertTrue(view())

    def test_addons_controlpanel_no_upgrades(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        self.assertIn('No upgrades in this corner', self.browser.contents)

    def test_addons_controlpanel_installable(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        # We expect a few standard add-ons.
        self.assertIn('Workflow Policy Support', self.browser.contents)
        self.assertIn('Multilingual Support', self.browser.contents)
        self.assertIn('plone.session', self.browser.contents)

    def test_addons_controlpanel_not_installable(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        # We do not expect some other add-ons.
        self.assertNotIn('plone.app.upgrade', self.browser.contents)
        self.assertNotIn('Products.CMFPlone', self.browser.contents)

    def test_addons_controlpanel_install_and_uninstall_all(self):
        self.browser.open(
            '%s/prefs_install_products_form' % self.portal_url)
        self.assertNotIn('Installed', self.browser.contents)
        self.assertNotIn('Uninstalled', self.browser.contents)
        # It is hard to determine which exact product will be installed
        # by clicking on a button, because they are all called 'Install'.
        # We install all available products.
        for buttons in range(12):
            try:
                self.browser.getControl('Install', index=buttons)
            except LookupError:
                break
        else:
            # Either our test logic is off, or the code that determines
            # which products are installable is actually wrong.
            raise AssertionError('Too many Install buttons.')
        # Click all install buttons.
        for button in range(buttons):
            # Always install the first.
            self.browser.getControl('Install', index=0).click()
            self.assertIn('Installed', self.browser.contents)
        # There are no more install buttons.
        with self.assertRaises(LookupError):
            self.browser.getControl('Install', index=0)
        # There should now be just as many Uninstall buttons.
        self.browser.getControl('Uninstall', index=buttons - 1)
        for button in range(buttons):
            # Always uninstall the first.
            self.browser.getControl('Uninstall', index=0).click()
            self.assertIn('Uninstalled', self.browser.contents)
        # There are no more uninstall buttons.
        with self.assertRaises(LookupError):
            self.browser.getControl('Uninstall', index=0)
        # Instead, we could install all again if we want.
        self.browser.getControl('Install', index=buttons - 1)
class UserGroupsControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the user groups control panel are actually
    creating and changing users and groups.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def _generateGroups(self):
        groupsTool = getToolByName(self.portal, 'portal_groups')
        self.groups = [
            {'id': 'group1', 'title': "Group 1"},
            {'id': 'group2', 'title': "Group 2"},
            {'id': 'group3', 'title': "Group 3 accentué"}
        ]
        for group in self.groups:
            groupsTool.addGroup(group['id'], [], [], title=group['title'])

    def _generateUsers(self):
        self.members = [
            {'username': '******', 'fullname': 'Kevin Hughes',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Richard Ramirez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Kyle Brown',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Julian Green',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Makayla Coleman',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Sean Foster',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Molly Martin',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Jordan Thompson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Tyler Rivera',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Megan Murphy',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Gracie Diaz',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Rachel Morgan',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Maya Price',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Blake Jenkins',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Owen Ramirez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Owen Cook',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Jayden Hill',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Joseph Ramirez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Nathan Young',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Kaitlyn Hernandez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Faith Price',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Sofia Williams',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'David Sanders',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Jack Simmons',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Cole Howard',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Rachel Miller',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Henry Patterson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Avery Cooper',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Sydney Bennett',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Daniel Johnson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Autumn Brooks',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Alexandra Nelson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Brian Simmons',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Kevin Hughes',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Sydney Evans',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Emma Brown',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Lauren Martin',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Isabelle Russell',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Anna Baker',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Brady Watson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Kaitlyn Robinson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Riley Richardson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Kayla Sanders',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Sara Richardson',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Trinity Gonzales',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Madeline Garcia',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Brian Gray',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Victoria Perez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Charles Rodriguez',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Abigail Simmons',
                'email': '*****@*****.**'},
            {'username': '******', 'fullname': 'Émilie Richard',
                'email': '*****@*****.**'},
        ]
        rtool = getToolByName(self.portal, 'portal_registration')
        for member in self.members:
            rtool.addMember(member['username'],
                            'somepassword', properties=member)

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.usergroups_url = "%s/@@usergroup-userprefs" % self.portal_url
        self.groups_url = "%s/@@usergroup-groupprefs" % self.portal_url
        self._generateGroups()
        self._generateUsers()
        transaction.commit()

        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_usergroups_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Users and Groups').click()
        self.assertEqual(
            self.browser.url,
            self.usergroups_url
        )

    def test_usergroups_groups_link(self):
        self.browser.open(self.usergroups_url)
        self.browser.getLink('Groups', index=0).click()
        self.assertEqual(
            self.browser.url,
            "%s/@@usergroup-groupprefs" % self.portal_url
        )

    def test_usergroups_settings_link(self):
        self.browser.open(self.usergroups_url)
        self.browser.getLink('Settings').click()
        self.assertEqual(
            self.browser.url,
            "%s/@@usergroup-controlpanel" % self.portal_url
        )

    def test_usergroups_memberfields_link(self):
        self.browser.open(self.usergroups_url)
        self.browser.getLink('Member fields').click()
        self.assertEqual(
            self.browser.url,
            "%s/@@member-fields" % self.portal_url
        )

    def test_user_search_by_name(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'Richard'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Richard Ramirez', self.browser.contents)
        self.assertIn('Sara Richardson', self.browser.contents)
        self.assertIn('Émilie Richard', self.browser.contents)

    def test_user_search_by_name_accent(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'Émilie'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Émilie Richard', self.browser.contents)

    def test_user_search_by_id(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Autumn Brooks', self.browser.contents)

    def test_user_search_by_mail(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'DohPmgIa@'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Gracie Diaz', self.browser.contents)

    def test_user_show_all(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='form.button.FindAll').click()

        # Check that first 10 members (sorted by fullname) are shown.
        for member in sorted(
            self.members, key=lambda k: normalizeString(k['fullname'])
        )[:10]:
            self.assertIn(member['fullname'], self.browser.contents)

    def test_user_show_all_with_search_term(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'no-user'
        self.browser.getControl(name='form.button.FindAll').click()

        # Check that all members is shown and search term is ignored
        self.assertIn('Avery Cooper', self.browser.contents)

    def test_user_add_new_link(self):
        self.browser.open(self.usergroups_url)
        self.browser.getLink(id='add-user').click()
        self.assertEqual(
            self.browser.url,
            "%s/@@new-user" % self.portal_url
        )

    def test_user_modify_roles(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()

        # Check that contributor role is not enabled and enable it
        self.assertFalse(self.browser.getControl(
            name='users.roles:list:records'
        ).getControl(value='Contributor').selected)
        self.browser.getControl(
            name='users.roles:list:records'
        ).getControl(value='Contributor').selected = True
        self.browser.getControl(name='form.button.Modify').click()

        # Check that contributor role is now enabled for this user
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()
        self.assertTrue(self.browser.getControl(
            name='users.roles:list:records'
        ).getControl(value='Contributor').selected)

    def test_user_delete(self):
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Autumn Brooks', self.browser.contents)

        # Delete user
        self.browser.getControl(name='delete:list').getControl(
            value='TWrMCLIo').selected = True
        self.browser.getControl(name='form.button.Modify').click()

        # Check that user does not exist anymore
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()
        self.assertNotIn('Autumn Brooks', self.browser.contents)

    def test_groups_search_by_id(self):
        self.browser.open(self.groups_url)
        self.browser.getControl(name='searchstring').value = 'group1'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Group 1', self.browser.contents)

    def test_groups_search_by_name(self):
        self.browser.open(self.groups_url)
        self.browser.getControl(name='searchstring').value = 'Group 3 accentué'
        self.browser.getControl(name='form.button.Search').click()
        self.assertIn('Group 3 accentué', self.browser.contents)

    def test_groups_modify_roles(self):
        self.browser.open(self.groups_url)
        self.browser.getControl(name='searchstring').value = 'group1'

        # Check that role is not selected yet and then select it and apply it.
        form = self.browser.getForm(id='groups_search')
        ctrls = form._form.fields.get('group_group1:list')
        roles = [ctrl._value for ctrl in ctrls]
        expected = 'Site Administrator'
        self.assertIn(expected, roles)
        idx = roles.index(expected)
        self.assertFalse(ctrls[idx].checked)
        ctrls[idx].checked = True
        self.browser.getControl('Save').click()

        # Check that role is now selected
        form = self.browser.getForm(id='groups_search')
        ctrl = form._form.get('group_group1:list', index=idx)
        self.assertEqual(ctrl._value, expected)
        self.assertTrue(ctrl.checked)

    def test_groups_delete_group(self):
        self.browser.open(self.groups_url)
        self.browser.getControl(name='searchstring').value = 'group1'

        # Delete a group
        self.browser.getControl(
            name='delete:list'
        ).getControl(value='group1').selected = True
        self.browser.getControl(name='form.button.Modify').click()

        # Check that group doesn't exist anymore
        self.browser.getControl(name='searchstring').value = 'group1'
        self.assertNotIn('Group 1', self.browser.contents)

    def test_groups_show_all(self):
        self.browser.open(self.groups_url)
        self.browser.getControl(name='form.button.FindAll').click()

        for group in self.groups:
            self.assertIn(group['title'], self.browser.contents)

    def test_group_add_users(self):
        self.browser.open(self.groups_url)
        self.browser.getLink('Group 1 (group1)').click()
        self.assertIn(
            'There is no group or user attached to this group.',
            self.browser.contents
        )

        # Add user (Autumn Brooks) to selected group (Group 1)
        self.browser.getControl(name='searchstring').value = 'TWrMCLIo'
        self.browser.getControl(name='form.button.Search').click()
        self.browser.getControl(name='add:list').getControl(
            value='TWrMCLIo').selected = True

        # Check that user is now part of the group
        self.browser.getControl(
            'Add selected groups and users to this group').click()
        self.assertIn('Autumn Brooks', self.browser.contents)

    def test_group_add_group(self):
        self.browser.open(self.groups_url)
        self.browser.getLink('Group 1 (group1)').click()
        self.assertIn(
            'There is no group or user attached to this group.',
            self.browser.contents
        )

        # Add group2 to selected  group 1
        self.browser.getControl(name='searchstring').value = 'group2'
        self.browser.getControl(name='form.button.Search').click()
        self.browser.getControl(name='add:list').getControl(
            value='group2').selected = True

        # Check that group is now part of the group
        self.browser.getControl(
            'Add selected groups and users to this group').click()
        self.assertIn('Group 2', self.browser.contents)

    def test_usergroups_settings_many_users(self):
        self.browser.open("%s/@@usergroup-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.many_users:list'
        ).controls[0].selected = True
        self.browser.getControl('Save').click()

        # Check that show all button for users is no longer available
        self.browser.open(self.usergroups_url)
        self.assertNotIn('Show all', self.browser.contents)

        # Check that empty search does not trigger show all
        self.browser.open(self.usergroups_url)
        self.browser.getControl(name='searchstring').value = ''

    def test_usergroups_settings_many_groups(self):
        self.browser.open("%s/@@usergroup-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.many_groups:list'
        ).controls[0].selected = True
        self.browser.getControl('Save').click()

        # Check that show all button for groups is no longer available
        self.browser.open(self.groups_url)
        self.assertNotIn('Show all', self.browser.contents)
        self.assertNotIn('DIispfuF', self.browser.contents)
class LanguageControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the language control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def _inject_available_languages_field(self, value):
        """The in-and-out widget does not work without javascript, therefore
           we have to inject some values in order to make saving the form work.
        """
        form = self.browser.getForm(id='LanguageControlPanel')
        name = 'form.widgets.available_languages:list'
        field = webtest.forms.Hidden(form._form, 'input', name, 0, value=value)
        form._form.field_order.append((name, field))
        self.browser.getControl('Save').click()

    def test_language_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Language').click()
        self.assertTrue("Language Settings" in self.browser.contents)

    def test_language_control_panel_backlink(self):
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertTrue("General" in self.browser.contents)

    def test_language_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_language_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="language-controlpanel")
        self.assertTrue(view())

    def test_default_language(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.default_language, 'en')
        self.assertEqual(
            self.browser.getControl(
                'Site language'
            ).value,
            ['en']
        )
        self.browser.getControl(
            'Site language'
        ).value = ['de']
        self._inject_available_languages_field('en')
        self._inject_available_languages_field('de')
        self.browser.getControl(name='form.buttons.save').click()

        self.assertEqual(settings.default_language, 'de')

    # def test_available_languages(self):
    #     registry = getUtility(IRegistry)
    #     settings = registry.forInterface(ILanguageSchema, prefix='plone')
    #     self.browser.open(
    #         "%s/@@language-controlpanel" % self.portal_url)
    #     self.assertEqual(settings.available_languages, ['en'])
    #     self.assertEqual(
    #         self.browser.getControl(
    #             name='form.widgets.available_languages.to'
    #         ).options,
    #         ['en']
    #     )
    #     control = self.browser.getForm(index=1)
    #     self.in_out_select(
    #         control, 'form.widgets.available_languages:list', 'Deutsch')
    #     self.browser.getControl('Save').click()
    #     self.assertEqual(settings.available_languages, ['en', 'de'])

    def test_use_combined_language_codes(self):
        """This checks swithing combined languages codes support off/on."""
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_combined_language_codes, True)
        self.assertEqual(
            self.browser.getControl(
                'Show country-specific language variants'
            ).selected,
            True
        )
        self.browser.getControl(
            'Show country-specific language variants'
        ).selected = False

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_combined_language_codes, False)

    def test_display_flags(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.display_flags, False)
        self.assertEqual(
            self.browser.getControl(
                'Show language flags'
            ).selected,
            False
        )
        self.browser.getControl(
            'Show language flags'
        ).selected = True

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.display_flags, True)

    def test_use_content_negotiation(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_content_negotiation, False)
        self.assertEqual(
            self.browser.getControl(
                'Use the language of the content item'
            ).selected,
            False
        )
        self.browser.getControl(
            'Use the language of the content item'
        ).selected = True

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_content_negotiation, True)

    def test_use_path_negotiation(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_path_negotiation, False)
        self.assertEqual(
            self.browser.getControl(
                'Use language codes in URL path for manual override'
            ).selected,
            False
        )
        self.browser.getControl(
            'Use language codes in URL path for manual override'
        ).selected = True

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_path_negotiation, True)

    def test_use_cookie_negotiation(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_cookie_negotiation, False)
        self.assertEqual(
            self.browser.getControl(
                'Use cookie for manual override'
            ).selected,
            False
        )
        self.browser.getControl(
            'Use cookie for manual override'
        ).selected = True

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_cookie_negotiation, True)

    def test_authenticated_users_only(self):
        control_label = "Authenticated users only"
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.authenticated_users_only, False)
        self.assertEqual(
            self.browser.getControl(control_label).selected,
            False
        )
        self.browser.getControl(control_label).selected = True

        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.authenticated_users_only, True)

    def test_set_cookie_always(self):
        control_label = "Set the language cookie always"
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.set_cookie_always, False)
        self.assertEqual(
            self.browser.getControl(control_label).selected,
            False
        )
        self.browser.getControl(control_label).selected = True
        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.set_cookie_always, True)

    def test_use_subdomain_negotiation(self):
        control_label = "Use subdomain"
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_subdomain_negotiation, False)
        self.assertEqual(
            self.browser.getControl(control_label).selected,
            False
        )
        self.browser.getControl(control_label).selected = True
        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_subdomain_negotiation, True)

    def test_use_cctld_negotiation(self):
        control_label = "Use top-level domain"
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_cctld_negotiation, False)
        self.assertEqual(
            self.browser.getControl(control_label).selected,
            False
        )
        self.browser.getControl(control_label).selected = True
        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_cctld_negotiation, True)

    def test_use_request_negotiation(self):
        control_label = "Use browser language request negotiation"
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        self.browser.open(
            "%s/@@language-controlpanel" % self.portal_url)
        self.assertEqual(settings.use_request_negotiation, False)
        self.assertEqual(
            self.browser.getControl(control_label).selected,
            False
        )
        self.browser.getControl(control_label).selected = True
        self._inject_available_languages_field('en')
        self.browser.getControl('Save').click()

        self.assertEqual(settings.use_request_negotiation, True)
class SearchControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the search control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_search_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Search').click()

    def test_search_control_panel_backlink(self):
        self.browser.open(
            "%s/@@search-controlpanel" % self.portal_url)
        self.assertTrue("General" in self.browser.contents)

    def test_search_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@search-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_search_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="search-controlpanel")
        self.assertTrue(view())

    def test_enable_livesearch(self):
        self.browser.open(
            "%s/@@search-controlpanel" % self.portal_url)
        self.browser.getControl('Enable LiveSearch').selected = True
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISearchSchema, prefix="plone")
        self.assertEqual(settings.enable_livesearch, True)

    def test_types_not_searched(self):
        self.browser.open(
            "%s/@@search-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.types_not_searched:list'
        ).value = ['Discussion Item', 'News Item']
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISearchSchema, prefix="plone")
        self.assertFalse('Discussion Item' in settings.types_not_searched)
        self.assertFalse('News Item Item' in settings.types_not_searched)
class MarkupControlPanelFunctionalTest(unittest.TestCase):
    """Make sure changes in the markup control panel are properly
    stored in plone.app.registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_markup_control_panel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Markup').click()

    def test_markup_control_panel_backlink(self):
        self.browser.open(
            "%s/@@markup-controlpanel" % self.portal_url)
        self.assertTrue("Content" in self.browser.contents)

    def test_markup_control_panel_sidebar(self):
        self.browser.open(
            "%s/@@markup-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_markup_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="markup-controlpanel")
        self.assertTrue(view())

    def test_default_type(self):
        self.browser.open(
            "%s/@@markup-controlpanel" % self.portal_url)
        self.browser.getControl('Default format').value = ['text/plain']
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMarkupSchema, prefix='plone')
        self.assertEqual(settings.default_type, 'text/plain')

    def test_allowed_types(self):
        self.browser.open(
            "%s/@@markup-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.allowed_types:list'
        ).value = ['text/html', 'text/x-web-textile']
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMarkupSchema, prefix='plone')
        self.assertEqual(settings.allowed_types,
                         ('text/html', 'text/x-web-textile'))
class MailControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the mail control panel are actually
    stored in the registry.
    """

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.portal_url = self.portal.absolute_url()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization',
            'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_mail_controlpanel_link(self):
        self.browser.open(
            "%s/@@overview-controlpanel" % self.portal_url)
        self.browser.getLink('Mail').click()

    def test_mail_controlpanel_backlink(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.assertTrue("General" in self.browser.contents)

    def test_mail_controlpanel_sidebar(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getLink('Site Setup').click()
        self.assertTrue(
            self.browser.url.endswith('/plone/@@overview-controlpanel')
        )

    def test_mail_controlpanel_view(self):
        view = getMultiAdapter((self.portal, self.portal.REQUEST),
                               name="mail-controlpanel")
        self.assertTrue(view())

    def test_mail_controlpanel_smtp_host(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.smtp_host').value = 'example.com'
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.smtp_host, 'example.com')

    def test_mail_controlpanel_smtp_port(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.smtp_port').value = '88'
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(str(settings.smtp_port), '88')

    def test_mail_controlpanel_smtp_userid(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.smtp_userid').value = '*****@*****.**'
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.smtp_userid, '*****@*****.**')

    def test_mail_controlpanel_smtp_pass(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.smtp_pass').value = 'secret'
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.smtp_pass, 'secret')

    def test_mail_controlpanel_smtp_pass_keep_on_saving(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.smtp_userid').value = '*****@*****.**'
        self.browser.getControl(
            name='form.widgets.smtp_pass').value = 'secret'
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.smtp_pass, 'secret')

    def test_mail_controlpanel_email_from_name(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.email_from_name, 'John')

    def test_mail_controlpanel_email_from_address(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        self.assertEqual(settings.email_from_address, '*****@*****.**')

    def test_mail_controlpanel_contactinfo_page(self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        self.browser.open(
            "%s/contact-info" % self.portal_url)
        self.assertTrue(
            'Message' in self.browser.contents,
            u'Message exists not in the contact-info form!'
        )

    def test_controlpanel_overview_shows_no_unconfigured_mailhost_warning(
            self):
        self.browser.open(
            "%s/@@mail-controlpanel" % self.portal_url)
        self.browser.getControl(
            name='form.widgets.email_from_name').value = 'John'
        self.browser.getControl(
            name='form.widgets.email_from_address').value = \
            '*****@*****.**'
        self.browser.getControl(name='form.buttons.save').click()

        self.browser.open(
            "%s/overview-controlpanel" % self.portal_url)
        self.assertFalse(
            'not configured a mail host' in self.browser.contents,
            u'There should not be a warning for unconfigured mailhost!'
        )

    def test_controlpanel_overview_shows_unconfigured_mailhost_warning(
            self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(IMailSchema, prefix="plone")
        settings.email_from_name = None
        settings.email_from_address = None
        self.browser.open(
            "%s/overview-controlpanel" % self.portal_url)
        self.assertTrue(
            'not configured a mail host' in self.browser.contents,
            u'There should be a warning for unconfigured mailhost!'
        )