def test_requests_are_redirected_when_not_no_navroot(self, browser):
        """When configured, TinyMCE makes requests to theming.css relative to
        the current context.
        In order to reuse existing caches, we simply redirect all requests of
        theming.css on non-navroot contexts to their navroot versions, adding
        a cachkey param when necessary.
        """
        self.grant('Manager')
        self._set_debug_mode(False)
        folder = create(Builder('folder'))
        page = create(Builder('page').within(folder))

        browser.open(page, view='theming.css')
        self.assertRegexpMatches(
            browser.url,
            r'^{}'.format(
                re.escape('http://nohost/plone/theming.css?cachekey=')))

        alsoProvides(folder, INavigationRoot)
        transaction.commit()
        browser.open(page, view='theming.css')
        self.assertRegexpMatches(
            browser.url,
            r'^{}'.format(
                re.escape('http://nohost/plone/folder/theming.css?cachekey=')))
示例#2
0
    def test_expect_http_error_raises_when_no_error_happens(self, browser):
        with self.assertRaises(AssertionError) as cm:
            with browser.expect_http_error():
                browser.open()

        self.assertEquals('Expected a HTTP error but it didn\'t occur.',
                          str(cm.exception))
示例#3
0
    def test_expect_http_error_and_assert_incorrect_status_code(self, browser):
        with self.assertRaises(AssertionError) as cm:
            with browser.expect_http_error(code=400):
                browser.open(view='no-such-view')

        self.assertEquals('Expected HTTP error with status code 400, got 404.',
                          str(cm.exception))
    def test_editing_mail_with_a_real_name_as_author_dont_change_author_name(self, browser):
        self.login(self.regular_user, browser)
        browser.open(self.mail_eml, view='edit')
        browser.fill({'Author': u'Muster Peter'})
        browser.click_on('Save')

        self.assertEquals('Muster Peter', self.mail_eml.document_author)
    def test_renders_when_parent_not_accessible(self, browser):
        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(['Folder'],
                                      'simple_publication_workflow')

        create(Builder('navigation portlet').having(currentFolderOnly=False))
        parent = create(Builder('folder').titled('Parent'))
        create(
            Builder('folder').titled('Top Sibling').within(parent).in_state(
                'published')).reindexObject()
        child = create(
            Builder('folder').titled('Child').within(parent).in_state(
                'published'))
        sibling = create(
            Builder('folder').titled('Bottom Sibling').within(parent).in_state(
                'published'))
        sibling.reindexObject()
        create(
            Builder('folder').titled('Child of sibling').within(
                sibling).in_state('published')).reindexObject()
        transaction.commit()

        browser.open(child)
        self.assertEquals('Parent', portlet().css('.parent').first.text)
        self.assertEquals('Child', portlet().css('.current').first.text)
        self.assertEquals(['Top Sibling', 'Bottom Sibling'],
                          portlet().css('.sibling').text)
示例#6
0
    def test_title_is_cropped(self, browser):
        self.grant('Manager')
        create(Builder('news').titled(u'A' * 150).within(
            create(Builder('news folder'))))

        browser.open(self.portal, view='mopage.news.xml')
        self.assert_news_in_browser(['A' * 95 + ' ...'])
示例#7
0
    def test_expect_http_error(self, browser):
        class GetRecordById(BrowserView):
            def __call__(self):
                raise BadRequest('Missing "id" parameter.')

        with register_view(GetRecordById, 'get-record-by-id'):
            with browser.expect_http_error():
                browser.open(view='get-record-by-id')
示例#8
0
 def test_raises_insufficient_privileges_for_anonymous(self, browser):
     """When an anonymous user accesses a protected content, Plone will
     redirect to a "require_login" script, rendering a login form.
     By default, the ftw.testbrowser should raise an InsufficientPrivileges
     exception in this case.
     """
     with self.assertRaises(InsufficientPrivileges):
         browser.open(view='plone_control_panel')
示例#9
0
    def test_expect_http_error_and_assert_incorrect_status_reason(self, browser):
        with self.assertRaises(AssertionError) as cm:
            with browser.expect_http_error(reason='Bad Request'):
                browser.open(view='no-such-view')

        self.assertEquals(
            'Expected HTTP error with status \'Bad Request\', got \'Not Found\'.',
            str(cm.exception))
