Exemple #1
0
class DocumentFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

    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', 'Basic {0}:{1}'.format(
                SITE_OWNER_NAME,
                SITE_OWNER_PASSWORD,
            ))

    def test_add_document(self):
        self.browser.open(self.portal_url)
        self.browser.getLink(url='http://nohost/plone/++add++Document').click()
        widget = 'form.widgets.IDublinCore.title'
        self.browser.getControl(name=widget).value = 'My document'
        widget = 'form.widgets.IDublinCore.description'
        self.browser.getControl(name=widget).value = 'This is my document.'
        widget = 'form.widgets.IRichTextBehavior.text'
        self.browser.getControl(name=widget).value = 'Lorem Ipsum'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = 'my-special-document'
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('my-special-document/view'))
        self.assertTrue('My document' in self.browser.contents)
        self.assertTrue('This is my document' in self.browser.contents)
        self.assertTrue('Lorem Ipsum' in self.browser.contents)
Exemple #2
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))
class LinkFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

    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',
            'Basic {0}:{1}'.format(SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
        )

    def test_add_link(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('Link').click()
        self.browser.getControl(name='form.widgets.IDublinCore.title')\
            .value = 'My link'
        self.browser.getControl(name='form.widgets.IDublinCore.description')\
            .value = 'This is my link.'
        self.browser.getControl(name='form.widgets.IShortName.id')\
            .value = 'my-special-link'
        self.browser.getControl(name='form.widgets.remoteUrl.external')\
            .value = 'https://plone.org'
        self.browser.getControl('Save').click()

        self.assertTrue(self.browser.url.endswith('my-special-link/view'))
        self.assertTrue('My link' in self.browser.contents)
        self.assertTrue('This is my link' in self.browser.contents)
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'))
Exemple #6
0
class NewsItemFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

    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', 'Basic {0}:{1}'.format(
                SITE_OWNER_NAME,
                SITE_OWNER_PASSWORD,
            ))

    def test_add_news_item(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('News Item').click()
        self.browser.getControl(name='form.widgets.IDublinCore.title')\
            .value = 'My news item'
        self.browser.getControl(name='form.widgets.IDublinCore.description')\
            .value = 'This is my news item.'
        self.browser.getControl(name='form.widgets.IShortName.id')\
            .value = ''
        self.browser.getControl(name='form.widgets.IRichTextBehavior.text')\
            .value = 'Lorem Ipsum'
        self.browser.getControl('Save').click()

        self.assertTrue(self.browser.url.endswith('my-news-item/view'))
        self.assertTrue('My news item' in self.browser.contents)
        self.assertTrue('This is my news item' in self.browser.contents)
        self.assertTrue('Lorem Ipsum' in self.browser.contents)

    def test_add_news_item_with_shortname(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('News Item').click()
        self.browser.getControl(name='form.widgets.IDublinCore.title')\
            .value = 'My news item'
        self.browser.getControl(name='form.widgets.IShortName.id')\
            .value = 'my-special-news'
        self.browser.getControl('Save').click()

        self.assertTrue(self.browser.url.endswith('my-special-news/view'))
class AllowedFieldsControlPanelFuncionalTest(base.EasyFormTestCase):
    """Test that changes in the easyform control panel are actually
    stored in the registry.
    """
    def setUpPloneSite(self):
        pass

    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)

    def test_easyform_control_panel_link(self):
        self.browser.open(self.portal_url + "/@@overview-controlpanel")
        self.browser.getLink("easyform").click()
        self.assertTrue("easyform Settings" in self.browser.contents)

    def test_easyform_control_panel_backlink(self):
        self.browser.open(self.portal_url + "/@@easyform-controlpanel")
        self.assertTrue("General" in self.browser.contents)

    def test_easyform_control_panel_sidebar(self):
        self.browser.open(self.portal_url + "/@@navigation-controlpanel")
        self.browser.getLink("Site Setup").click()
        self.assertEqual(self.browser.url,
                         "http://nohost/plone/@@overview-controlpanel")

    def test_easyform_control_panel_checkbox(self):
        self.browser.open(self.portal_url + "/@@easyform-controlpanel")
        self.browser.getControl("Rich Text").selected = False
        self.browser.getControl("Save").click()
        registry = getUtility(IRegistry)
        self.assertNotIn(
            "plone.app.textfield.RichText",
            registry.records["easyform.allowedFields"].value,
        )
class EventFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

    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', 'Basic {0}:{1}'.format(
                SITE_OWNER_NAME,
                SITE_OWNER_PASSWORD,
            ))

    def test_add_event(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('Event').click()
        self.browser.getControl(
            name='form.widgets.IDublinCore.title').value = 'My event'
        self.browser.getControl(name='form.widgets.IDublinCore.description'
                                ).value = 'This is my event.'
        self.browser.getControl(
            name='form.widgets.IRichTextBehavior.text').value = 'Lorem Ipsum'
        self.browser.getControl(
            name='form.widgets.IEventBasic.start').value = '2013-01-01'
        self.browser.getControl(
            name='form.widgets.IEventBasic.end').value = '2013-01-12'
        self.browser.getControl(
            name='form.widgets.IShortName.id').value = 'my-special-event'
        self.browser.getControl('Save').click()

        self.assertTrue(self.browser.url.endswith('my-special-event/view'))
        self.assertIn('My event', self.browser.contents)
        self.assertIn('This is my event', self.browser.contents)
        self.assertIn('Lorem Ipsum', self.browser.contents)
        self.assertIn('2013-01-01', self.browser.contents)
        self.assertIn('2013-01-12', self.browser.contents)
Exemple #9
0
class FolderFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

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

    def test_add_folder(self):
        self.browser.open(self.portal_url)
        self.browser.getLink(url='http://nohost/plone/++add++Folder').click()
        widget = 'form.widgets.IDublinCore.title'
        self.browser.getControl(name=widget).value = 'My folder'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = ''
        widget = 'form.widgets.IDublinCore.description'
        self.browser.getControl(name=widget).value = 'This is my folder.'
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('my-folder/view'))
        self.assertTrue('My folder' in self.browser.contents)
        self.assertTrue('This is my folder' in self.browser.contents)

    def test_add_folder_with_shortname(self):
        self.browser.open(self.portal_url)
        self.browser.getLink(url='http://nohost/plone/++add++Folder').click()
        widget = 'form.widgets.IDublinCore.title'
        self.browser.getControl(name=widget).value = 'My folder'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = 'my-special-folder'
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('my-special-folder/view'))
Exemple #10
0
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 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)

        # Check that you can still add a user too.  This failed at some point:
        # https://github.com/plone/Products.CMFPlone/issues/3048
        # 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
        self.browser.getControl(
            'Add selected groups and users to this group').click()

        # Check that both group and user are now part of the group
        self.browser.open(self.groups_url)
        self.browser.getLink('Group 1 (group1)').click()
        self.assertIn('Autumn Brooks', self.browser.contents)
        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)
