コード例 #1
0
    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))
コード例 #4
0
    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)
コード例 #5
0
    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
ファイル: test_mopage.py プロジェクト: 4teamwork/ftw.news
    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()
コード例 #13
0
    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'])
コード例 #15
0
    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
ファイル: test_mopage.py プロジェクト: 4teamwork/ftw.news
 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
ファイル: test_mopage.py プロジェクト: 4teamwork/ftw.news
    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())])
コード例 #19
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
コード例 #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()
コード例 #22
0
    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.')
コード例 #23
0
    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())
コード例 #25
0
 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
コード例 #26
0
    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.')
コード例 #28
0
    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()
コード例 #30
0
    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")
コード例 #32
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')
コード例 #33
0
ファイル: test_mopage.py プロジェクト: 4teamwork/ftw.news
    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
ファイル: test_toc_view.py プロジェクト: wilken311/ftw.book
    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')])
コード例 #35
0
    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)
コード例 #36
0
 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')