示例#10
0
def visit(specification_title):
    browser.login(SITE_OWNER_NAME)
    browser.open(view='lawgiver-list-specs')
    specs = browser.css('dl.specifications').first
    link = specs.find(specification_title)
    assert link, 'Spec {!r} not found in {!r}'.format(specification_title,
                                                      specs.terms)
    link.click()
示例#11
0
def visit_api(obj):
    browser.login(SITE_OWNER_NAME)
    browser.open(obj,
                 view='sharing',
                 headers={
                     'Accept': 'application/json',
                     'Content-Type': 'application/json',
                 })
示例#12
0
def visit(specification_title):
    browser.login(SITE_OWNER_NAME)
    browser.open(view='lawgiver-list-specs')
    specs = browser.css('dl.specifications').first
    link = specs.find(specification_title)
    assert link, 'Spec {!r} not found in {!r}'.format(
        specification_title, specs.terms)
    link.click()
    def test_editing_mail_with_a_userid_as_author_resolves_to_fullname(self, browser):
        self.login(self.regular_user, browser)
        browser.open(self.mail_eml, view='edit')
        browser.fill({'Author': u'kathi.barfuss'})
        browser.click_on('Save')

        self.assertEquals(u'B\xe4rfuss K\xe4thi', self.mail_eml.document_author)
        self.assertEquals(u'B\xe4rfuss K\xe4thi', obj2brain(self.mail_eml).document_author)
示例#14
0
    def test_export_all_events_on_site(self, browser):
        self.grant('Manager')
        create(Builder('event page').titled(u'One').within(
            create(Builder('event folder').titled(u'Event Folder One'))))
        create(Builder('event page').titled(u'Two').within(
            create(Builder('event folder').titled(u'Event Folder Two'))))

        browser.open(self.portal, view='mopage.events.xml')
        self.assert_events_in_browser(['One', 'Two'])
    def test_caching_active_when_debugmode_disabled(self, browser):
        self._set_debug_mode(False)
        browser.open()
        theming_css_url = self.get_css_url('http://nohost/plone/theming.css')
        self.assertIn('?cachekey=', theming_css_url, 'Missing cachekey param.')

        browser.open(theming_css_url)
        self.assertEquals('public, max-age=31536000',
                          browser.headers['Cache-Control'],
                          'Cache headers should be set.')
示例#16
0
 def assert_mopage_export(self, asset_name, export_context):
     expected = self.asset(asset_name)
     browser.open(export_context, view='mopage.news.xml')
     got = browser.contents
     # replace dynamic scale image urls for having static test results:
     got = re.sub(r'\/@@images/[a-z0-9-]{36}.jpeg', '/image.jpg', got)
     # remove trailing spaces:
     got = re.sub(r' +$', '', got, flags=re.M)
     self.maxDiff = None
     self.assert_xml(expected, got)
示例#17
0
    def test_export_all_news_on_site(self, browser):
        self.grant('Manager')
        with freeze(datetime(2015, 10, 1)) as clock:
            create(Builder('news').titled(u'One').within(
                create(Builder('news folder').titled(u'News Folder One'))))
            clock.forward(days=1)
            create(Builder('news').titled(u'Two').within(
                create(Builder('news folder').titled(u'News Folder Two'))))

        browser.open(self.portal, view='mopage.news.xml')
        self.assert_news_in_browser(['Two', 'One'])
示例#18
0
    def test_expect_unauthorized_failing_when_anonymous(self, browser):
        with self.assertRaises(AssertionError) as cm:
            with browser.expect_unauthorized():
                browser.open()

        self.assertIn(str(cm.exception), [
            # Requests (OK)
            'Expected request to be unauthorized, but got: 200 OK at {}'.format(
                self.portal.absolute_url()),
            # Mechanize (Ok)
            'Expected request to be unauthorized, but got: 200 Ok at {}'.format(
                self.portal.absolute_url())])
def fetch_players(team):
    print '-> Fetch players of', team['Nation']
    browser.open(team['Link'])
    table = browser.css('#content-core table.listing').first
    for row in table.css('tbody tr'):
        link = row.css('td a').first.attrib.get('href')
        player_id = int(link.split('/')[-1])

        player = row.dict()
        player['Marktwert'] = int(player['Marktwert'].replace("'", ""))
        player['ID'] = player_id
        player['Link'] = link
        yield player
示例#20
0
def fetch_players(team):
    print "-> Fetch players of", team["Nation"]
    browser.open(team["Link"])
    table = browser.css("#content-core table.listing").first
    for row in table.css("tbody tr"):
        link = row.css("td a").first.attrib.get("href")
        player_id = int(link.split("/")[-1])

        player = row.dict()
        player["Marktwert"] = int(player["Marktwert"].replace("'", ""))
        player["ID"] = player_id
        player["Link"] = link
        yield player