Exemple #12
0
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', f'Basic {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, ['div', 'a'])
        self.assertNotIn('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 MaintenanceControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the maintenance 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()
        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,)
        )

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

    def test_maintenance_control_panel_backlink(self):
        self.browser.open(
            "%s/@@maintenance-controlpanel" % self.portal_url)
        self.assertTrue("Advanced" in self.browser.contents)

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

    def test_maintenance_control_panel_raises_unauthorized(self):
        self.site_administrator_browser.open(
            self.portal_url + '/@@maintenance-controlpanel')
        self.assertTrue(
            'You are not allowed to manage the Zope server.'
            in self.site_administrator_browser.contents)

    def test_maintenance_pack_database(self):
        """While we cannot test the actual packaging during tests, we can skip
           the actual manage_pack method by providing a negative value for
           days.
        """
        self.browser.open(self.portal_url + '/@@maintenance-controlpanel')
        db = self.portal._p_jar.db()
        original_pack = db.pack

        def pack(self, t=None, days=0):
            pass
        db.pack = pack

        self.browser.getControl(name='form.widgets.days').value = '0'
        self.browser.getControl(name="form.buttons.pack").click()
        self.assertTrue(self.browser.url.endswith('maintenance-controlpanel'))
        self.assertTrue('Packed the database.' in self.browser.contents)
        db.pack = original_pack
