def afterSetUp(self): self.userId = 'fred' self.password = '******' self.portal.acl_users.userFolderAddUser(self.userId, self.password, ['Manager'], []) self.browser = Browser() self._log_in()
def getBrowser(self, loggedIn=True): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: auth = 'Basic %s' % self.getCredentials() browser.addHeader('Authorization', auth) return browser
def getBrowser(self, loggedIn=True): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: auth = u'Basic {0}'.format(self.getCredentials()) browser.addHeader('Authorization', auth) return browser
def getBrowser(self, loggedIn=True): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: user = default_user pwd = default_password browser.addHeader("Authorization", "Basic %s:%s" % (user, pwd)) return browser
def test_handle_errors_true_redirect(self): self.folder._setObject('redirect', RedirectStub()) browser = Browser() with self.assertRaises(HTTPError): browser.open('http://localhost/test_folder_1_/redirect') self.assertTrue(browser.headers['status'].startswith('404')) self.assertEqual(browser.url, 'http://localhost/redirected')
def getBrowser(self, loggedIn=False): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: user = PloneTestCase.default_user pwd = PloneTestCase.default_password browser.addHeader('Authorization', 'Basic %s:%s' % (user, pwd)) return browser
def test_raise_http_errors_false_redirect(self): self.folder._setObject('redirect', RedirectStub()) browser = Browser() browser.raiseHttpErrors = False browser.open('http://localhost/test_folder_1_/redirect') self.assertTrue(browser.headers['status'].startswith('404')) self.assertEqual(browser.url, 'http://localhost/redirected')
def test_handle_errors_false_redirect(self): self.folder._setObject('redirect', RedirectStub()) browser = Browser() browser.handleErrors = False with self.assertRaises(NotFound): browser.open('http://localhost/test_folder_1_/redirect') self.assertTrue(browser.contents is None)
def getBrowser(self, loggedIn=True): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: user = ptc.default_user pwd = ptc.default_password browser.addHeader('Authorization', 'Basic %s:%s' % (user, pwd)) return browser
def test_handle_errors_false(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() browser.handleErrors = False # Even errors which can be handled by Zope go to the client: with self.assertRaises(NotFound): browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.contents is None)
def setUp(self): super(TestPublishTraverse, self).setUp() zcml.load_config("configure.zcml", Products.Five) zcml.load_config('pages.zcml', package=Products.Five.browser.tests) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addSimpleContent(self.folder, 'testoid', 'x') self.browser = Browser() self.browser.login('manager', 'manager_pass')
def getBrowser(self, logged_in=False): """ instantiate and return a testbrowser for convenience """ browser = Browser() if logged_in: # Add an authorization header using the given or default # credentials """ browser.addHeader( 'Authorization', 'Basic %s:%s' % (PloneTestCase.portal_owner, PloneTestCase.default_password)) return browser
def test_headers_camel_case(self): # The Zope2 response mungs headers so they come out # in camel case. We should do the same. self.folder._setObject('stub', CookieStub()) browser = Browser() browser.open('http://localhost/test_folder_1_/stub') header_text = str(browser.headers) self.assertTrue('Content-Length: ' in header_text) self.assertTrue('Content-Type: ' in header_text)
def getBrowser(self, logged_in=False): """ instantiate and return a testbrowser for convenience """ browser = Browser() if logged_in: # Add an authorization header using the given or default # credentials """ browser.addHeader('Authorization', 'Basic %s:%s' % ( PloneTestCase.portal_owner, PloneTestCase.default_password)) return browser
def test_auth(self): # Based on Testing.ZopeTestCase.testFunctional basic_auth = '%s:%s' % (user_name, user_password) self.folder.addDTMLDocument('secret_html', file='secret') self.folder.secret_html.manage_permission(view, ['Owner']) path = '/' + self.folder.absolute_url(1) + '/secret_html' # Test direct publishing response = self.publish(path + '/secret_html') self.assertEqual(response.getStatus(), 401) response = self.publish(path + '/secret_html', basic_auth) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), b'secret') # Test browser url = 'http://localhost' + path browser = Browser() browser.raiseHttpErrors = False browser.open(url) self.assertTrue(browser.headers['status'].startswith('401')) browser.login(user_name, user_password) browser.open(url) self.assertTrue(browser.headers['status'].startswith('200')) self.assertEqual(browser.contents, 'secret')
def test_cookies(self): # We want to make sure that our testbrowser correctly # understands cookies. self.folder._setObject('stub', CookieStub()) # Test direct publishing response = self.publish('/test_folder_1_/stub') self.assertEqual(response.getCookie('evil')['value'], 'cookie') browser = Browser() browser.open('http://localhost/test_folder_1_/stub') self.assertEqual(browser.cookies.get('evil'), '"cookie"')
def test_handle_errors_true(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() # An error which cannot be handled by Zope is propagated to the client: with self.assertRaises(ValueError): browser.open('http://localhost/test_folder_1_/stub') self.assertIsNone(browser.contents) # Handled errors become an instance of `HTTPError`: with self.assertRaises(HTTPError): browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.headers['status'].startswith('404'))
def setUp(self): from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate super().setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPageTemplate(self.app, 'page_template') self.browser = Browser() self.browser.login('manager', 'manager_pass') self.browser.open('http://localhost/page_template/manage_main')
def test_auth(self): # Based on Testing.ZopeTestCase.testFunctional basic_auth = '%s:%s' % (user_name, user_password) self.folder.addDTMLDocument('secret_html', file='secret') self.folder.secret_html.manage_permission(view, ['Owner']) path = '/' + self.folder.absolute_url(1) + '/secret_html' # Test direct publishing response = self.publish(path + '/secret_html') self.assertEqual(response.getStatus(), 401) response = self.publish(path + '/secret_html', basic_auth) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), b'secret') # Test browser url = 'http://localhost' + path browser = Browser() browser.raiseHttpErrors = False browser.open(url) self.assertTrue(browser.headers['status'].startswith('401')) browser.addHeader('Authorization', 'Basic ' + basic_auth) browser.open(url) self.assertTrue(browser.headers['status'].startswith('200')) self.assertEqual(browser.contents, 'secret')
def afterSetUp(self): """Add some extra content and do some setup. """ # We need to do this as Manager: self.setRoles(['Manager']) # Add some news items: sample_text = "<p>Have I got news for <em>you</em>!</p>" self.portal.news.invokeFactory( 'News Item', 'first', title="First News", text=sample_text) self.portal.news.invokeFactory( 'News Item', 'second', title="Second News", text=sample_text) # Set fullname and email address of test user: member = self.portal.portal_membership.getAuthenticatedMember() member.setMemberProperties({'fullname': 'Test User', 'email': '*****@*****.**'}) # Add extra members: self.addMember('maurits', 'Maurits van Rees', '*****@*****.**') self.addMember('reinout', 'Reinout van Rees', '*****@*****.**') # Setup test browser: try: from Testing.testbrowser import Browser Browser # pyflakes except ImportError: from Products.Five.testbrowser import Browser self.browser = Browser() self.browser.handleErrors = False self.browser.addHeader('Accept-Language', 'en-US') self.portal.error_log._ignored_exceptions = () # No more Manager: self.setRoles([])
def setUp(self): from Products.PythonScripts.PythonScript import manage_addPythonScript super(PythonScriptBrowserTests, self).setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPythonScript(self.app, 'py_script') self.browser = Browser() self.browser.addHeader( 'Authorization', 'basic {}'.format( codecs.encode( # noqa: P101 b'manager:manager_pass', 'base64').decode())) self.browser.open('http://localhost/py_script/manage_main')
def setUp(self): """\ Sets up the environment that the workspace doctest needs. """ DocTestCase.setUp(self) from Testing.testbrowser import Browser from Products.PloneTestCase.setup import default_user, default_password from pmr2.app.settings.interfaces import IPMR2GlobalSettings # point the physical root for repo_root to the tmpdir. self.pmr2 = zope.component.getUtility(IPMR2GlobalSettings) self.pmr2.repo_root = self.tmpdir # user workspace _createObjectByType('Folder', self.portal, id='w') self.pmr2.user_workspace_subpath = u'w' self.pmr2.create_user_workspace = True # set up test browser with default user logged in. b = Browser() portal_url = self.portal.absolute_url() b.open(portal_url + '/login') b.getControl(name='__ac_name').value = default_user b.getControl(name='__ac_password').value = default_password b.getControl(name='submit').click() self.testbrowser = b
def test_bc_navigationroot(self): makeContent(self.portal.folder1, portal_type="Document", id="page1") page = self.portal.folder1.page1 browser = Browser() data = {"fieldName": "relatedItems", "fieldRealName": "relatedItems", "at_url": page.absolute_url(1)} basic = "%s:%s" % (portal_owner, default_password) browser.addHeader("Authorization", "Basic %s" % basic) browser.open("%s/refbrowser_popup?%s" % (page.absolute_url(), urlencode(data))) self.assertTrue( ( '<a class="browsesite" href="http://nohost/plone/refbrowser_popup?' "fieldName=relatedItems&fieldRealName=relatedItems" '&at_url=plone/folder1/page1" rel="Home"> ' "<span>Home</span> </a>" ) in normalize(browser.contents) ) # now let's change the navigation root zope.interface.alsoProvides(self.portal.folder1, INavigationRoot) browser.open("%s/refbrowser_popup?%s" % (page.absolute_url(), urlencode(data))) self.assertTrue( ( '<a class="browsesite" href="http://nohost/plone/folder1/refbrowser_popup?' "fieldName=relatedItems&fieldRealName=relatedItems" '&at_url=plone/folder1/page1" rel="Home"> ' "<span>Home</span> </a>" ) in normalize(browser.contents) )
def test_bc_navigationroot(self): makeContent(self.portal.folder1, portal_type='Document', id='page1') page = self.portal.folder1.page1 browser = Browser() data = { 'fieldName': 'relatedItems', 'fieldRealName': 'relatedItems', 'at_url': page.absolute_url(1)} basic = '%s:%s' % (portal_owner, default_password) browser.addHeader('Authorization', 'Basic %s' % basic) browser.open('%s/refbrowser_popup?%s' % (page.absolute_url(), urlencode(data))) self.assertTrue(('<a class="browsesite" href="http://nohost/plone/refbrowser_popup?' 'fieldName=relatedItems&fieldRealName=relatedItems' '&at_url=plone/folder1/page1" rel="Home"> ' '<span>Home</span> </a>') in normalize(browser.contents)) # now let's change the navigation root zope.interface.alsoProvides(self.portal.folder1, INavigationRoot) browser.open('%s/refbrowser_popup?%s' % (page.absolute_url(), urlencode(data))) self.assertTrue(('<a class="browsesite" href="http://nohost/plone/folder1/refbrowser_popup?' 'fieldName=relatedItems&fieldRealName=relatedItems' '&at_url=plone/folder1/page1" rel="Home"> ' '<span>Home</span> </a>') in normalize(browser.contents))
def getBrowser(self, loggedIn=False, admin=False): """ instantiate and return a testbrowser for convenience """ browser = Browser() if loggedIn: u = PloneTestCase.default_user p = PloneTestCase.default_password browser.open(self.portal.absolute_url() + "/login_form") browser.getControl(name='__ac_name').value = u browser.getControl(name='__ac_password').value = p browser.getControl(name='submit').click() return browser
def afterSetUp(self): super(JsonClientTestCase, self).afterSetUp() register_layer(IPMR2JsonClientTestLayer, 'pmr2.jsonclient.tests') request = TestRequest() # Ensure that the most basic scope managers are being used. cmf = factory(ConsumerManager) tmf = factory(TokenManager) smf = factory(MockScopeManager) zope.component.provideAdapter(cmf, ( IAnnotatable, IPMR2JsonClientTestLayer, ), IConsumerManager) zope.component.provideAdapter(tmf, ( IAnnotatable, IPMR2JsonClientTestLayer, ), ITokenManager) zope.component.provideAdapter(smf, ( IAnnotatable, IPMR2JsonClientTestLayer, ), IScopeManager) # assuming none of these are overridden. self.consumer = Consumer('test.example.com', 'consumer-secret', u'PMR2 Test JSON Client', None) cm = zope.component.getMultiAdapter((self.portal, request), IConsumerManager) cm.add(self.consumer) token = Token('pmr2token', 'token-secret') token.access = True token.consumer_key = self.consumer.key token.user = default_user self.token = token tm = zope.component.getMultiAdapter((self.portal, request), ITokenManager) tm.add(self.token) # XXX especially this one. sm = zope.component.getMultiAdapter((self.portal, request), IScopeManager) sm.permitted = '^.*$' # permit everything. b = Browser() portal_url = self.portal.absolute_url() b.open(portal_url + '/login') b.getControl(name='__ac_name').value = default_user b.getControl(name='__ac_password').value = default_password b.getControl(name='submit').click() self.user_browser = b
def afterSetUp(self): super(TestCase, self).afterSetUp() self.browser = Browser() self.portal.acl_users._doAddUser('admin', 'secret', ['Manager'], []) self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost('MailHost') self.membership = self.portal.portal_membership sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost)
def afterSetUp(self): """Add some extra content and do some setup. """ # We need to do this as Manager: self.setRoles(['Manager']) # Add some news items: sample_text = "<p>Have I got news for <em>you</em>!</p>" self.portal.news.invokeFactory('News Item', 'first', title="First News", text=sample_text) self.portal.news.invokeFactory('News Item', 'second', title="Second News", text=sample_text) # Set fullname and email address of test user: member = self.portal.portal_membership.getAuthenticatedMember() member.setMemberProperties({ 'fullname': 'Test User', 'email': '*****@*****.**' }) # Add extra members: self.addMember('maurits', 'Maurits van Rees', '*****@*****.**') self.addMember('reinout', 'Reinout van Rees', '*****@*****.**') # Setup test browser: try: from Testing.testbrowser import Browser Browser # pyflakes except ImportError: from Products.Five.testbrowser import Browser self.browser = Browser() self.browser.handleErrors = False self.browser.addHeader('Accept-Language', 'en-US') self.portal.error_log._ignored_exceptions = () # No more Manager: self.setRoles([])
def test_handle_errors_false_HTTPExceptionHandler_in_app(self): """HTTPExceptionHandler does not handle errors if requested via WSGI. This is needed when HTTPExceptionHandler is part of the WSGI pipeline. """ class WSGITestAppWithHTTPExceptionHandler(object): """Minimized testbrowser.WSGITestApp with HTTPExceptionHandler.""" def __call__(self, environ, start_response): publish = HTTPExceptionHandler(publish_module) wsgi_result = publish(environ, start_response) return wsgi_result self.folder._setObject('stub', ExceptionStub()) transaction.commit() browser = Browser(wsgi_app=WSGITestAppWithHTTPExceptionHandler()) browser.handleErrors = False with self.assertRaises(ValueError): browser.open('http://localhost/test_folder_1_/stub') self.assertIsNone(browser.contents)
def test_raise_http_errors_false(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() browser.raiseHttpErrors = False browser.open('http://localhost/test_folder_1_/stub') self.assertTrue(browser.headers['status'].startswith('500')) browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.headers['status'].startswith('404'))
def test_neither_raise_nor_handle_errors(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() browser.handleErrors = False browser.raiseHttpErrors = False # Custom exceptions get through with self.assertRaises(ValueError): browser.open('http://localhost/test_folder_1_/stub') self.assertTrue(browser.contents is None) # HTTPException subclasses are handled browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.headers['status'].startswith('404'))
def test_handle_errors_false(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() browser.handleErrors = False with self.assertRaises(ValueError): browser.open('http://localhost/test_folder_1_/stub') self.assertTrue(browser.contents is None) with self.assertRaises(NotFound): browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.contents is None)
def install_products(self): self.browser = Browser() fiveconfigure.debug_mode = True zcml.load_config('configure.zcml', collective.sendaspdf) zcml.load_config('tests.zcml', collective.sendaspdf) ztc.installPackage(collective.sendaspdf) self.addProfile('collective.sendaspdf:default') self.addProfile('collective.sendaspdf:tests') self.addProduct('collective.sendaspdf')
def setUp(self): from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate super(ZPTBrowserTests, self).setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPageTemplate(self.app, 'page_template') self.browser = Browser() self.browser.login('manager', 'manager_pass') self.browser.open('http://localhost/page_template/manage_main')
def test_raise_http_errors_false(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() browser.raiseHttpErrors = False # Internal server errors are still raised: with self.assertRaises(ValueError): browser.open('http://localhost/test_folder_1_/stub') self.assertIsNone(browser.contents) # But errors handled by Zope do not create an exception: browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.headers['status'].startswith('404'))
class TestControlPanel(base.FunctionalTestCase): def afterSetUp(self): super(TestControlPanel, self).afterSetUp() self.browser = Browser() def test_extended_form(self): portal_url = self.portal.absolute_url() self.browser.addHeader('Authorization', 'Basic %s:%s' % (portal_owner, default_password)) self.browser.open('%s/@@collectivegeo-controlpanel' % portal_url) widget = None try: widget = self.browser.getControl( name='form.widgets.geo_content_types.to') or False except: self.fail( 'geo_content_types widget not Found in controlpanel form') if widget: geo_content_types = geo_settings(self.portal).geo_content_types self.assertEqual(widget.options, geo_content_types)
def test_handle_errors_true(self): self.folder._setObject('stub', ExceptionStub()) browser = Browser() with self.assertRaises(HTTPError): browser.open('http://localhost/test_folder_1_/stub') self.assertTrue(browser.headers['status'].startswith('500')) with self.assertRaises(HTTPError): browser.open('http://localhost/nothing-is-here') self.assertTrue(browser.headers['status'].startswith('404'))
def setUp(self): from Products.PythonScripts.PythonScript import manage_addPythonScript super(PythonScriptBrowserTests, self).setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPythonScript(self.app, 'py_script') self.browser = Browser() self.browser.addHeader( 'Authorization', 'basic {}'.format(codecs.encode( # NOQA: flake8: P101 b'manager:manager_pass', 'base64').decode())) self.browser.open('http://localhost/py_script/manage_main')
class TestCase(ptc.PloneTestCase): browser = Browser() def login_as_user(self, username, password): self.browser.open('http://nohost/plone/logout') self.browser.open('http://nohost/plone/login_form') self.browser.getControl(name='__ac_name').value = username self.browser.getControl(name='__ac_password').value = password self.browser.getControl(name='submit').click() def login_as_manager(self): self.login_as_user(ptc.portal_owner, ptc.default_password) def register_user(self, data): self.browser.open('http://nohost/plone/logout') self.browser.open('http://nohost/plone/') self.browser.getLink('Register').click() data['password_confirm'] = data['password'] for key, value in data.items(): try: self.browser.getControl(name=key).value = value except LookupError: if key == 'password_confirm': # In Plone 4, password confirm is called password_ctl self.browser.getControl( name='form.password_ctl').value = value else: # Plone 4, inputs are called 'form.xxx' self.browser.getControl(name='form.%s' % key).value = value try: self.browser.getControl(name='form.button.Register').click() except LookupError: self.browser.getControl(name='form.actions.register').click() class layer(PloneSite): @classmethod def setUp(cls): fiveconfigure.debug_mode = True ztc.installPackage(zest.cachetuning) fiveconfigure.debug_mode = False @classmethod def tearDown(cls): pass
def afterSetUp(self): ptc.FunctionalTestCase.afterSetUp(self) self.browser = Browser() self.browser.handleErrors = False # Don't get HTTP 500 pages self.login_portal = self.app.login_portal # logins go here self.another_portal = self.app.another_portal # another portal # The extra portals do not get a member setup from the base class. # Add our user to the other portals to simulate an ldap environment. for portal in (self.login_portal, self.another_portal): portal.acl_users.userFolderAddUser(ptc.default_user, ptc.default_password, ['Member'], []) # Configure the login portal to allow logins from our sites. self.login_portal.portal_properties.site_properties._updateProperty( 'allow_external_login_sites', [ self.portal.absolute_url(), self.another_portal.absolute_url(), ]) # Configure our sites to use the login portal for logins and logouts login_portal_url = self.login_portal.absolute_url() for portal in (self.portal, self.another_portal): site_properties = portal.portal_properties.site_properties site_properties._updateProperty('external_login_url', login_portal_url + '/login') site_properties._updateProperty('external_logout_url', login_portal_url + '/logout') # Configure all sites to use a shared secret and set cookies per path # (normally they would have different domains.) for portal in (self.portal, self.login_portal, self.another_portal): session = portal.acl_users.session session._shared_secret = 'secret' session.path = portal.absolute_url_path() # Turn on self-registration self.portal.manage_permission('Add portal member', roles=['Manager', 'Anonymous'], acquire=0)
def afterSetUp(self): super(JsonClientTestCase, self).afterSetUp() register_layer(IPMR2JsonClientTestLayer, "pmr2.jsonclient.tests") request = TestRequest() # Ensure that the most basic scope managers are being used. cmf = factory(ConsumerManager) tmf = factory(TokenManager) smf = factory(MockScopeManager) zope.component.provideAdapter(cmf, (IAnnotatable, IPMR2JsonClientTestLayer), IConsumerManager) zope.component.provideAdapter(tmf, (IAnnotatable, IPMR2JsonClientTestLayer), ITokenManager) zope.component.provideAdapter(smf, (IAnnotatable, IPMR2JsonClientTestLayer), IScopeManager) # assuming none of these are overridden. self.consumer = Consumer("test.example.com", "consumer-secret", u"PMR2 Test JSON Client", None) cm = zope.component.getMultiAdapter((self.portal, request), IConsumerManager) cm.add(self.consumer) token = Token("pmr2token", "token-secret") token.access = True token.consumer_key = self.consumer.key token.user = default_user self.token = token tm = zope.component.getMultiAdapter((self.portal, request), ITokenManager) tm.add(self.token) # XXX especially this one. sm = zope.component.getMultiAdapter((self.portal, request), IScopeManager) sm.permitted = "^.*$" # permit everything. b = Browser() portal_url = self.portal.absolute_url() b.open(portal_url + "/login") b.getControl(name="__ac_name").value = default_user b.getControl(name="__ac_password").value = default_password b.getControl(name="submit").click() self.user_browser = b
class ZPTBrowserTests(FunctionalTestCase): """Browser testing ZopePageTemplate""" def setUp(self): from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate super(ZPTBrowserTests, self).setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPageTemplate(self.app, 'page_template') self.browser = Browser() self.browser.login('manager', 'manager_pass') self.browser.open('http://localhost/page_template/manage_main') def test_pt_upload__no_file(self): """It renders an error message if no file is uploaded.""" self.browser.getControl('Upload File').click() self.assertIn('No file specified', self.browser.contents)
class PythonScriptBrowserTests(FunctionalTestCase): """Browser testing Python Scripts""" def setUp(self): from Products.PythonScripts.PythonScript import manage_addPythonScript super(PythonScriptBrowserTests, self).setUp() Zope2.App.zcml.load_site(force=True) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addPythonScript(self.app, 'py_script') self.browser = Browser() self.browser.addHeader( 'Authorization', 'basic {}'.format(codecs.encode( # NOQA: flake8: P101 b'manager:manager_pass', 'base64').decode())) self.browser.open('http://localhost/py_script/manage_main') def test_ZPythonScriptHTML_upload__no_file(self): """It renders an error message if no file is uploaded.""" self.browser.getControl('Upload File').click() self.assertIn('No file specified', self.browser.contents)
class TestPublishTraverse(Testing.ZopeTestCase.FunctionalTestCase): def setUp(self): super(TestPublishTraverse, self).setUp() zcml.load_config("configure.zcml", Products.Five) zcml.load_config('pages.zcml', package=Products.Five.browser.tests) uf = self.app.acl_users uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], []) manage_addSimpleContent(self.folder, 'testoid', 'x') self.browser = Browser() self.browser.login('manager', 'manager_pass') def tearDown(self): zope.component.testing.tearDown() super(TestPublishTraverse, self).tearDown() def test_publishTraverse_to_allowed_name(self): # The ``eagle.method`` view has a method ``eagle`` that is registered # with ``allowed_attributes`` in pages.zcml. This attribute should be # reachable through ``publishTraverse`` on the view. folder = self.folder view = folder.unrestrictedTraverse('testoid/eagle.method') # Publishing traversal with the default adapter should work: from ZPublisher.BaseRequest import DefaultPublishTraverse request = folder.REQUEST adapter = DefaultPublishTraverse(view, request) result = adapter.publishTraverse(request, 'eagle')() self.assertIn('The eagle has landed', result) # Publishing via browser works, too: self.browser.open( 'http://localhost/test_folder_1_/testoid/eagle.method/eagle') self.assertEqual('The eagle has landed', self.browser.contents) def test_publishTraverse_to_not_allowed_name(self): # The ``eagle.method`` view has a method ``mouse`` but it is not # registered with ``allowed_attributes`` in pages.zcml. This attribute # should be not be accessible. It leads to a HTTP-404, so we do not # tell the world about our internal methods: with self.assertRaises(HTTPError) as err: self.browser.open( 'http://localhost/test_folder_1_/testoid/eagle.method/mouse') self.assertEqual('HTTP Error 404: Not Found', str(err.exception)) def test_publishTraverse_to_allowed_interface(self): # The ``cheeseburger`` view has a method ``meat`` that is # registered via ``allowed_interface`` in pages.zcml. This attribute # should be reachable through ``publishTraverse`` on the view. folder = self.folder view = folder.unrestrictedTraverse('testoid/cheeseburger') # Publishing traversal with the default adapter should work: from ZPublisher.BaseRequest import DefaultPublishTraverse request = folder.REQUEST adapter = DefaultPublishTraverse(view, request) result = adapter.publishTraverse(request, 'meat')() self.assertIn('yummi', result) # Publishing via browser works, too: self.browser.open( 'http://localhost/test_folder_1_/testoid/cheeseburger/meat') self.assertEqual('yummi', self.browser.contents) def test_publishTraverse_to_not_allowed_interface(self): # The ``cheeseburger`` view has a method ``cheese`` but it is not # registered via ``allowed_interface`` in pages.zcml. This attribute # should be not be accessible. It leads to a HTTP-404, so we do not # tell the world about our internal methods: with self.assertRaises(HTTPError) as err: self.browser.open( 'http://localhost/test_folder_1_/testoid/cheeseburger/cheese') self.assertEqual('HTTP Error 404: Not Found', str(err.exception))
class SendAsPDFTestCase(ptc.FunctionalTestCase): is_plone_3 = is_plone_3 # We'll use those pages taken from Wikipedia pages about Plone # to create some pages in the system. # We chose English for its lack of accented characters, French # because it mixes normal and accented characters and Japanese # for the use of non-Latin characters. # (my apologies to Japanese people if I make the text sound weird # by cutting it at 80 characters, I don't really have a clue about # what the text means). data = {'en': """ <p>Plone is a free and open source content management system built on top of the Zope application server. In principle, Plone can be used for any kind of website, including blogs, internet sites, webshops and internal websites. It is also well positioned to be used as a document publishing system and groupware collaboration tool. The strengths of Plone are its flexible and adaptable workflow, very good security, extensibility, high usability and flexibility.</p> <p>Plone is released under the GNU General Public License (GPL) and is designed to be extensible. Major development is conducted periodically during special meetings called Plone Sprints. Additional functionality is added to Plone with Products, which may be distributed through the Plone website or otherwise. The Plone Foundation holds and enforces all copyrights and trademarks. Plone also has legal backing from the council of the Software Freedom Law Center.</p> <p>MediaWiki's "Monobook" layout is based partially on the Plone style sheets. High-profile public sector users include the Federal Bureau of Investigation, Brazilian Government, United Nations, City of Bern (Switzerland), New South Wales Government (Australia), and European Environment Agency.""", 'fr': """ <p>Plone est un système de gestion de contenu Web libre publié selon les termes de la GNU GPL. Il est construit au-dessus du serveur d'applications Zope et de son extension CMF (Content Management Framework).</p> <p>Plone est entièrement objet et modulaire. Il permet de créer et gérer les aspects d'un site web, comme les utilisateurs, les « workflows » ou les documents attachables.</p> <p>Le fait que Plone soit programmé sur Zope fait qu'il est moins utilisé que d'autres systèmes de gestion de contenu, Zope étant connu pour sa courbe d'apprentissage assez lente (le fameux ZopeZen). Toutefois, Plone est considéré comme étant l'un des meilleurs CMS open-source existants, et est utilisé entre autres par le site web de la FSF, la Fondation pour le logiciel libre.</p> """, 'jp': """ <p>PloneはZopeアプリケーションサーバ上に構築されたフリーかつオープンなコ ンテンツマネジメントシステムである。基本的にPloneは、ブログ、インターネットサイト 、ウェブショップや組織内のWebサイトといったどのような用途にも利用できる。さらに文 書管理システムやグループウェアといった共有ツールとしても利用できるようになっている 。Ploneの強みは、その柔軟で適応性のあるワークフロー、非常に優れたセキュリティ、拡張性 、高いユーザビリティと柔軟性である</p> <p>PloneはGNU General Public License(GPL)ライセンスでリリースされており 、拡張し易いように設計されている。主な開発は、定期的に開催される Plone スプリン トと呼ばれる特別なミーティング(ハッカソン)で行われる。Ploneに対する追加機能はプ ロダクトで追加する。それはPloneのウェブサイトかその他のサイトで配布されている。 Plone財団は全ての著作権と商標を保持している。さらにPloneはSoftware Freedom Law Centerの評議会からの法的な後ろ盾も持っている。</p> <p>MediaWikiの"Monobook [JP]"レイアウトは部分的にPloneのスタイルシートをベー スにしている。</p> """} def afterSetUp(self): self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost('MailHost') sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # his hack allows us to get the traceback when the getting a # 500 error when using the browser. self.portal.error_log._ignored_exceptions = () def raising(self, info): import traceback traceback.print_tb(info[2]) print info[1] from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog SiteErrorLog.raising = raising transaction.commit() def beforeTearDown(self): self.portal.MailHost = self.portal._original_MailHost sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(aq_base(self.portal._original_MailHost), provided=IMailHost) def login_as_user(self, username, password): self.browser.open('http://nohost/plone/logout') self.browser.open('http://nohost/plone/login_form') self.browser.getControl(name='__ac_name').value = username self.browser.getControl(name='__ac_password').value = password self.browser.getControl(name='submit').click() def login_as_manager(self): self.login_as_user( ptc.portal_owner, ptc.default_password) def install_products(self): self.browser = Browser() fiveconfigure.debug_mode = True zcml.load_config('configure.zcml', collective.sendaspdf) zcml.load_config('tests.zcml', collective.sendaspdf) ztc.installPackage(collective.sendaspdf) self.addProfile('collective.sendaspdf:default') self.addProfile('collective.sendaspdf:tests') self.addProduct('collective.sendaspdf') def create_folder(self, parent, title): self.login_as_manager() self.browser.open('%s/createObject?type_name=Folder' % parent.absolute_url()) self.browser.getControl(name='title').value = title self.browser.getControl(name='form.button.save').click() return self.browser.url def create_page(self, language, title=None, parent=None): self.login_as_manager() if parent is None: parent = self.portal self.browser.open('%s/createObject?type_name=Document' % parent.absolute_url()) if title is None: title = 'Plone (%s)' % language self.browser.getControl(name='title').value = title self.browser.getControl(name='text').value = self.data.get(language, 'Oups ...') self.browser.getControl(name='form.button.save').click() return self.browser.url def create_image(self, img_file, img_file_type, parent=None): self.login_as_manager() if parent is None: parent = self.portal def mydir(): import sys import os.path if __name__ == '__main__': filename = sys.argv[0] else: filename = __file__ return os.path.abspath(os.path.dirname(filename)) self.browser.open('%s/createObject?type_name=Image' % parent.absolute_url()) file_control = self.browser.getControl(name='image_file') file_control.mech_control.add_file(file('%s/%s' % (mydir(), img_file)), img_file_type, img_file) self.browser.getControl(name='form.button.save').click() return self.browser.url def setup_data(self): self.install_products() for lang in self.data.keys(): self.create_page(lang) # We also add a page for which the title will contain # non-ASCII characters. # Depending on Plone version, the generated ID is not the same, # so we first generate the page with a simple title for which id # is safe, then we'll edit the title. self.cyrilic_title_page_url = self.create_page(None, 'Cyrilic title page') self.browser.open('%s/edit' % self.cyrilic_title_page_url) self.browser.getControl(name='title').value = '3цдса' self.browser.getControl(name='form.button.save').click() def get_sendaspdf_actions(self): """ Finds the links generated by send as pdf in browser contents. """ parser = SendAsPDFHtmlParser() parser.feed(self.browser.contents) return parser.get_document_actions() def list_available_controls(self, form_name, before=None, hidden=[]): """ 'before' can be used to print something before the form. That can be useful for example when the first line printed starts with a non-deterministic value as you cannot use an ellipsis. """ if before is not None: print before # Code from the community manual (page not available anymore, # sorry for the source :/ ) form = self.browser.getForm(name=form_name) # get and print all controls for ctrl in form.mech_form.controls: try: control = self.browser.getControl(name=ctrl.name) if control.name in hidden: continue print "%s: %s (%s)" % (control.name, control.value, control.type) print control.controls except: pass
class FunctionalTestCase(TestCase, ptc.FunctionalTestCase): def _setup(self): ptc.PloneTestCase._setup(self) # Replace normal mailhost with mock mailhost self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost('MailHost') sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # Make sure our mock mailhost does not give a mailhost_warning # in the overview-controlpanel. self.configure_mail_host(u'mock', '*****@*****.**') def _clear(self, call_close_hook=0): self.portal.MailHost = self.portal._original_MailHost sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(aq_base(self.portal._original_MailHost), provided=IMailHost) ptc.PloneTestCase._clear(self) def get_smtp_host(self): if IMailSchema is None: # Plone 4 return self.portal.MailHost.smtp_host else: # Plone 5.0 and higher registry = getUtility(IRegistry) mail_settings = registry.forInterface(IMailSchema, prefix='plone', check=False) return mail_settings.smtp_host def configure_mail_host(self, smtp_host, address=None): if IMailSchema is None: # Plone 4 self.portal.MailHost.smtp_host = smtp_host if address is not None: self.portal.email_from_address = address else: # Plone 5.0 and higher registry = getUtility(IRegistry) mail_settings = registry.forInterface(IMailSchema, prefix='plone', check=False) if not isinstance(smtp_host, unicode): # must be unicode smtp_host = smtp_host.decode('utf-8') mail_settings.smtp_host = smtp_host if address is not None: if isinstance(address, unicode): # must be ascii address = address.encode('utf-8') mail_settings.email_from_address = address def afterSetUp(self): """Add some extra content and do some setup. """ # We need to do this as Manager: self.setRoles(['Manager']) # Add some news items: sample_text = "<p>Have I got news for <em>you</em>!</p>" self.portal.news.invokeFactory('News Item', 'first', title="First News", text=sample_text) self.portal.news.invokeFactory('News Item', 'second', title="Second News", text=sample_text) # Set fullname and email address of test user: member = self.portal.portal_membership.getAuthenticatedMember() member.setMemberProperties({ 'fullname': 'Test User', 'email': '*****@*****.**' }) # Add extra members: self.addMember('maurits', 'Maurits van Rees', '*****@*****.**') self.addMember('reinout', 'Reinout van Rees', '*****@*****.**') # Setup test browser: try: from Testing.testbrowser import Browser Browser # pyflakes except ImportError: from Products.Five.testbrowser import Browser self.browser = Browser() self.browser.handleErrors = False self.browser.addHeader('Accept-Language', 'en-US') self.portal.error_log._ignored_exceptions = () # No more Manager: self.setRoles([]) def addMember(self, username, fullname, email): self.portal.portal_membership.addMember(username, ptc.default_password, [], []) member = self.portal.portal_membership.getMemberById(username) member.setMemberProperties({'fullname': fullname, 'email': email}) def browser_login(self, user=None): if not user: user = ptc.default_user self.browser.open(self.portal.absolute_url() + '/login_form') self.browser.getLink('Log in').click() self.browser.getControl(name='__ac_name').value = user self.browser.getControl(name='__ac_password').value = \ ptc.default_password self.browser.getControl(name='submit').click()
class TestIDFromTitle(FunctionalTestCase): """Browsertests to make sure ATImages derive their default IDs from their titles""" # TODO: Merge into TestATImageFunctional, below. def afterSetUp(self): self.userId = 'fred' self.password = '******' self.portal.acl_users.userFolderAddUser(self.userId, self.password, ['Manager'], []) self.browser = Browser() self._log_in() def _log_in(self): """Log in as someone who can add new Images.""" self.browser.open(self.portal.absolute_url()) self.browser.getLink('Log in').click() self.browser.getControl('Login Name').value = self.userId self.browser.getControl('Password').value = self.password self.browser.getControl('Log in').click() def _make_image(self, title, filename='canoneye.jpg'): """Add a new Image at the root of the Plone site.""" self.browser.open(self.portal.absolute_url() + '/createObject?type_name=Image') self.browser.getControl('Title').value = title image = self.browser.getControl(name='image_file') image.filename = filename TEST_JPEG_FILE.seek(0) image.value = TEST_JPEG_FILE self.browser.getControl('Save').click() def test_image_id_from_filename_and_title(self): # Get ID from filename: self._make_image('') self.failUnless('canoneye.jpg' in self.browser.url) # Get ID from title. # As a side effect, make sure the ID validator doesn't overzealously # deny our upload of something else called canoneye.jpg, even though # we're not going to compute its ID from its filename. self._make_image('Wonderful Image') self.failUnless('/wonderful-image' in self.browser.url) def test_image_id_from_unicode_title(self): self._make_image('', filename=u'Pictüre 1.png'.encode('utf-8')) normalized = 'Picture%201.png' self.failUnless(normalized in self.browser.url)
class FunctionalTestCase(TestCase, ptc.FunctionalTestCase): def _setup(self): ptc.PloneTestCase._setup(self) # Replace normal mailhost with mock mailhost self.portal._original_MailHost = self.portal.MailHost self.portal.MailHost = mailhost = MockMailHost('MailHost') sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(mailhost, provided=IMailHost) # Make sure our mock mailhost does not give a mailhost_warning # in the overview-controlpanel. self.configure_mail_host(u'mock', '*****@*****.**') def _clear(self, call_close_hook=0): self.portal.MailHost = self.portal._original_MailHost sm = getSiteManager(context=self.portal) sm.unregisterUtility(provided=IMailHost) sm.registerUtility(aq_base(self.portal._original_MailHost), provided=IMailHost) ptc.PloneTestCase._clear(self) def get_smtp_host(self): if IMailSchema is None: # Plone 4 return self.portal.MailHost.smtp_host else: # Plone 5.0 and higher registry = getUtility(IRegistry) mail_settings = registry.forInterface( IMailSchema, prefix='plone', check=False) return mail_settings.smtp_host def configure_mail_host(self, smtp_host, address=None): if IMailSchema is None: # Plone 4 self.portal.MailHost.smtp_host = smtp_host if address is not None: self.portal.email_from_address = address else: # Plone 5.0 and higher registry = getUtility(IRegistry) mail_settings = registry.forInterface( IMailSchema, prefix='plone', check=False) if not isinstance(smtp_host, unicode): # must be unicode smtp_host = smtp_host.decode('utf-8') mail_settings.smtp_host = smtp_host if address is not None: if isinstance(address, unicode): # must be ascii address = address.encode('utf-8') mail_settings.email_from_address = address def afterSetUp(self): """Add some extra content and do some setup. """ # We need to do this as Manager: self.setRoles(['Manager']) # Add some news items: sample_text = "<p>Have I got news for <em>you</em>!</p>" self.portal.news.invokeFactory( 'News Item', 'first', title="First News", text=sample_text) self.portal.news.invokeFactory( 'News Item', 'second', title="Second News", text=sample_text) # Set fullname and email address of test user: member = self.portal.portal_membership.getAuthenticatedMember() member.setMemberProperties({'fullname': 'Test User', 'email': '*****@*****.**'}) # Add extra members: self.addMember('maurits', 'Maurits van Rees', '*****@*****.**') self.addMember('reinout', 'Reinout van Rees', '*****@*****.**') # Setup test browser: try: from Testing.testbrowser import Browser Browser # pyflakes except ImportError: from Products.Five.testbrowser import Browser self.browser = Browser() self.browser.handleErrors = False self.browser.addHeader('Accept-Language', 'en-US') self.portal.error_log._ignored_exceptions = () # No more Manager: self.setRoles([]) def addMember(self, username, fullname, email): self.portal.portal_membership.addMember( username, ptc.default_password, [], []) member = self.portal.portal_membership.getMemberById(username) member.setMemberProperties({'fullname': fullname, 'email': email}) def browser_login(self, user=None): if not user: user = ptc.default_user self.browser.open(self.portal.absolute_url() + '/login_form') self.browser.getLink('Log in').click() self.browser.getControl(name='__ac_name').value = user self.browser.getControl(name='__ac_password').value = \ ptc.default_password self.browser.getControl(name='submit').click()