示例#21
0
    def test_raises_404_as_client_error(self, browser):
        with self.assertRaises(HTTPClientError) as cm:
            browser.open(view='missing')

        self.assertEquals(404, cm.exception.status_code)
        self.assertEquals('Not Found', cm.exception.status_reason)
        self.assertEquals('404 Not Found', str(cm.exception))

        with self.assertRaises(HTTPClientError):
            browser.reload()

        browser.raise_http_errors = False
        browser.reload()
    def test_caching_active_on_navroot_when_debugmode_disabled(self, browser):
        self._set_debug_mode(False)
        self.grant('Manager')
        navroot = create(Builder('folder')
                         .titled(u'NavRoot')
                         .providing(INavigationRoot))
        browser.open(navroot)
        theming_css_url = self.get_css_url('http://nohost/plone/navroot/theming.css')
        self.assertIn('?cachekey=', theming_css_url, 'Missing cachekey param.')

        browser.open(theming_css_url)
        self.assertEquals('public, max-age=31536000',
                          browser.headers['Cache-Control'],
                          'Cache headers should be set.')
    def selftest(self):
        with browser:
            self.testserverctl('zodb_setup')
            with browser.expect_unauthorized():
                browser.open(self.plone_url)

            browser.fill({'Benutzername': SITE_OWNER_NAME,
                          'Passwort': SITE_OWNER_PASSWORD}).submit()

            browser.replace_request_header('Accept', 'application/json')
            browser.replace_request_header('Content-Type', 'application/json')

            data = {'@type': 'opengever.dossier.businesscasedossier',
                    'title': u'Gesch\xe4ftsdossier',
                    'responsible': 'kathi.barfuss'}
            browser.open(self.plone_url + 'ordnungssystem/rechnungspruefungskommission',
                         method='POST',
                         data=json.dumps(data))
            dossier_url = browser.json['@id']

            browser.open(dossier_url)
            self.assertDictContainsSubset(
                {u'title': u'Gesch\xe4ftsdossier',
                 u'modified': u'2018-11-22T14:29:33+00:00',
                 u'UID': u'testserversession000000000000001',
                 u'email': u'*****@*****.**'},
                browser.json)

            self.testserverctl('zodb_teardown')
            self.testserverctl('zodb_setup')

            with browser.expect_http_error(404):
                browser.open(dossier_url)

            self.testserverctl('zodb_teardown')
示例#24
0
    def test_cloning_copies_cookies(self, browser):
        browser.open(view='login_form').fill(
            {'Login Name': TEST_USER_NAME,
             'Password': TEST_USER_PASSWORD}).submit()
        self.assertTrue(plone.logged_in())

        with browser.clone() as subbrowser:
            subbrowser.open()
            self.assertTrue(plone.logged_in(subbrowser))
            subbrowser.find('Log out').click()
            self.assertFalse(plone.logged_in(subbrowser))

        browser.reload()
        self.assertTrue(plone.logged_in())
 def make_dropzone_upload(context, file_):
     """The dropzone JS makes a multipart upload with the the file as field named "file".
     The testbrowser does not support making multipart requests directly (we would have to
     create the MIME body ourself), but the form filling does that well.
     Therefore we use an HTML form for uploading.
     """
     html = (
         '<form action="{}/@@dropzone-upload" method="post" enctype="multipart/form-data">'
         '  <input type="file" name="file" />'
         '  <input type="hidden" name="_authenticator" value="{}" />'
         '  <input type="submit" />'
         '</form>').format(context.absolute_url(), createToken())
     defaultbrowser.open(context).parse(html)
     defaultbrowser.fill({'file': file_}).submit()
     return defaultbrowser
    def test_cachekey_refreshes_when_navroot_changes(self, browser):
        self._set_debug_mode(False)
        self.grant('Manager')
        navroot = create(Builder('folder')
                         .titled(u'Folder')
                         .providing(INavigationRoot))

        browser.open(navroot)
        css_base_url = 'http://nohost/plone/folder/theming.css'
        self.assert_css_url_present(css_base_url)
        theming_css_url = self.get_css_url(css_base_url)

        navroot.reindexObject()  # updates modified date
        transaction.commit()
        browser.reload()
        self.assertNotEqual(theming_css_url, self.get_css_url(css_base_url),
                            'Cachekey should be refreshed when navroot changes.')