Exemple #14
0
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 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 ImageFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

    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', 'Basic {0}:{1}'.format(
                SITE_OWNER_NAME,
                SITE_OWNER_PASSWORD,
            ))

    def test_add_image(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('Image').click()
        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My image'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my image.'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = 'my-special-image.jpg'
        image_path = os.path.join(os.path.dirname(__file__), 'image.jpg')
        image_ctl = self.browser.getControl(name='form.widgets.image')
        with io.FileIO(image_path, 'rb') as f:
            image_ctl.add_file(f, 'image/png', 'image.jpg')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('image.jpg/view'))
        self.assertIn('My image', self.browser.contents)
        self.assertIn('This is my image', self.browser.contents)
        self.assertIn('image.jpg', self.browser.contents)

    def test_add_image_with_shortname(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('Image').click()
        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My image'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = 'my-special-image.jpg'
        image_path = os.path.join(os.path.dirname(__file__), 'image.jpg')
        image_ctl = self.browser.getControl(name='form.widgets.image')
        with io.FileIO(image_path, 'rb') as f:
            image_ctl.add_file(f, 'image/png', 'image.jpg')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('my-special-image.jpg/view'))

    def test_image_view_fullscreen(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('Image').click()
        self.assertTrue('Title' in self.browser.contents)
        self.assertTrue('Description' in self.browser.contents)
        self.assertTrue('Text' in self.browser.contents)
        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My image'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my image.'
        image_path = os.path.join(os.path.dirname(__file__), 'image.jpg')
        image_ctl = self.browser.getControl(name='form.widgets.image')
        with io.FileIO(image_path, 'rb') as f:
            image_ctl.add_file(f, 'image/png', 'image.jpg')
        self.browser.getControl('Save').click()
        self.browser.getLink('Click to view full-size image').click()
        self.assertTrue(
            self.browser.url.endswith('image.jpg/image_view_fullscreen'))
        self.assertTrue('My image' in self.browser.contents)
        self.assertTrue('Back to site' in self.browser.contents)
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'))
Exemple #18
0
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 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 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', f'Basic {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 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/>'
        )
Exemple #22
0
class TestLoginHelpFunctional(unittest.TestCase):

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

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

    def test_login_help_request_password_reset(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Get help').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')

        member = api.user.get('test_user_1_')
        email = '*****@*****.**'
        member.setMemberProperties({'email': email})
        transaction.commit()
        # validaton error of empty required field
        self.browser.getControl(name='form.buttons.reset').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')

        self.browser.getControl(name='form.widgets.reset_password'
                                ).value = 'nonexistinguser'  # noqa: E501
        self.browser.getControl(name='form.buttons.reset').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')
        # message appears even though no email was sent
        self.assertIn(
            'An email has been sent with instructions on how to reset your password.',  # noqa: E501
            self.browser.contents)
        self.assertEqual(len(self.portal.MailHost.messages), 0)

        self.browser.getControl(
            name='form.widgets.reset_password').value = 'test_user_1_'
        self.browser.getControl(name='form.buttons.reset').click()
        self.assertIn(
            'An email has been sent with instructions on how to reset your password.',  # noqa: E501
            self.browser.contents)
        # message was actually sent
        self.assertEqual(len(self.portal.MailHost.messages), 1)

    def test_login_help_request_username(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Get help').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')

        member = api.user.get('test_user_1_')
        email = '*****@*****.**'
        member.setMemberProperties({'email': email})
        transaction.commit()

        # validaton error of empty required field
        self.browser.getControl(name='form.buttons.get_username').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')
        self.assertIn('missing', self.browser.contents)

        self.browser.getControl(
            name='form.widgets.recover_username').value = '*****@*****.**'
        self.browser.getControl(name='form.buttons.get_username').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/@@login-help')
        # email was sent
        self.assertIn('email has been sent with your username.',
                      self.browser.contents)
        self.assertEqual(len(self.portal.MailHost.messages), 1)
        message = self.portal.MailHost.messages[0]
        self.assertIn('To: [email protected]', message)
        self.assertIn('Your username is: test_user_1_', message)

        self.browser.getControl(
            name='form.widgets.recover_username').value = 'noemail'
        self.browser.getControl(name='form.buttons.get_username').click()
        self.assertIn('specified email is not valid.', self.browser.contents)
        # no new message was sent
        self.assertEqual(len(self.portal.MailHost.messages), 1)

        self.browser.getControl(
            name='form.widgets.recover_username').value = '*****@*****.**'
        self.browser.getControl(name='form.buttons.get_username').click()
        # no new message was sent
        self.assertIn(
            'email has been sent with your username.',
            self.browser.contents,
        )
        self.assertEqual(len(self.portal.MailHost.messages), 1)

        api.user.create(
            username='******',
            email='*****@*****.**',
            password='******',
            roles=('Member', ),
        )
        transaction.commit()
        self.browser.getControl(
            name='form.widgets.recover_username').value = '*****@*****.**'
        self.browser.getControl(name='form.buttons.get_username').click()
        # no new message was sent
        self.assertIn(
            'email has been sent with your username.',
            self.browser.contents,
        )
        self.assertEqual(len(self.portal.MailHost.messages), 1)

        api.user.create(
            username='******',
            email='*****@*****.**',
            password='******',
            roles=('Member', ),
        )
        transaction.commit()
        self.browser.getControl(
            name='form.widgets.recover_username').value = '*****@*****.**'
        self.browser.getControl(name='form.buttons.get_username').click()
        # a message was sent
        self.assertIn(
            'email has been sent with your username.',
            self.browser.contents,
        )
        self.assertEqual(len(self.portal.MailHost.messages), 2)
Exemple #23
0
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)
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 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 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 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 TestLoginLogout(unittest.TestCase):

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

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

    def test_login_with_bad_credentials(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = 'wrongpassword'
        self.browser.getControl('Log in').click()

        self.assertIn('Login failed', self.browser.contents)
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

    def test_login_with_correct_credentials(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl('Log in').click()

        self.assertIn('You are now logged in.', self.browser.contents)
        self.assertEqual(
            self.browser.url, 'http://nohost/plone',
            'Successful login did not redirect to the homepage '
            'when came_from was not defined.')

        # Now log out.
        self.browser.getLink('Log out').click()
        self.assertEqual(
            self.browser.url, 'http://nohost/plone',
            'Successful logout did not redirect to the homepage.')

        self.assertIn('You are now logged out.', self.browser.contents,
                      'Logout status message not displayed.')

    def test_login_with_user_defined_in_root_user_folder(self):
        """ A user defined in the root user folder should be able to log
            in into the site
        """
        self.layer['app'].acl_users.userFolderAddUser('rootuser', 'secret', [],
                                                      [])
        transaction.commit()
        self.browser.open('http://nohost/plone/login')
        self.browser.getControl('Login Name').value = 'rootuser'
        self.browser.getControl('Password').value = 'secret'
        self.browser.getControl('Log in').click()
        self.assertIn('You are now logged in', self.browser.contents)

    def test_not_logged_in_and_not_authorized_shows_login_form(self):
        self.browser.open('http://nohost/plone/@@overview-controlpanel')
        self.assertTrue(self.browser.getControl('Login Name'))

    def test_insufficient_privileges_returned_when_logged_in_but_not_authorized(
            self):  # noqa
        setRoles(self.layer['portal'], TEST_USER_ID, [])
        transaction.commit()
        self.browser.open('http://nohost/plone/login')
        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl('Log in').click()
        self.assertIn('You are now logged in', self.browser.contents)
        mt = self.layer['portal'].portal_membership
        member = mt.portal_membership.getAuthenticatedMember()
        self.assertNotIn('Manager',
                         member.getRolesInContext(self.layer['portal']))
        self.browser.open('http://nohost/plone/@@overview-controlpanel')
        self.assertIn('Insufficient Privileges', self.browser.contents)
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 FileFunctionalTest(unittest.TestCase):

    layer = PLONE_APP_CONTENTTYPES_FUNCTIONAL_TESTING

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

    def test_add_file(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('File').click()
        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My file'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my file.'
        file_path = os.path.join(os.path.dirname(__file__), 'image.jpg')
        file_ctl = self.browser.getControl(name='form.widgets.file')
        with io.FileIO(file_path, 'rb') as f:
            file_ctl.add_file(f, 'image/png', 'image.jpg')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('image.jpg/view'))
        self.assertTrue('My file' in self.browser.contents)
        self.assertTrue('This is my file' in self.browser.contents)

    def test_shortname_file(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('File').click()
        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My file'
        widget = 'form.widgets.IShortName.id'
        self.browser.getControl(name=widget).value = 'my-special-file'
        file_path = os.path.join(os.path.dirname(__file__), 'image.jpg')
        file_ctl = self.browser.getControl(name='form.widgets.file')
        with io.FileIO(file_path, 'rb') as f:
            file_ctl.add_file(f, 'image/png', 'image.jpg')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('my-special-file/view'))

    def test_mime_icon_pdf_for_file_(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('File').click()

        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My file'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my pdf file.'
        file_path = os.path.join(os.path.dirname(__file__), 'file.pdf')
        file_ctl = self.browser.getControl(name='form.widgets.file')
        with io.FileIO(file_path, 'rb') as f:
            file_ctl.add_file(f, 'application/pdf', 'file.pdf')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('file.pdf/view'))
        # check icon
        self.assertEqual(
            'http://nohost/plone/++plone++bootstrap-icons/file-earmark-richtext.svg',
            self._get_icon_url(self.portal["file.pdf"].file.contentType))

    def test_alternative_mime_icon_doc_for_file(self):
        mtr = self.portal.mimetypes_registry
        mime_doc = mtr.lookup('application/msword')[0]
        mime_doc.icon_path = 'custom.png'
        transaction.commit()
        self.browser.open(self.portal_url)
        self.browser.getLink('File').click()

        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My file'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my doc file.'
        file_path = os.path.join(os.path.dirname(__file__), 'file.doc')
        file_ctl = self.browser.getControl(name='form.widgets.file')
        with io.FileIO(file_path, 'rb') as f:
            file_ctl.add_file(f, 'application/msword', 'file.doc')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('file.doc/view'))
        # check icon
        self.assertEqual(
            'http://nohost/plone/++plone++bootstrap-icons/file-earmark-code.svg',
            self._get_icon_url(self.portal["file.doc"].file.contentType))

    def test_mime_icon_odt_for_file_(self):
        self.browser.open(self.portal_url)
        self.browser.getLink('File').click()

        widget = 'form.widgets.title'
        self.browser.getControl(name=widget).value = 'My file'
        widget = 'form.widgets.description'
        self.browser.getControl(name=widget).value = 'This is my odt file.'
        file_path = os.path.join(os.path.dirname(__file__), 'file.odt')
        file_ctl = self.browser.getControl(name='form.widgets.file')
        with io.FileIO(file_path, 'rb') as f:
            file_ctl.add_file(f, 'application/vnd.oasis.opendocument.text',
                              'file.odt')
        self.browser.getControl('Save').click()
        self.assertTrue(self.browser.url.endswith('file.odt/view'))
        # check icon
        self.assertEqual(
            'http://nohost/plone/++plone++bootstrap-icons/file-earmark-code.svg',
            self._get_icon_url(self.portal["file.odt"].file.contentType))

    def _get_icon_url(self, mime_type):
        return self.icons.url("mimetype-" + mime_type)
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 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!'
        )
