From 814b4388cee710321c8acb63315fd2ec796ffb59 Mon Sep 17 00:00:00 2001 From: Roman Kozlovskyi Date: Fri, 18 Oct 2013 00:13:23 +0300 Subject: [PATCH] Added tests, cleanup code --- quintagroup/plonetabs/browser/configure.zcml | 12 +- quintagroup/plonetabs/browser/plonetabs.py | 64 +++---- .../plonetabs/tests/test_controlpanel.py | 177 ++++++++++++++++-- travis.cfg | 1 - 4 files changed, 186 insertions(+), 68 deletions(-) diff --git a/quintagroup/plonetabs/browser/configure.zcml b/quintagroup/plonetabs/browser/configure.zcml index a510b9d..efb0399 100644 --- a/quintagroup/plonetabs/browser/configure.zcml +++ b/quintagroup/plonetabs/browser/configure.zcml @@ -1,9 +1,9 @@ - + - + - - diff --git a/quintagroup/plonetabs/browser/plonetabs.py b/quintagroup/plonetabs/browser/plonetabs.py index 60d027b..c85111d 100644 --- a/quintagroup/plonetabs/browser/plonetabs.py +++ b/quintagroup/plonetabs/browser/plonetabs.py @@ -45,11 +45,19 @@ "description": "description", "available_expr": "condition", "visible": "visible"} +GENERATED_TABS_FIELDS = { + 'disable_folder_sections': [ + _(u"Generated tabs switched on."), + _(u"Generated tabs switched off.") + ], + 'disable_nonfolderish_sections': [ + _(u"Generated tabs for items other than folders switched on."), + _(u"Generated tabs for items other than folders switched off.") + ] +} bad_id = re.compile(r'[^a-zA-Z0-9-_~,.$\(\)# @]').search -cookie_name = 'ploneTabsMode' - class PloneTabsControlPanel(): @@ -59,7 +67,6 @@ class PloneTabsControlPanel(): actionslist_template = ViewPageTemplateFile("templates/actionslist.pt") autogenerated_template = ViewPageTemplateFile("templates/autogenerated.pt") autogenerated_list = ViewPageTemplateFile("templates/autogeneratedlist.pt") - link_template = ViewPageTemplateFile("templates/changemodelink.pt") # custom templates used to update page sections sections_template = ViewPageTemplateFile("templates/sections.pt") @@ -84,13 +91,6 @@ def __call__(self): if submitted: postback = self.submitted_postback(form, errors) - mode = self.request.get(cookie_name, False) - if mode in ('plain', 'rich'): - # set cookie to remember the choice - expires = (DateTime() + 365).toZone('GMT').rfc822() - self.request.response.setCookie(cookie_name, mode, path='/', - expires=expires) - if ajaxback: self.request.response.setHeader("Content-type", "application/json") return json.dumps(ajaxback) @@ -195,19 +195,20 @@ def manage_ajax_toggleGeneratedTabs(self, form): checked = form['generated_tabs'] field = form['field'] - if not errors: + if field in GENERATED_TABS_FIELDS: if checked == 'true': self.setSiteProperties(**{field: False}) - message = self.translate(_(u"Generated tabs switched on.")) + message = self.translate(GENERATED_TABS_FIELDS[field][0]) else: self.setSiteProperties(**{field: True}) - message = self.translate(_(u"Generated tabs switched off.")) + message = self.translate(GENERATED_TABS_FIELDS[field][1]) content = self.getGeneratedTabs() resp_dict['content'] = content resp_dict['status_code'] = 200 resp_dict['status_message'] = message else: - resp_dict['status_message'] = errors + resp_dict['status_message'] = self.translate( + _("Invalid property name.")) resp_dict['status_code'] = 500 return resp_dict @@ -227,8 +228,9 @@ def manage_ajax_toggleRootsVisibility(self, form): obj_id = id[len("roottabs_"):] if obj_id not in portal.objectIds(): - errors.append( - "Object with %s id doesn't exist in portal root." % obj_id) + errors.append(self.translate( + _("Object with '${id}' id doesn't exist in portal root.", + mapping={'id': obj_id}))) checked = True if checked == 'true' else False @@ -410,25 +412,25 @@ def manage_ajax_moveAction(self, form): def manage_ajax_changeCategory(self, form): resp_dict = {} - errors = [] """Change action category to manage""" cat_name = form['category'] - # update actions list - resp_dict['actionslist'] = self.getActionsList(category=cat_name) - # update autogenerated sections - resp_dict['section'] = self.getAutoGenereatedSection(cat_name) - # and title - resp_dict['title'] = self.translate(self.getPageTitle(cat_name)) - if not errors: + if cat_name in self.portal_actions.objectIds(): + # update actions list + resp_dict['actionslist'] = self.getActionsList(category=cat_name) + # update autogenerated sections + resp_dict['section'] = self.getAutoGenereatedSection(cat_name) + # and title + resp_dict['title'] = self.translate(self.getPageTitle(cat_name)) resp_dict['status_code'] = 200 resp_dict['status_message'] = self.translate( _("Category changed successfully.")) else: resp_dict['status_code'] = 500 resp_dict['status_message'] = self.translate( - _("There was error while changed category")) + _(u"'${cat_name}' action category does not exist.", + mapping={'cat_name': cat_name})) return resp_dict @@ -1026,15 +1028,3 @@ def moveAction(self, id, cat_name, steps=0): category.moveObjectsDown([id, ], abs(steps)) return True return False - - -class PloneTabsMode(BrowserView): - - def __call__(self): - mode = self.request.get(cookie_name, False) - if mode in ('plain', 'rich'): - return mode - mode = self.request.cookies.get(cookie_name, False) - if mode in ('plain', 'rich'): - return mode - return 'rich' diff --git a/quintagroup/plonetabs/tests/test_controlpanel.py b/quintagroup/plonetabs/tests/test_controlpanel.py index b9b7474..0db6b50 100644 --- a/quintagroup/plonetabs/tests/test_controlpanel.py +++ b/quintagroup/plonetabs/tests/test_controlpanel.py @@ -27,11 +27,150 @@ def afterSetUp(self): self.tool = getToolByName(self.portal, 'portal_actions') def test_renderPanel(self): + form = self.panel.request.form response = self.panel() self.assertTrue('Portal Tabs Configuration' in response) + form['form.submitted'] = True + response = self.panel() + self.assertTrue('Portal Tabs Configuration' in response) + form['ajax_request'] = True + response = self.panel() + self.assertTrue('Portal Tabs Configuration' in response) + form['category'] = 'site_actions' + form['edit_cancel'] = 'Cancel' + form['orig_id'] = 'contact' + response = self.panel() + self.assertTrue('"status_code": 200' in response) + + def test_ajax_toggleRootsVisibility(self): + form = { + 'orig_id': 'roottabs_invalid', + 'roottabs_visible': 'Visibillity', + 'visibility': 'false' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], ["Object with 'invalid' id doesn't exist in portal root."]) + form['orig_id'] = 'roottabs_news' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "'news' object was excluded from navigation.") + form['visibility'] = 'true' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "'news' object was included into navigation.") + + def test_ajax_toggleGeneratedTabs(self): + form = { + 'field': 'invalid_property', + 'generated_tabs': 'false' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], "Invalid property name.") + form = { + 'field': 'disable_folder_sections', + 'generated_tabs': 'false' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "Generated tabs switched off.") + form['generated_tabs'] = 'true' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "Generated tabs switched on.") + form = { + 'field': 'disable_nonfolderish_sections', + 'generated_tabs': 'false' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "Generated tabs for items other than folders switched off.") + form['generated_tabs'] = 'true' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], "Generated tabs for items other than folders switched on.") + + def test_ajax_changeCategory(self): + form = { + 'category': 'site_actions0', + 'category_change': 'Change' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], u"'site_actions0' action category does not exist.") + form['category'] = 'site_actions' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"Category changed successfully.") + + def test_ajax_cancelEditting(self): + form = { + 'category': 'site_actions', + 'edit_cancel': 'Cancel', + 'orig_id': 'contact0', + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], [u"No 'contact0' action in 'site_actions' category."]) + form['orig_id'] = 'contact' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"Changes discarded.") + + def test_ajax_saveAction(self): + form = { + 'available_expr_contact': '', + 'category': 'site_actions', + 'description_contact': '', + 'edit_save': 'Save', + 'icon_expr_contact': '', + 'id_contact': 'sitemap', + 'orig_id': 'contact', + 'title_contact': 'Contact', + 'url_expr_contact': 'string:${globals_view/navigationRootUrl}/contact-info', + 'visible_contact': 1 + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], u"Please correct the indicated errors.") + self.assertEquals(response['content'], {'id': u"The id 'sitemap' is invalid - it is already in use."}) + form['id_contact'] = 'contact' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"'contact' action successfully updated.") + + def test_ajax_deleteAction(self): + form = { + 'category': 'site_actions', + 'edit_delete': 'Delete', + 'orig_id': 'contact0' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], [u"No 'contact0' action in 'site_actions' category."]) + form['orig_id'] = 'contact' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"'contact' action deleted.") + + def test_ajax_moveAction(self): + form = { + 'actions': 'tabslist_sitemap&tabslist_accessibility&tabslist_contact&tabslist_plone_setup', + 'category': 'site_actions', + 'edit_moveact': 'Move Action' + } + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], u"There was error while sorting, or list not changed") + form['actions'] = 'tabslist_contact&tabslist_sitemap&tabslist_accessibility&tabslist_plone_setup' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"Actions successfully sorted.") def test_ajax_addAction(self): form = { + 'add_add': 'Add', 'available_expr': '', 'category': 'site_actions', 'description': '', @@ -41,39 +180,37 @@ def test_ajax_addAction(self): 'url_expr': '', 'visible': 1, } - response = self.panel.manage_ajax_addAction(form) - self.assertEquals(response, { - 'content': { - 'id': u'Empty or invalid id specified', - 'title': u'Empty or invalid title specified' - }, - 'status_code': 500, - 'status_message': u'Please correct the indicated errors.' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], u'Please correct the indicated errors.') + self.assertEquals(response['content'], { + 'id': u'Empty or invalid id specified', + 'title': u'Empty or invalid title specified' }) form['id'] = 'action_id' form['title'] = 'action title' - response = self.panel.manage_ajax_addAction(form) + response = self.panel.ajax_postback(form) self.assertEquals(response['status_code'], 200) self.assertEquals(response['status_message'], u"'action_id' action successfully added.") def test_ajax_toggleActionsVisibility(self): form = { 'category': 'site_actions', - 'orig_id': 'contact', + 'orig_id': 'contact0', 'tabslist_visible': 'Set visibillity', 'visibility': 'false' } - response = self.panel.manage_ajax_toggleActionsVisibility(form) - self.assertEquals(response, { - 'status_code': 200, - 'status_message': u"'contact' action is now invisible." - }) + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 500) + self.assertEquals(response['status_message'], [u"No 'contact0' action in 'site_actions' category."]) + form['orig_id'] = 'contact' + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"'contact' action is now invisible.") form['visibility'] = 'true' - response = self.panel.manage_ajax_toggleActionsVisibility(form) - self.assertEquals(response, { - 'status_code': 200, - 'status_message': u"'contact' action is now visible." - }) + response = self.panel.ajax_postback(form) + self.assertEquals(response['status_code'], 200) + self.assertEquals(response['status_message'], u"'contact' action is now visible.") def test_redirect(self): response = self.portal.REQUEST.RESPONSE diff --git a/travis.cfg b/travis.cfg index dbe27f8..2c40cb5 100644 --- a/travis.cfg +++ b/travis.cfg @@ -3,4 +3,3 @@ extends = https://raw.github.com/collective/buildout.plonetest/master/travis-4.x package-name = quintagroup.plonetabs package-extras = [tests] parts += createcoverage coverage-sh -package-min-coverage = 75