示例#27
0
    def test_cachekey_refreshes_when_navroot_changes(self, browser):
        with freeze(datetime(2015, 1, 2, 3, 4)) as clock:
            self.portal_css.setDebugMode(False)
            self.grant('Manager')
            navroot = create(Builder('folder')
                             .titled('Folder')
                             .providing(INavigationRoot))

            browser.open(navroot)
            css_base_url = 'http://nohost/plone/folder/theming.css'
            self.assert_css_url_present(css_base_url)
            theming_css_url = self.get_css_url(css_base_url)

            clock.forward(hours=1)
            navroot.reindexObject()  # updates modified date
            transaction.commit()
            browser.reload()
            self.assertNotEqual(theming_css_url, self.get_css_url(css_base_url),
                                'Cachekey should be refreshed when navroot changes.')
    def test_cachekey_changes_when_dynamic_resource_cachekey_changes(self, browser):
        resource = DynamicSCSSResource('foo', cachekey='foo')
        getUtility(ISCSSRegistry).add_resource(resource)

        self._set_debug_mode(False)
        browser.open()
        theming_css_url = self.get_css_url('http://nohost/plone/theming.css')
        self.assertIn('?cachekey=', theming_css_url, 'Missing cachekey param.')

        browser.reload()
        self.assertEqual(theming_css_url,
                         self.get_css_url('http://nohost/plone/theming.css'),
                         'URL (cachekey?) did unexpectedly change.')

        resource.cachekey = 'bar'

        browser.reload()
        self.assertNotEqual(theming_css_url,
                            self.get_css_url('http://nohost/plone/theming.css'),
                            'Cachekey should have changed.')
示例#29
0
    def test_raises_500_as_server_error(self, browser):
        class ViewWithError(BrowserView):
            def __call__(self):
                raise ValueError('The value is wrong.')

        with register_view(ViewWithError, 'view-with-error'):
            with capture_streams(stderr=StringIO()):
                with self.assertRaises(HTTPServerError) as cm:
                    browser.open(view='view-with-error')

            self.assertEquals(500, cm.exception.status_code)
            self.assertEquals('Internal Server Error', cm.exception.status_reason)

            with capture_streams(stderr=StringIO()):
                with self.assertRaises(HTTPServerError):
                    browser.reload()

            browser.raise_http_errors = False
            with capture_streams(stderr=StringIO()):
                browser.reload()
    def test_renders_when_parent_not_accessible(self, browser):
        wftool = getToolByName(self.portal, 'portal_workflow')
        wftool.setChainForPortalTypes(['Folder'], 'simple_publication_workflow')

        create(Builder('navigation portlet').having(currentFolderOnly=False))
        parent = create(Builder('folder').titled('Parent'))
        create(Builder('folder').titled('Top Sibling')
               .within(parent).in_state('published')).reindexObject()
        child = create(Builder('folder').titled('Child')
                       .within(parent).in_state('published'))
        sibling = create(Builder('folder').titled('Bottom Sibling')
                         .within(parent).in_state('published'))
        sibling.reindexObject()
        create(Builder('folder').titled('Child of sibling')
               .within(sibling).in_state('published')).reindexObject()
        transaction.commit()

        browser.open(child)
        self.assertEquals('Parent', portlet().css('.parent').first.text)
        self.assertEquals('Child', portlet().css('.current').first.text)
        self.assertEquals(['Top Sibling', 'Bottom Sibling'],
                          portlet().css('.sibling').text)
示例#31
0
def fetch_teams():
    print "-> Fetch teams into", TEAMS_PATH
    teams = {}

    with browser:
        browser.open("https://emgame2016.4teamwork.ch/nationen-spieler")
        table = browser.css("#content-core table.listing").first
        for row in table.css("tbody tr"):
            link = row.css("td a").first.attrib.get("href")
            team_id = int(link.split("/")[-1])

            team = row.dict()
            team["Link"] = link
            team["ID"] = team_id
            team["FIFA Rang"] = int(team["FIFA Rang"])
            team["players"] = list(fetch_players(team))
            teams[team_id] = team

    teams = recursive_encode(teams)

    with open(TEAMS_PATH, "w+") as file_:
        json.dump(teams, file_, sort_keys=True, indent=4, ensure_ascii=False, encoding="utf-8")