Exemple #33
0
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 TestRedirectAfterLogin(unittest.TestCase):

    layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING

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

    def test_redirect_to_portal_if_no_adapter_nor_came_from(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl('Log in').click()

        self.assertIn('You are now logged in.', self.browser.contents)
        self.assertEqual(
            self.browser.url, 'http://nohost/plone',
            'Successful login did not redirect to the homepage '
            'when came_from was not defined.')

        # Now log out.
        self.browser.getLink('Log out').click()

        self.assertIn('You are now logged out.', self.browser.contents,
                      'Logout status message not displayed.')

    def test_redirect_to_came_from_if_no_adapter_found(self):
        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl(name='came_from').value = \
            'http://nohost/plone/contact-info'

        self.browser.getControl('Log in').click()

        self.assertIn('You are now logged in.', self.browser.contents)
        self.assertEqual(
            self.browser.url, 'http://nohost/plone/contact-info',
            'Successful login did not redirect to the came_from.')

        # Now log out.
        self.browser.getLink('Log out').click()

        self.assertIn('You are now logged out.', self.browser.contents,
                      'Logout status message not displayed.')

    def test_redirect_to_adapter_result(self):
        # Register our redirect adapter
        from zope.component import getGlobalSiteManager
        gsm = getGlobalSiteManager()
        gsm.registerAdapter(AfterLoginAdapter, (Interface, IRequest))

        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl(name='came_from').value = \
            'http://nohost/plone/contact-info'

        self.browser.getControl('Log in').click()

        gsm.unregisterAdapter(AfterLoginAdapter, (Interface, IRequest))

        self.assertIn('You are now logged in.', self.browser.contents)
        self.assertEqual(
            self.browser.url, 'http://nohost/plone/sitemap',
            'Successful login did not use the adapter for '
            'redirect.')

        # Now log out.
        self.browser.getLink('Log out').click()

        self.assertIn('You are now logged out.', self.browser.contents,
                      'Logout status message not displayed.')

    def test_initiallogin_adapter(self):
        # Register our redirect adapter
        from zope.component import getGlobalSiteManager
        gsm = getGlobalSiteManager()
        gsm.registerAdapter(InitialLoginAdapter, (Interface, IRequest))

        self.browser.open('http://nohost/plone/login')
        self.browser.getLink('Log in').click()
        self.assertEqual(self.browser.url, 'http://nohost/plone/login')

        self.browser.getControl('Login Name').value = TEST_USER_NAME
        self.browser.getControl('Password').value = TEST_USER_PASSWORD
        self.browser.getControl(name='came_from').value = \
            'http://nohost/plone/contact-info'

        self.browser.getControl('Log in').click()

        gsm.unregisterAdapter(InitialLoginAdapter, (Interface, IRequest))

        self.assertIn('You are now logged in.', self.browser.contents)
        self.assertEqual(self.browser.url, 'http://nohost/plone/contact-info')
        self.assertEqual(self.portal.foo, 'foo')

        # Now log out.
        self.browser.getLink('Log out').click()

        self.assertIn('You are now logged out.', self.browser.contents,
                      'Logout status message not displayed.')
class RedirectionControlPanelFunctionalTest(unittest.TestCase):
    """Test that changes in the redirection 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',
            f'Basic {SITE_OWNER_NAME}:{SITE_OWNER_PASSWORD}',
        )

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

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

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

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

    def test_redirection_controlpanel_add_redirect(self):
        storage = getUtility(IRedirectionStorage)
        redirection_path = '/alias-folder'
        target_path = '/test-folder'
        storage_path = '/plone/alias-folder'

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='redirection').value = redirection_path
        self.browser.getControl(name='target_path').value = target_path
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            storage.has_path(storage_path),
            f'Redirection storage should have path "{storage_path}"',
        )

    def test_redirection_controlpanel_remove_redirects(self):
        storage = getUtility(IRedirectionStorage)
        for i in range(31):
            storage[f'/plone/alias{i}'] = '/plone/test-folder'
        transaction.commit()

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        # A batch of 15 is shown, so some are missing.
        self.assertTrue('/plone/alias1' in self.browser.contents)
        self.assertTrue('/plone/alias10' in self.browser.contents)
        self.assertTrue('/plone/alias19' in self.browser.contents)
        self.assertTrue('/plone/alias2' in self.browser.contents)
        self.assertFalse('/plone/alias29' in self.browser.contents)
        # query aliases starting with /alias2
        self.browser.getControl(name='q').value = '/alias2'
        self.browser.getControl(name='form.button.filter').click()
        self.assertFalse('/plone/alias1' in self.browser.contents)
        self.assertTrue('/plone/alias2' in self.browser.contents)
        self.assertTrue('/plone/alias29' in self.browser.contents)
        # The filter could return one value too much.
        # This tests that we have excludemax=True in the RedirectionSet.
        self.assertFalse('/plone/alias3' in self.browser.contents)
        self.assertFalse('/plone/alias30' in self.browser.contents)
        # Remove two.
        self.browser.getControl(name='redirects:tuple').value = [
            '/plone/alias2',
            '/plone/alias20',
        ]
        self.browser.getControl(name='form.button.Remove').click()
        self.assertFalse('/plone/alias2' in storage)
        self.assertFalse('/plone/alias20' in storage)
        self.assertTrue('/plone/alias1' in storage)
        self.assertTrue('/plone/alias29' in storage)
        self.assertEqual(storage.get('/plone/alias29'), '/plone/test-folder')

    def test_redirection_controlpanel_remove_matching_redirects(self):
        storage = getUtility(IRedirectionStorage)
        for i in range(30):
            storage[f'/plone/alias{i}'] = '/plone/test-folder'
        transaction.commit()

        # Removing matching redirects can only happen when a filter is selected.
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='form.button.MatchRemove').click()
        self.assertTrue(
            'No alternative urls selected for removal.'
            in self.browser.contents
        )
        self.assertEqual(len(storage), 30)
        # query aliases starting with /alias2
        self.browser.getControl(name='q').value = '/alias2'
        # The filter is immediately taken into account,
        # without first explicitly clicking filter.
        # self.browser.getControl(name='form.button.filter').click()
        self.browser.getControl(name='form.button.MatchRemove').click()
        self.assertEqual(len(storage), 19)
        self.assertFalse('/plone/alias2' in storage)
        self.assertFalse('/plone/alias20' in storage)
        self.assertFalse('/plone/alias29' in storage)
        self.assertTrue('/plone/alias1' in storage)
        self.assertTrue('/plone/alias12' in storage)

    def test_redirection_controlpanel_set(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        now = DateTime('2022-02-03')
        for i in range(1000):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
                now=now,
            )
        redirects = RedirectionSet()
        self.assertEqual(len(redirects), 1000)
        self.assertDictEqual(
            redirects[0],
            {
                'datetime': DateTime('2022-02-03'),
                'manual': False,
                'path': '/foo/0',
                'redirect': f'{portal_path:s}/foo/0',
                'redirect-to': '/bar/0',
            },
        )
        self.assertDictEqual(
            redirects[999],
            {
                'datetime': DateTime('2022-02-03'),
                'manual': False,
                'path': '/foo/999',
                'redirect': f'{portal_path:s}/foo/999',
                'redirect-to': '/bar/999',
            },
        )
        self.assertEqual(len(list(iter(redirects))), 1000)
        self.assertDictEqual(
            list(iter(redirects))[0],
            {
                'datetime': DateTime('2022-02-03'),
                'manual': False,
                'path': '/foo/0',
                'redirect': f'{portal_path:s}/foo/0',
                'redirect-to': '/bar/0',
            },
        )

    def test_redirection_controlpanel_batching(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        for i in range(1000):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
            )
        view = getMultiAdapter(
            (self.layer['portal'], self.layer['request']),
            name='redirection-controlpanel',
        )
        # Test that view/redirects returns batch
        self.assertIsInstance(view.redirects(), Batch)

        # Test that view/batching returns batching with anchor in urls
        batching = view.batching()
        self.assertIn('?b_start:int=990#manage-existing-aliases', batching)

    def test_redirection_controlpanel_redirect_alias_exists(self):
        path_alias = '/alias'
        path_target = '/test-folder'
        storage_alias = f'/plone{path_alias}'
        storage_target = f'/plone{path_target}'
        storage = getUtility(IRedirectionStorage)
        storage.add(storage_alias, storage_target)
        transaction.commit()

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='redirection').value = path_alias
        self.browser.getControl(name='target_path').value = path_target
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            storage.get(storage_alias) == storage_target,
            f'{storage_target} not target of alternative url!',
        )
        self.assertTrue(
            'The provided alternative url already exists!'
            in self.browser.contents,
            'Message "alternative url already exists" not in page!',
        )

    def test_redirection_controlpanel_filtering(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        for i in range(1000):
            storage.add(
                '{:s}/foo1/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
            )
        for i in range(1000):
            storage.add(
                '{:s}/foo2/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
            )

        redirects = RedirectionSet()
        self.assertEqual(len(redirects), 2000)
        redirects = RedirectionSet(query='/foo')
        self.assertEqual(len(redirects), 2000)
        redirects = RedirectionSet(query='/foo1')
        self.assertEqual(len(redirects), 1000)
        redirects = RedirectionSet(query='/foo2')
        self.assertEqual(len(redirects), 1000)
        # this should return one and not two (we need excludemax=True)
        redirects = RedirectionSet(query='/foo1/777')
        self.assertEqual(len(redirects), 1)

        request = self.layer['request'].clone()
        request.form['q'] = '/foo'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(2000 / 15.0))

        request = self.layer['request'].clone()
        request.form['q'] = '/foo1'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(1000 / 15.0))

        request = self.layer['request'].clone()
        request.form['q'] = '/foo2'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(1000 / 15.0))

        request = self.layer['request'].clone()
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(2000 / 15.0))

        # Filtering without new request does not have effect because memoize
        request.form['q'] = '/foo2'
        self.assertEqual(view.redirects().numpages, math.ceil(2000 / 15.0))

    def test_redirection_controlpanel_filter_manual(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        for i in range(100):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
                manual=False,
            )
        for i in range(100, 300):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
                manual=True,
            )

        redirects = RedirectionSet()
        self.assertEqual(len(redirects), 300)
        # Form has yes, no, or empty string, anything else is ignored
        # (so treated as empty string).
        redirects = RedirectionSet(manual='yes')
        self.assertEqual(len(redirects), 200)
        redirects = RedirectionSet(manual='no')
        self.assertEqual(len(redirects), 100)
        redirects = RedirectionSet(manual='')
        self.assertEqual(len(redirects), 300)
        redirects = RedirectionSet(manual='badvalue')
        self.assertEqual(len(redirects), 300)

        request = self.layer['request'].clone()
        request.form['manual'] = ''
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(300 / 15.0))

        request = self.layer['request'].clone()
        request.form['manual'] = 'yes'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(200 / 15.0))

        request = self.layer['request'].clone()
        request.form['manual'] = 'no'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(100 / 15.0))

    def test_redirection_controlpanel_filter_date(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        time0 = DateTime('2001-01-01')
        for i in range(400):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
                now=time0 + i,
            )

        redirects = RedirectionSet()
        self.assertEqual(len(redirects), 400)
        # created can be anything that can be parsed by DateTime.
        # Otherwise it is ignored.
        self.assertEqual(len(RedirectionSet(created='2019-01-01')), 400)
        self.assertEqual(len(RedirectionSet(created='1999-01-01')), 0)
        self.assertEqual(len(RedirectionSet(created='2001-01-01')), 0)
        self.assertEqual(len(RedirectionSet(created='2001-01-02')), 1)
        self.assertEqual(len(RedirectionSet(created='2001-02-01')), 31)
        self.assertEqual(len(RedirectionSet(created='2001-02-01 00:00:00')), 31)
        self.assertEqual(len(RedirectionSet(created='2001-02-01 00:00:01')), 32)
        self.assertEqual(len(RedirectionSet(created='badvalue')), 400)

        # DateTime('2002-01-01') results in a timezone GMT+0
        self.assertEqual(len(RedirectionSet(created='2002-01-01')), 365)
        # DateTime('2002/01/01') results in a timezone GMT+1 for me,
        # or a different zone depending on where in the world you are.
        # So we need to be lenient in the tests.
        self.assertGreaterEqual(len(RedirectionSet(created='2002/01/01')), 364)
        self.assertLessEqual(len(RedirectionSet(created='2002/01/01')), 366)

        request = self.layer['request'].clone()
        request.form['datetime'] = ''
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(400 / 15.0))

        request = self.layer['request'].clone()
        request.form['datetime'] = '2001-01-27'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(27 / 15.0))

        request = self.layer['request'].clone()
        request.form['datetime'] = '2002-01-01'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(365 / 15.0))

        request = self.layer['request'].clone()
        request.form['datetime'] = '2019-01-01'
        view = getMultiAdapter(
            (self.layer['portal'], request), name='redirection-controlpanel'
        )
        self.assertEqual(view.redirects().numpages, math.ceil(400 / 15.0))

    def test_redirection_controlpanel_redirect_no_target(self):
        path_alias = '/alias'
        path_target = '/not-existing'

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='redirection').value = path_alias
        self.browser.getControl(name='target_path').value = path_target
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'The provided target object does not exist.'
            in self.browser.contents,
            'Message "target does not exist" not in page!',
        )

    def test_redirection_controlpanel_missing_slash_target(self):
        path_alias = '/alias'
        path_target = 'Members'

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='redirection').value = path_alias
        self.browser.getControl(name='target_path').value = path_target
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'Target path must start with a slash.' in self.browser.contents,
            'Errormessage for missing slash on target path missing',
        )

    def test_redirection_controlpanel_missing_slash_alias(self):
        path_alias = 'alias'
        path_target = '/Members'

        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='redirection').value = path_alias
        self.browser.getControl(name='target_path').value = path_target
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'Alternative url path must start with a slash.'
            in self.browser.contents,
            'Errormessage for missing slash on alternative url missing',
        )

    def test_manage_aliases_standard(self):
        storage = getUtility(IRedirectionStorage)
        folder = self.portal['test-folder']

        self.browser.open("%s/@@manage-aliases" % folder.absolute_url())
        self.browser.getControl(name='redirection').value = '/alias'
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'Alternative url added.' in self.browser.contents,
            'Message for added alternative url missing',
        )
        self.assertTrue(storage.has_path('/plone/alias'))
        self.assertEqual(storage.get('/plone/alias'), '/plone/test-folder')

    def test_manage_aliases_remove(self):
        storage = getUtility(IRedirectionStorage)
        folder = self.portal['test-folder']
        storage['/plone/alias1'] = '/plone/test-folder'
        storage['/plone/alias2'] = '/plone/test-folder'
        storage['/plone/alias3'] = '/plone/test-folder'
        transaction.commit()

        self.browser.open("%s/@@manage-aliases" % folder.absolute_url())
        self.browser.getControl(name='redirects:tuple').value = [
            '/plone/alias1',
            '/plone/alias2',
        ]
        self.browser.getControl(name='form.button.Remove').click()

        self.assertTrue(
            'Alternative urls removed.' in self.browser.contents,
            'Message for removed alternative url missing',
        )
        self.assertFalse('/plone/alias1' in storage)
        self.assertFalse('/plone/alias2' in storage)
        self.assertTrue('/plone/alias3' in storage)
        self.assertEqual(storage.get('/plone/alias3'), '/plone/test-folder')

    def test_manage_aliases_navigation_root(self):
        from zope.interface import alsoProvides
        from plone.app.layout.navigation.interfaces import INavigationRoot

        storage = getUtility(IRedirectionStorage)
        folder = self.portal['test-folder']
        alsoProvides(folder, INavigationRoot)
        transaction.commit()

        self.browser.open("%s/@@manage-aliases" % folder.absolute_url())
        self.browser.getControl(name='redirection').value = '/alias'
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'Alternative url added.' in self.browser.contents,
            'Message for added alternative url missing',
        )
        self.assertTrue(storage.has_path('/plone/test-folder/alias'))
        self.assertEqual(
            storage.get('/plone/test-folder/alias'), '/plone/test-folder'
        )

        # Add the navigation root path explicitly.
        self.browser.getControl(
            name='redirection'
        ).value = '/test-folder/alias2'
        self.browser.getControl(name='form.button.Add').click()

        self.assertTrue(
            'Alternative url added.' in self.browser.contents,
            'Message for added alternative url missing',
        )
        self.assertTrue(storage.has_path('/plone/test-folder/alias2'))
        self.assertEqual(
            storage.get('/plone/test-folder/alias2'), '/plone/test-folder'
        )

    def test_absolutize_path(self):
        # absolutize_path is a helper function that returns a tuple
        # of absolute path and error message.
        from Products.CMFPlone.controlpanel.browser.redirects import (
            absolutize_path as ap,
        )

        # A path is required.
        self.assertEqual(ap(''), ('', 'You have to enter an alternative url.'))
        self.assertEqual(
            ap('', is_source=False), ('', 'You have to enter a target.')
        )

        # relative paths are not accepted
        self.assertEqual(
            ap('foo'), ('foo', 'Alternative url path must start with a slash.')
        )
        self.assertEqual(
            ap('foo', is_source=True),
            ('foo', 'Alternative url path must start with a slash.'),
        )
        self.assertEqual(
            ap('foo', is_source=False),
            ('foo', 'Target path must start with a slash.'),
        )

        # absolute paths are good
        self.assertEqual(ap('/foo'), ('/plone/foo', None))
        self.assertEqual(ap('/foo', is_source=True), ('/plone/foo', None))

        # for targets, an object must exist on the path
        self.assertEqual(
            ap('/foo', is_source=False),
            ('/plone/foo', 'The provided target object does not exist.'),
        )
        self.assertEqual(
            ap('/test-folder', is_source=False), ('/plone/test-folder', None)
        )
        self.assertEqual(
            ap('/test-folder/@@sharing', is_source=False),
            ('/test-folder/@@sharing', 'Target path must not be a view.'),
        )

        # A source must not exist.
        self.assertEqual(
            ap('/test-folder'),
            (
                '/plone/test-folder',
                'Cannot use a working path as alternative url.',
            ),
        )
        # More general: a source must not be traversable already.
        self.assertEqual(
            ap('/view'),
            ('/plone/view', 'Cannot use a working path as alternative url.'),
        )
        self.assertEqual(
            ap('/@@overview-controlpanel'),
            (
                '/@@overview-controlpanel',
                'Alternative url path must not be a view.',
            ),
        )

        # And a source must not exist via (implicit) acquisition.
        # We might *want* to allow this, but such a redirect would not have effect,
        # because acquisition happens earlier.
        # See https://github.com/collective/Products.RedirectionTool/issues/12
        self.portal.invokeFactory('Document', 'doc')
        self.assertEqual(
            ap('/test-folder/doc'),
            (
                '/plone/test-folder/doc',
                'Cannot use a working path as alternative url.',
            ),
        )

        # A source must not already exist in the redirect list.
        storage = getUtility(IRedirectionStorage)
        portal_path = self.portal.absolute_url_path()
        storage.add(
            f'{portal_path:s}/foo',
            f'{portal_path:s}/test-folder',
        )
        self.assertEqual(
            ap('/foo', is_source=True),
            ('/plone/foo', 'The provided alternative url already exists!'),
        )

        # For targets, we now accept external urls.
        # Note that this can only be done on the control panel,
        # so by default only by Site Administrators or Managers.
        self.assertEqual(
            ap('https://example.org', is_source=False),
            ('https://example.org', None),
        )
        self.assertEqual(
            ap('http://example.org', is_source=False),
            ('http://example.org', None),
        )
        self.assertEqual(
            ap(
                'https://example.org/some/path?foo=bar&bar=foo',
                is_source=False,
            ),
            ('https://example.org/some/path?foo=bar&bar=foo', None),
        )
        self.assertEqual(
            ap('http://', is_source=False),
            ('http://', 'Target path must start with a slash.'),
        )
        # Using '//' to ignore http/https differences seems useless,
        # as we don't include content but only link to it.
        self.assertEqual(
            ap('//example.org', is_source=False),
            (
                '/plone//example.org',
                'The provided target object does not exist.',
            ),
        )

    def test_upload_two_columns(self):
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        # Note: the targets must exist as actual content.
        data = [
            (b'/old-home-page.asp', b'/test-folder'),
            (b'/people/JoeT', b'/Members'),
        ]
        csv = b'\n'.join([b','.join(d) for d in data])
        self.browser.getControl(name='file').add_file(
            io.BytesIO(csv), 'text/plain', 'redirects.csv'
        )
        self.browser.getControl(name='form.button.Upload').click()
        self.assertNotIn(
            'Please pick a file to upload.', self.browser.contents
        )
        self.assertNotIn(
            'No alternative urls were added.', self.browser.contents
        )
        self.assertNotIn('Please correct these errors', self.browser.contents)
        storage = getUtility(IRedirectionStorage)
        self.assertEqual(len(storage), 2)
        self.assertEqual(
            storage.get('/plone/old-home-page.asp'), '/plone/test-folder'
        )
        self.assertEqual(storage.get('/plone/people/JoeT'), '/plone/Members')
        # Test the internals.
        redirect = storage._paths['/plone/old-home-page.asp']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertIsInstance(redirect[1], DateTime)
        self.assertEqual(redirect[2], True)  # manual

    def test_upload_four_columns(self):
        # Two columns are the minimum,
        # but we can handle a third column with a datetime,
        # a fourth column with manual True/False,
        # and more columns that we ignore.
        now = DateTime()
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        # Note: the targets must exist as actual content.
        data = [
            # We can first have a header, which should be ignored.
            # Second one should have the same number of columns,
            # otherwise the delimiter detection can get it wrong.
            (b'old path', b'new path', b'datetime', b'manual'),
            # bad dates are silently ignored
            (b'/baddate', b'/test-folder', b'2006-13-62', b'yes'),
            # two columns:
            (b'/two', b'/test-folder'),
            # third column with date:
            (b'/three', b'/test-folder', b'2003-01-31'),
            # fourth column with manual:
            (
                b'/four',
                b'/test-folder',
                b'2004/01/27 10:00:00 GMT-3',
                b'False',
            ),
            # fifth column is ignored:
            (b'/five', b'/test-folder', b'2005-01-31', b'True', b'ignored'),
            # manual can be '0' (or anything starting with f/F/n/N/0)
            (b'/zero', b'/test-folder', b'2000-01-31', b'0'),
        ]
        csv = b'\n'.join([b','.join(d) for d in data])
        self.browser.getControl(name='file').add_file(
            io.BytesIO(csv), 'text/plain', 'redirects.csv'
        )
        self.browser.getControl(name='form.button.Upload').click()
        self.assertNotIn(
            'Please pick a file to upload.', self.browser.contents
        )
        self.assertNotIn(
            'No alternative urls were added.', self.browser.contents
        )
        self.assertNotIn('Please correct these errors', self.browser.contents)

        # All five lines have been added.
        storage = getUtility(IRedirectionStorage)
        self.assertEqual(len(storage), 6)
        self.assertEqual(storage.get('/plone/two'), '/plone/test-folder')
        old_paths = [
            '/plone/baddate',
            '/plone/five',
            '/plone/four',
            '/plone/three',
            '/plone/two',
            '/plone/zero',
        ]
        self.assertListEqual(sorted(list(storage)), old_paths)
        self.assertListEqual(
            sorted(list(storage.redirects('/plone/test-folder'))), old_paths
        )
        # Test the internals.

        # two columns:
        # (b'/two', b'/test-folder'),
        redirect = storage._paths['/plone/two']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertIsInstance(redirect[1], DateTime)
        self.assertGreater(redirect[1], now)
        self.assertEqual(redirect[2], True)  # manual

        # third column with date:
        # (b'/three', b'/test-folder', b'2003-01-31'),
        redirect = storage._paths['/plone/three']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertEqual(redirect[1], DateTime('2003-01-31'))
        self.assertEqual(redirect[2], True)

        # fourth column with manual:
        # (b'/four', b'/test-folder', b'2004/01/27 10:00:00 GMT-3', b'False'),
        redirect = storage._paths['/plone/four']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertEqual(redirect[1], DateTime('2004/01/27 10:00:00 GMT-3'))
        self.assertEqual(redirect[2], False)

        # fifth column is ignored:
        # (b'/five', b'/test-folder', b'2005-01-31', b'True', b'ignored'),
        redirect = storage._paths['/plone/five']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertEqual(redirect[1], DateTime('2005-01-31'))
        self.assertEqual(redirect[2], True)

        # manual can be '0' (or anything starting with f/F/n/N/0)
        # (b'/zero', b'/test-folder', b'2000-01-31', b'0'),
        redirect = storage._paths['/plone/zero']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertEqual(redirect[1], DateTime('2000-01-31'))
        self.assertEqual(redirect[2], False)

        # bad dates are silently ignored
        # (b'/baddate', b'/test-folder', b'2006-13-62', b'yes'),
        redirect = storage._paths['/plone/baddate']
        self.assertEqual(redirect[0], '/plone/test-folder')
        self.assertGreater(redirect[1], now)
        self.assertEqual(redirect[2], True)

    def test_upload_bad(self):
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        # The targets must exist as actual content.
        # We try a good one and one that does not exist.
        data = [
            (b'/old-home-page.asp', b'/test-folder'),
            (b'/people/JoeT', b'/no-such-content'),
        ]
        csv = b'\n'.join([b','.join(d) for d in data])
        self.browser.getControl(name='file').add_file(
            io.BytesIO(csv), 'text/plain', 'redirects.csv'
        )
        self.browser.getControl(name='form.button.Upload').click()
        self.assertNotIn(
            'Please pick a file to upload.', self.browser.contents
        )
        self.assertIn('No alternative urls were added.', self.browser.contents)
        self.assertIn('Please correct these errors', self.browser.contents)
        storage = getUtility(IRedirectionStorage)
        self.assertEqual(len(storage), 0)

    def test_download_empty(self):
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='form.button.Download').click()
        self.assertEqual(
            self.browser.headers['Content-Disposition'],
            'attachment; filename=redirects.csv',
        )
        contents = self.browser.contents.splitlines()
        self.assertEqual(len(contents), 1)
        self.assertEqual(contents[0], 'old path,new path,datetime,manual')

    def test_download_bigger(self):
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        now = DateTime('2019/01/27 10:00:00 GMT-3')
        for i in range(2000):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                '{:s}/bar/{:s}'.format(portal_path, str(i)),
                now=now,
                manual=True,
            )
        transaction.commit()
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='form.button.Download').click()
        self.assertEqual(
            self.browser.headers['Content-Disposition'],
            'attachment; filename=redirects.csv',
        )
        contents = self.browser.contents.splitlines()
        # pop the header
        self.assertEqual(contents.pop(0), 'old path,new path,datetime,manual')
        self.assertEqual(len(contents), 2000)
        # The order is probably the alphabetical order of the old path,
        # but that is not important and may change,
        # so let's sort it in the tests for good measure.
        # Note that '999' sorts alphabetically after '1999'.
        contents.sort()
        self.assertEqual(
            contents[0], '/foo/0,/bar/0,2019/01/27 10:00:00 GMT-3,True'
        )
        self.assertEqual(
            contents[1999], '/foo/999,/bar/999,2019/01/27 10:00:00 GMT-3,True'
        )

    def test_download_upload(self):
        # Test uploading a download and downloading an upload.

        # 1. Manually add some redirects.
        storage = getUtility(IRedirectionStorage)
        portal_path = self.layer['portal'].absolute_url_path()
        now = DateTime('2019/01/27 10:00:00 GMT-3')
        for i in range(10):
            storage.add(
                '{:s}/foo/{:s}'.format(portal_path, str(i)),
                f'{portal_path:s}/test-folder',
                now=now,
                manual=True,
            )
        transaction.commit()

        # 2. Download the redirects.
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='form.button.Download').click()
        self.assertEqual(
            self.browser.headers['Content-Disposition'],
            'attachment; filename=redirects.csv',
        )
        downloaded_contents = self.browser.contents
        contents = downloaded_contents.splitlines()
        self.assertEqual(contents.pop(0), 'old path,new path,datetime,manual')
        self.assertEqual(len(contents), 10)
        contents.sort()
        self.assertEqual(
            contents[0], '/foo/0,/test-folder,2019/01/27 10:00:00 GMT-3,True'
        )

        # 3. clear the redirect storage
        storage.clear()
        transaction.commit()
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='form.button.Download').click()
        contents = self.browser.contents.splitlines()
        self.assertEqual(len(contents), 1)
        self.assertEqual(contents[0], 'old path,new path,datetime,manual')

        # 4. upload the original download
        self.browser.open("%s/@@redirection-controlpanel" % self.portal_url)
        self.browser.getControl(name='file').add_file(
            io.BytesIO(safe_bytes(downloaded_contents)),
            'text/plain',
            'redirects.csv',
        )
        self.browser.getControl(name='form.button.Upload').click()
        self.assertNotIn(
            'Please pick a file to upload.', self.browser.contents
        )
        self.assertNotIn(
            'The provided target object does not exist.', self.browser.contents
        )
        self.assertNotIn(
            'No alternative urls were added.', self.browser.contents
        )
        self.assertNotIn('Please correct these errors', self.browser.contents)
        self.assertEqual(len(storage), 10)

        # 5. download the upload
        self.browser.getControl(name='form.button.Download').click()
        new_downloaded_contents = self.browser.contents
        contents = downloaded_contents.splitlines()
        self.assertEqual(contents.pop(0), 'old path,new path,datetime,manual')
        self.assertEqual(len(contents), 10)
        contents.sort()
        self.assertEqual(
            contents[0], '/foo/0,/test-folder,2019/01/27 10:00:00 GMT-3,True'
        )
        # and it is actually the same as the original download
        self.assertEqual(new_downloaded_contents, downloaded_contents)
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', f'Basic {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,
                        '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,
            '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,
            'There should be a warning for unconfigured mailhost!')
class SiteControlPanelFunctionalTest(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()
        self.browser = Browser(self.app)
        self.browser.handleErrors = False
        self.browser.addHeader(
            'Authorization', 'Basic %s:%s' % (
                SITE_OWNER_NAME,
                SITE_OWNER_PASSWORD,
            ))

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

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

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

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

    def test_site_title_is_stored_in_registry(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"My Site"
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISiteSchema, prefix="plone")
        self.assertEqual(settings.site_title, u"My Site")

    def test_site_title_can_be_looked_up_by_plone_portal_state(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"My Site"
        self.browser.getControl('Save').click()

        portal_state = getMultiAdapter((self.portal, self.request),
                                       name=u'plone_portal_state')
        self.assertEqual(portal_state.portal_title(), u'My Site')

    @unittest.skip("XXX: TODO! We have to patch CMFDefault for this.")
    def test_site_title_can_be_looked_up_by_portal_title(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"My Site"
        self.browser.getControl('Save').click()

        self.assertEqual(self.portal.title, u'My Site')
        self.assertEqual(self.portal.Title(), u'My Site')

    def test_site_logo_is_stored_in_registry(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        ctrl = self.browser.getControl(name="form.widgets.site_logo")
        ctrl.add_file(BytesIO(SITE_LOGO_HEX), 'image/png', 'pixel.png')
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISiteSchema, prefix='plone')
        self.assertEqual(settings.site_logo, SITE_LOGO_BASE64)

    def test_exposeDCMetaTags(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl('Expose Dublin Core metadata').selected = True
        self.browser.getControl('Save').click()

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

    def test_exposeDCMetaTags_exposes_meta_tags(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl('Expose Dublin Core metadata').selected = True
        self.browser.getControl('Save').click()

        self.browser.open(self.portal_url)

        self.assertTrue('DC.type' in self.browser.contents)

    def test_enable_sitemap(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl('Expose sitemap.xml.gz').selected = True
        self.browser.getControl('Save').click()

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

    def test_enable_sitemap_enables_the_sitemap(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl('Expose sitemap.xml.gz').selected = True
        self.browser.getControl('Save').click()

        self.browser.open("%s/sitemap.xml.gz" % self.portal_url)

        self.assertEqual(self.browser.headers['status'].lower(), '200 ok')
        self.assertEqual(self.browser.headers['content-type'],
                         'application/octet-stream')

    def test_webstats_js(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl(name='form.widgets.webstats_js').value = \
            u"<script>a=1</script>"
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISiteSchema, prefix="plone")
        self.assertEqual(settings.webstats_js, u"<script>a=1</script>")

    def test_webstat_js_shows_up_on_site(self):
        self.browser.open("%s/@@site-controlpanel" % self.portal_url)
        self.browser.getControl('Site title').value = u"Plone Site"
        self.browser.getControl(name='form.widgets.webstats_js').value = \
            u"<script>a=1</script>"
        self.browser.getControl('Save').click()

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISiteSchema, prefix="plone")
        self.assertEqual(settings.webstats_js, u"<script>a=1</script>")
        self.browser.open(self.portal_url)

        self.assertTrue("<script>a=1</script>" in self.browser.contents)
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)