def fetch_teams():
    print '-> Fetch teams into', TEAMS_PATH
    teams = {}

    with browser:
        browser.open('https://emgame2016.4teamwork.ch/nationen-spieler')
        table = browser.css('#content-core table.listing').first
        for row in table.css('tbody tr'):
            link = row.css('td a').first.attrib.get('href')
            team_id = int(link.split('/')[-1])

            team = row.dict()
            team['Link'] = link
            team['ID'] = team_id
            team['FIFA Rang'] = int(team['FIFA Rang'])
            team['players'] = list(fetch_players(team))
            teams[team_id] = team

    teams = recursive_encode(teams)

    with open(TEAMS_PATH, 'w+') as file_:
        json.dump(teams, file_, sort_keys=True, indent=4,
                  ensure_ascii=False, encoding='utf-8')
示例#33
0
    def test_include_root_arguments_when_submitted_as_GET_param(self, browser):
        self.grant('Manager')
        create(Builder('news').within(create(Builder('news folder'))))

        with freeze(datetime(2016, 8, 9, 21, 45)):
            browser.open(self.portal, view='mopage.news.xml',
                         data={'partner': 'Partner',
                               'partnerid': '123',
                               'passwort': 's3c>r3t',
                               'importid': '456',
                               'vaterobjekt': 'xy',
                               'unkown_key': 'should not appear'})

        self.assertEquals(
            {
                'export_time': '2016-08-09 22:45:00',
                'partner': 'Partner',
                'partnerid': '123',
                'passwort': 's3c>r3t',
                'importid': '456',
                'vaterobjekt': 'xy',
            },
            browser.css('import').first.attrib)
示例#34
0
    def test_toc_depth_config(self, browser):
        book = create(Builder('book').titled('The Book'))
        chapter = create(Builder('chapter')
                         .titled('First Chapter')
                         .within(book))
        subchapter = create(Builder('chapter')
                            .titled('The SubChapter')
                            .within(chapter))
        create(Builder('chapter')
               .titled('The SubSubChapter')
               .within(subchapter))

        browser.login().visit(book)

        # view shows all subchapters by default
        self.assertEquals(
            ['The Book', '1 First Chapter',
                '1.1 The SubChapter', '1.1.1 The SubSubChapter'],
            [e.text for e in browser.css('#content-core .navTreeItem a')])

        # limit depth to 1 subchapter
        browser.open(book, view='edit')
        browser.fill({'Table of contents depth': '1'}).submit()

        self.assertEquals(
            ['The Book', '1 First Chapter'],
            [e.text for e in browser.css('#content-core .navTreeItem a')])

        # limit depth to 2 subchapter
        browser.open(book, view='edit')
        browser.fill({'Table of contents depth': '2'}).submit()

        self.assertEquals(
            ['The Book', '1 First Chapter', '1.1 The SubChapter'],
            [e.text for e in browser.css('#content-core .navTreeItem a')])

        # empty depth means no limit
        browser.open(book, view='edit')
        browser.fill({'Table of contents depth': ''}).submit()

        self.assertEquals(
            ['The Book', '1 First Chapter',
                '1.1 The SubChapter', '1.1.1 The SubSubChapter'],
            [e.text for e in browser.css('#content-core .navTreeItem a')])
    def test_default_pages_are_not_listed(self, browser):
        create(Builder('navigation portlet'))
        homepage = create(Builder('page').titled('Homepage'))
        self.portal._setProperty('default_page', homepage.getId(), 'string')
        homepage.reindexObject()
        other = create(Builder('page').titled('Other page'))

        browser.open(self.portal)
        self.assertFalse(portlet().css('.parent'))
        self.assertEquals('Homepage', portlet().css('.current').first.text)
        self.assertEquals(['Other page'], portlet().css('.sibling').text)

        browser.open(homepage)
        self.assertFalse(portlet().css('.parent'))
        self.assertEquals('Homepage', portlet().css('.current').first.text)
        self.assertEquals(['Other page'], portlet().css('.sibling').text)

        browser.open(other)
        self.assertEquals('Homepage', portlet().css('.parent').first.text)
        self.assertEquals('Other page', portlet().css('.current').first.text)
        self.assertEquals([], portlet().css('.sibling').text)
 def test_no_viewlet_by_default(self, browser):
     browser.open()
     self.assertEquals(None, statusmessage(),
                       'Expected no default status message.')
示例#37
0
def visit(obj):
    browser.login(SITE_OWNER_NAME)
    browser.open(obj, view='sharing')